annotate usr/src/uts/common/io/sata/impl/sata.c @ 11853:2adca8ef2c23

6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt 6443107 sata framework: sata commands processing initiated by scsi target driver cannot use KM_SLEEP flag
author Phi Tran <Phi.Tran@Sun.COM>
date Thu, 04 Mar 2010 10:02:10 -0800
parents 033fba349b6c
children f06d538b0f01
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
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 /*
11598
e9303ae80b5d 6893171 Errors with USCSI preventing users from accessing cdda2wav
andrew.rutz@sun.com
parents: 11401
diff changeset
23 * Copyright 2010 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>
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
53 #include <sys/sata/sata_blacklist.h>
11222
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
54 #include <sys/sata/sata_satl.h>
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
55
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
56 #include <sys/scsi/impl/spc3_types.h>
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
57
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
58 /* Debug flags - defined in sata.h */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
59 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
60 int sata_msg = 0;
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
61
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
62 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
63 * Flags enabling selected SATA HBA framework functionality
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
64 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
65 #define SATA_ENABLE_QUEUING 1
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
66 #define SATA_ENABLE_NCQ 2
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
67 #define SATA_ENABLE_PROCESS_EVENTS 4
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
68 #define SATA_ENABLE_PMULT_FBS 8 /* FIS-Based Switching */
2553
624f674f2ad8 6430966 SATA NCQ support is needed in SATA framework and hba drivers
ls24207
parents: 2539
diff changeset
69 int sata_func_enable =
624f674f2ad8 6430966 SATA NCQ support is needed in SATA framework and hba drivers
ls24207
parents: 2539
diff changeset
70 SATA_ENABLE_PROCESS_EVENTS | SATA_ENABLE_QUEUING | SATA_ENABLE_NCQ;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
71
5014
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 * 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
74 * Note:minimum queue depth is 1
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
75 */
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
76 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
77
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 * 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
80 * 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
81 * 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
82 * if queueing is enabled.
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
83 */
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
84 static int sata_current_max_qdepth;
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
85
5832
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
86 /*
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
87 * Global variable determining the default behavior after device hotpluggin.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
88 * 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
89 * IOCTL request (AP_CONFIGURE).
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
90 * If zero, hotplugged device is identified, but not onlined.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
91 * 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
92 * in device onlining regardless of the flag setting
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
93 */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
94 int sata_auto_online = 0;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
95
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
96 #ifdef SATA_DEBUG
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
97
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
98 #define SATA_LOG_D(args) sata_log args
2539
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
99 uint64_t mbuf_count = 0;
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
100 uint64_t mbuffail_count = 0;
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
101
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
102 sata_atapi_cmd_t sata_atapi_trace[64];
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
103 uint32_t sata_atapi_trace_index = 0;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
104 int sata_atapi_trace_save = 1;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
105 static void sata_save_atapi_trace(sata_pkt_txlate_t *, int);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
106 #define SATAATAPITRACE(spx, count) if (sata_atapi_trace_save) \
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
107 sata_save_atapi_trace(spx, count);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
108
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
109 #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
110 #define SATA_LOG_D(args) sata_trace_log args
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
111 #define SATAATAPITRACE(spx, count)
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
112 #endif
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
113
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
114 #if 0
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
115 static void
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
116 sata_test_atapi_packet_command(sata_hba_inst_t *, int);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
117 #endif
6539
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 #ifdef SATA_INJECT_FAULTS
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
120
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
121 #define SATA_INJECT_PKT_FAULT 1
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
122 uint32_t sata_inject_fault = 0;
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
123
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
124 uint32_t sata_inject_fault_count = 0;
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
125 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
126 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
127 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
128 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
129 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
130
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
131 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
132
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
133 #endif
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
134
4876
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
135 #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
136
10663
4d59e1faf654 6881565 sata hba interfaces need to keep backward compatibility
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10427
diff changeset
137 static char sata_rev_tag[] = {"1.46"};
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
138
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
139 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
140 * SATA cb_ops functions
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 static int sata_hba_open(dev_t *, int, int, cred_t *);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
143 static int sata_hba_close(dev_t, int, int, cred_t *);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
144 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
145
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
146 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
147 * SCSA required entry points
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
148 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
149 static int sata_scsi_tgt_init(dev_info_t *, dev_info_t *,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
150 scsi_hba_tran_t *, struct scsi_device *);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
151 static int sata_scsi_tgt_probe(struct scsi_device *,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
152 int (*callback)(void));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
153 static void sata_scsi_tgt_free(dev_info_t *, dev_info_t *,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
154 scsi_hba_tran_t *, struct scsi_device *);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
155 static int sata_scsi_start(struct scsi_address *, struct scsi_pkt *);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
156 static int sata_scsi_abort(struct scsi_address *, struct scsi_pkt *);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
157 static int sata_scsi_reset(struct scsi_address *, int);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
158 static int sata_scsi_getcap(struct scsi_address *, char *, int);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
159 static int sata_scsi_setcap(struct scsi_address *, char *, int, int);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
160 static struct scsi_pkt *sata_scsi_init_pkt(struct scsi_address *,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
161 struct scsi_pkt *, struct buf *, int, int, int, int, int (*)(caddr_t),
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
162 caddr_t);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
163 static void sata_scsi_destroy_pkt(struct scsi_address *, struct scsi_pkt *);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
164 static void sata_scsi_dmafree(struct scsi_address *, struct scsi_pkt *);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
165 static void sata_scsi_sync_pkt(struct scsi_address *, struct scsi_pkt *);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
166
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
167 /*
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
168 * 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
169 */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
170
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
171 /* Event processing functions */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
172 static void sata_event_daemon(void *);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
173 static void sata_event_thread_control(int);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
174 static void sata_process_controller_events(sata_hba_inst_t *sata_hba_inst);
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
175 static void sata_process_pmult_events(sata_hba_inst_t *, uint8_t);
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
176 static void sata_process_device_reset(sata_hba_inst_t *, sata_address_t *);
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
177 static void sata_process_pmdevice_reset(sata_hba_inst_t *, sata_address_t *);
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
178 static void sata_process_port_failed_event(sata_hba_inst_t *,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
179 sata_address_t *);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
180 static void sata_process_port_link_events(sata_hba_inst_t *,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
181 sata_address_t *);
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
182 static void sata_process_pmport_link_events(sata_hba_inst_t *,
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
183 sata_address_t *);
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
184 static void sata_process_device_detached(sata_hba_inst_t *, sata_address_t *);
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
185 static void sata_process_pmdevice_detached(sata_hba_inst_t *,
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
186 sata_address_t *);
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
187 static void sata_process_device_attached(sata_hba_inst_t *, sata_address_t *);
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
188 static void sata_process_pmdevice_attached(sata_hba_inst_t *,
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
189 sata_address_t *);
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
190 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
191 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
192 static void sata_process_target_node_cleanup(sata_hba_inst_t *,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
193 sata_address_t *);
5832
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
194 static void sata_process_device_autoonline(sata_hba_inst_t *,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
195 sata_address_t *saddr);
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
196
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
197 /*
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
198 * Local translation functions
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
199 */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
200 static int sata_txlt_inquiry(sata_pkt_txlate_t *);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
201 static int sata_txlt_test_unit_ready(sata_pkt_txlate_t *);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
202 static int sata_txlt_start_stop_unit(sata_pkt_txlate_t *);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
203 static int sata_txlt_read_capacity(sata_pkt_txlate_t *);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
204 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
205 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
206 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
207 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
208 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
209 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
210 static int sata_txlt_mode_select(sata_pkt_txlate_t *);
11222
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
211 static int sata_txlt_ata_pass_thru(sata_pkt_txlate_t *);
10131
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
212 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
213 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
214 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
215
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
216 static int sata_hba_start(sata_pkt_txlate_t *, int *);
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
217 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
218 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
219 static int sata_txlt_lba_out_of_range(sata_pkt_txlate_t *);
11222
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
220 static int sata_txlt_ata_pass_thru_illegal_cmd(sata_pkt_txlate_t *);
10131
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
221 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
222 static void sata_txlt_nodata_cmd_completion(sata_pkt_t *);
11222
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
223 static void sata_txlt_apt_completion(sata_pkt_t *sata_pkt);
10131
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
224 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
225 static int sata_emul_rw_completion(sata_pkt_txlate_t *);
11222
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
226 static void sata_fill_ata_return_desc(sata_pkt_t *, uint8_t, uint8_t,
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
227 uint8_t);
10131
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
228 static struct scsi_extended_sense *sata_immediate_error_response(
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
229 sata_pkt_txlate_t *, int);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
230 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
231
10131
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
232 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
233 static void sata_txlt_atapi_completion(sata_pkt_t *);
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
234
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
235 /*
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
236 * Local functions for ioctl
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
237 */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
238 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
239 static void sata_cfgadm_state(sata_hba_inst_t *, int32_t,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
240 devctl_ap_state_t *);
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
241 static dev_info_t *sata_get_target_dip(dev_info_t *, uint8_t, uint8_t);
5832
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
242 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
243 static dev_info_t *sata_devt_to_devinfo(dev_t);
5832
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
244 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
245 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
246 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
247 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
248 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
249 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
250 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
251 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
252 static int sata_ioctl_reset_all(sata_hba_inst_t *);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
253 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
254 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
255 sata_ioctl_data_t *, int mode);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
256 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
257 sata_ioctl_data_t *, int mode);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
258 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
259 sata_ioctl_data_t *, int mode);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
260 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
261 sata_ioctl_data_t *, int mode);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
262 static int sata_ioctl_get_serialnumber_info(sata_hba_inst_t *,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
263 sata_device_t *, sata_ioctl_data_t *, int mode);
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
264
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
265 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
266 * Local functions
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
267 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
268 static void sata_remove_hba_instance(dev_info_t *);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
269 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
270 static void sata_probe_ports(sata_hba_inst_t *);
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
271 static void sata_probe_pmports(sata_hba_inst_t *, uint8_t);
2960
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
272 static int sata_reprobe_port(sata_hba_inst_t *, sata_device_t *, int);
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
273 static int sata_reprobe_pmult(sata_hba_inst_t *, sata_device_t *, int);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
274 static int sata_reprobe_pmport(sata_hba_inst_t *, sata_device_t *, int);
10663
4d59e1faf654 6881565 sata hba interfaces need to keep backward compatibility
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10427
diff changeset
275 static int sata_alloc_pmult(sata_hba_inst_t *, sata_device_t *);
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
276 static void sata_free_pmult(sata_hba_inst_t *, sata_device_t *);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
277 static int sata_add_device(dev_info_t *, sata_hba_inst_t *, sata_device_t *);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
278 static int sata_offline_device(sata_hba_inst_t *, sata_device_t *,
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
279 sata_drive_info_t *);
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
280 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
281 sata_address_t *);
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
282 static void sata_remove_target_node(sata_hba_inst_t *,
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
283 sata_address_t *);
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
284 static int sata_validate_scsi_address(sata_hba_inst_t *,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
285 struct scsi_address *, sata_device_t *);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
286 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
287 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
288 static void sata_pkt_free(sata_pkt_txlate_t *);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
289 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
290 caddr_t, ddi_dma_attr_t *);
7152
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
291 static void sata_common_free_dma_rsrcs(sata_pkt_txlate_t *);
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
292 static int sata_probe_device(sata_hba_inst_t *, sata_device_t *);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
293 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
294 sata_device_t *);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
295 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
296 static void sata_reidentify_device(sata_pkt_txlate_t *);
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
297 static struct buf *sata_alloc_local_buffer(sata_pkt_txlate_t *, int);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
298 static void sata_free_local_buffer(sata_pkt_txlate_t *);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
299 static uint64_t sata_check_capacity(sata_drive_info_t *);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
300 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
301 ddi_dma_attr_t *);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
302 static int sata_fetch_device_identify_data(sata_hba_inst_t *,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
303 sata_drive_info_t *);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
304 static void sata_update_port_info(sata_hba_inst_t *, sata_device_t *);
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
305 static void sata_update_pmport_info(sata_hba_inst_t *, sata_device_t *);
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
306 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
307 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
308 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
309 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
310 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
311 sata_drive_info_t *, int flag);
2734
1a2f23099c2a 6428449 sata disks have read cache disabled after being hot-plugged
pawelw
parents: 2593
diff changeset
312 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
313 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
314 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
315 uint8_t *);
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
316 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
317 struct scsi_inquiry *);
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
318 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
319 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
320 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
321 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
322 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
323 static int sata_mode_select_page_8(sata_pkt_txlate_t *,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
324 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
325 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
326 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
327 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
328 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
329 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
330 struct mode_acoustic_management *, int, int *, int *, int *);
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
331
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
332 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
333 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
334 sata_hba_inst_t *);
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
335 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
336 sata_hba_inst_t *);
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
337 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
338 sata_hba_inst_t *);
10131
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
339 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
340 sata_pkt_txlate_t *);
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
341
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
342 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
343 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
344 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
345 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
346
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
347 static void sata_save_drive_settings(sata_drive_info_t *);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
348 static void sata_show_drive_info(sata_hba_inst_t *, sata_drive_info_t *);
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
349 static void sata_show_pmult_info(sata_hba_inst_t *, sata_device_t *);
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
350 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
351 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
352 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
353 sata_drive_info_t *);
3935
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
354 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
355 struct smart_data *);
3935
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
356 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
357 sata_drive_info_t *,
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
358 struct smart_selftest_log *);
3935
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
359 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
360 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
361 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
362 uint8_t *, uint8_t, uint8_t);
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
363 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
364 struct read_log_ext_directory *);
1529
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
365 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
366 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
367 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
368 struct scsi_extended_sense *);
3935
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
369 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
370 static boolean_t sata_check_device_removed(dev_info_t *);
5832
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
371 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
372 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
373 sata_drive_info_t *);
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
374 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
375 sata_drive_info_t *);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
376 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
377 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
378 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
379 static int sata_check_modser(char *, int);
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
380
3935
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
381
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
382
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
383 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
384 * SATA Framework will ignore SATA HBA driver cb_ops structure and
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
385 * register following one with SCSA framework.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
386 * Open & close are provided, so scsi framework will not use its own
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
387 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
388 static struct cb_ops sata_cb_ops = {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
389 sata_hba_open, /* open */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
390 sata_hba_close, /* close */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
391 nodev, /* strategy */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
392 nodev, /* print */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
393 nodev, /* dump */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
394 nodev, /* read */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
395 nodev, /* write */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
396 sata_hba_ioctl, /* ioctl */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
397 nodev, /* devmap */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
398 nodev, /* mmap */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
399 nodev, /* segmap */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
400 nochpoll, /* chpoll */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
401 ddi_prop_op, /* cb_prop_op */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
402 0, /* streamtab */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
403 D_NEW | D_MP, /* cb_flag */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
404 CB_REV, /* rev */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
405 nodev, /* aread */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
406 nodev /* awrite */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
407 };
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
408
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
409
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
410 extern struct mod_ops mod_miscops;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
411 extern uchar_t scsi_cdb_size[];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
412
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
413 static struct modlmisc modlmisc = {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
414 &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
415 "SATA Module" /* module name */
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
416 };
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
417
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
418
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
419 static struct modlinkage modlinkage = {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
420 MODREV_1,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
421 (void *)&modlmisc,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
422 NULL
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
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
425 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
426 * 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
427 * i.e. when scsi_pkt has not timeout specified.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
428 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
429 static int sata_default_pkt_time = 60; /* 60 seconds */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
430
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
431 /*
2539
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
432 * Intermediate buffer device access attributes - they are required,
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
433 * but not necessarily used.
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
434 */
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
435 static ddi_device_acc_attr_t sata_acc_attr = {
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
436 DDI_DEVICE_ATTR_V0,
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
437 DDI_STRUCTURE_LE_ACC,
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
438 DDI_STRICTORDER_ACC
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
439 };
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
440
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
441
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
442 /*
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
443 * Mutexes protecting structures in multithreaded operations.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
444 * Because events are relatively rare, a single global mutex protecting
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
445 * data structures should be sufficient. To increase performance, add
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
446 * 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
447 * common data structures.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
448 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
449 static kmutex_t sata_mutex; /* protects sata_hba_list */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
450 static kmutex_t sata_log_mutex; /* protects log */
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 char sata_log_buf[256];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
453
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
454 /*
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
455 * 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
456 */
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
457 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
458 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
459 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
460 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
461 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
462
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
463 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
464
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
465 /* Default write cache setting for SATA hard disks */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
466 int sata_write_cache = 1; /* enabled */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
467
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
468 /* 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
469 int sata_atapicdvd_write_cache = 1; /* enabled */
1781
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
470
8010
95c42a8a213e 6703522 ahci driver needs to support SATA tape
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 7954
diff changeset
471 /* 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
472 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
473
8317
249d7b80428e 6767262 ahci driver should support Dell PowerVault RD1000 backup device
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 8168
diff changeset
474 /* 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
475 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
476
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
477 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
478 * Linked list of HBA instances
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
479 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
480 static sata_hba_inst_t *sata_hba_list = NULL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
481 static sata_hba_inst_t *sata_hba_list_tail = NULL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
482 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
483 * 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
484 * structure and in sata soft state.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
485 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
486
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
487 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
488 * Event daemon related variables
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
489 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
490 static kmutex_t sata_event_mutex;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
491 static kcondvar_t sata_event_cv;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
492 static kthread_t *sata_event_thread = NULL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
493 static int sata_event_thread_terminate = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
494 static int sata_event_pending = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
495 static int sata_event_thread_active = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
496 extern pri_t minclsyspri;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
497
2553
624f674f2ad8 6430966 SATA NCQ support is needed in SATA framework and hba drivers
ls24207
parents: 2539
diff changeset
498 /*
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
499 * NCQ error recovery command
2553
624f674f2ad8 6430966 SATA NCQ support is needed in SATA framework and hba drivers
ls24207
parents: 2539
diff changeset
500 */
624f674f2ad8 6430966 SATA NCQ support is needed in SATA framework and hba drivers
ls24207
parents: 2539
diff changeset
501 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
502 SATA_CMD_REV,
624f674f2ad8 6430966 SATA NCQ support is needed in SATA framework and hba drivers
ls24207
parents: 2539
diff changeset
503 NULL,
624f674f2ad8 6430966 SATA NCQ support is needed in SATA framework and hba drivers
ls24207
parents: 2539
diff changeset
504 {
624f674f2ad8 6430966 SATA NCQ support is needed in SATA framework and hba drivers
ls24207
parents: 2539
diff changeset
505 SATA_DIR_READ
624f674f2ad8 6430966 SATA NCQ support is needed in SATA framework and hba drivers
ls24207
parents: 2539
diff changeset
506 },
624f674f2ad8 6430966 SATA NCQ support is needed in SATA framework and hba drivers
ls24207
parents: 2539
diff changeset
507 ATA_ADDR_LBA48,
624f674f2ad8 6430966 SATA NCQ support is needed in SATA framework and hba drivers
ls24207
parents: 2539
diff changeset
508 0,
624f674f2ad8 6430966 SATA NCQ support is needed in SATA framework and hba drivers
ls24207
parents: 2539
diff changeset
509 0,
624f674f2ad8 6430966 SATA NCQ support is needed in SATA framework and hba drivers
ls24207
parents: 2539
diff changeset
510 0,
624f674f2ad8 6430966 SATA NCQ support is needed in SATA framework and hba drivers
ls24207
parents: 2539
diff changeset
511 0,
624f674f2ad8 6430966 SATA NCQ support is needed in SATA framework and hba drivers
ls24207
parents: 2539
diff changeset
512 0,
624f674f2ad8 6430966 SATA NCQ support is needed in SATA framework and hba drivers
ls24207
parents: 2539
diff changeset
513 1,
624f674f2ad8 6430966 SATA NCQ support is needed in SATA framework and hba drivers
ls24207
parents: 2539
diff changeset
514 READ_LOG_EXT_NCQ_ERROR_RECOVERY,
624f674f2ad8 6430966 SATA NCQ support is needed in SATA framework and hba drivers
ls24207
parents: 2539
diff changeset
515 0,
624f674f2ad8 6430966 SATA NCQ support is needed in SATA framework and hba drivers
ls24207
parents: 2539
diff changeset
516 0,
624f674f2ad8 6430966 SATA NCQ support is needed in SATA framework and hba drivers
ls24207
parents: 2539
diff changeset
517 0,
624f674f2ad8 6430966 SATA NCQ support is needed in SATA framework and hba drivers
ls24207
parents: 2539
diff changeset
518 SATAC_READ_LOG_EXT,
624f674f2ad8 6430966 SATA NCQ support is needed in SATA framework and hba drivers
ls24207
parents: 2539
diff changeset
519 0,
624f674f2ad8 6430966 SATA NCQ support is needed in SATA framework and hba drivers
ls24207
parents: 2539
diff changeset
520 0,
624f674f2ad8 6430966 SATA NCQ support is needed in SATA framework and hba drivers
ls24207
parents: 2539
diff changeset
521 0,
624f674f2ad8 6430966 SATA NCQ support is needed in SATA framework and hba drivers
ls24207
parents: 2539
diff changeset
522 };
624f674f2ad8 6430966 SATA NCQ support is needed in SATA framework and hba drivers
ls24207
parents: 2539
diff changeset
523
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
524 /*
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
525 * ATAPI error recovery CDB
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
526 */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
527 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
528 SCMD_REQUEST_SENSE,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
529 0, /* Only fixed RQ format is supported */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
530 0,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
531 0,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
532 SATA_ATAPI_MIN_RQSENSE_LEN, /* Less data may be returned */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
533 0
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
534 };
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
535
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
536
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
537 /* Warlock directives */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
538
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
539 _NOTE(SCHEME_PROTECTS_DATA("No Mutex Needed", scsi_hba_tran))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
540 _NOTE(SCHEME_PROTECTS_DATA("No Mutex Needed", scsi_device))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
541 _NOTE(SCHEME_PROTECTS_DATA("No Mutex Needed", dev_ops))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
542 _NOTE(SCHEME_PROTECTS_DATA("No Mutex Needed", scsi_extended_sense))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
543 _NOTE(SCHEME_PROTECTS_DATA("No Mutex Needed", scsi_arq_status))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
544 _NOTE(SCHEME_PROTECTS_DATA("No Mutex Needed", ddi_dma_attr))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
545 _NOTE(SCHEME_PROTECTS_DATA("No Mutex Needed", ddi_dma_cookie_t))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
546 _NOTE(SCHEME_PROTECTS_DATA("No Mutex Needed", devctl_ap_state))
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
547 _NOTE(SCHEME_PROTECTS_DATA("No Mutex Needed", dev_info::devi_state))
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
548 _NOTE(MUTEX_PROTECTS_DATA(sata_mutex, sata_hba_list))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
549 _NOTE(DATA_READABLE_WITHOUT_LOCK(sata_hba_list))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
550 _NOTE(MUTEX_PROTECTS_DATA(sata_mutex, sata_hba_inst::satahba_next))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
551 _NOTE(MUTEX_PROTECTS_DATA(sata_mutex, sata_hba_inst::satahba_prev))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
552 _NOTE(SCHEME_PROTECTS_DATA("No Mutex Needed", \
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
553 sata_hba_inst::satahba_scsi_tran))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
554 _NOTE(SCHEME_PROTECTS_DATA("No Mutex Needed", sata_hba_inst::satahba_tran))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
555 _NOTE(SCHEME_PROTECTS_DATA("No Mutex Needed", sata_hba_inst::satahba_dip))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
556 _NOTE(SCHEME_PROTECTS_DATA("Scheme", sata_hba_inst::satahba_attached))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
557 _NOTE(DATA_READABLE_WITHOUT_LOCK(sata_hba_inst::satahba_dev_port))
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
558 _NOTE(MUTEX_PROTECTS_DATA(sata_hba_inst::satahba_mutex,
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
559 sata_hba_inst::satahba_event_flags))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
560 _NOTE(MUTEX_PROTECTS_DATA(sata_cport_info::cport_mutex, \
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
561 sata_cport_info::cport_devp))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
562 _NOTE(DATA_READABLE_WITHOUT_LOCK(sata_cport_info::cport_devp))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
563 _NOTE(SCHEME_PROTECTS_DATA("Scheme", sata_cport_info::cport_addr))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
564 _NOTE(MUTEX_PROTECTS_DATA(sata_cport_info::cport_mutex, \
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
565 sata_cport_info::cport_dev_type))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
566 _NOTE(DATA_READABLE_WITHOUT_LOCK(sata_cport_info::cport_dev_type))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
567 _NOTE(MUTEX_PROTECTS_DATA(sata_cport_info::cport_mutex, \
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
568 sata_cport_info::cport_state))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
569 _NOTE(DATA_READABLE_WITHOUT_LOCK(sata_cport_info::cport_state))
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
570 _NOTE(MUTEX_PROTECTS_DATA(sata_pmport_info::pmport_mutex, \
5832
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
571 sata_pmport_info::pmport_state))
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
572 _NOTE(DATA_READABLE_WITHOUT_LOCK(sata_pmport_info::pmport_state))
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
573 _NOTE(MUTEX_PROTECTS_DATA(sata_pmport_info::pmport_mutex, \
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
574 sata_pmport_info::pmport_dev_type))
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
575 _NOTE(DATA_READABLE_WITHOUT_LOCK(sata_pmport_info::pmport_dev_type))
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
576 _NOTE(MUTEX_PROTECTS_DATA(sata_pmport_info::pmport_mutex, \
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
577 sata_pmport_info::pmport_sata_drive))
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
578 _NOTE(MUTEX_PROTECTS_DATA(sata_pmport_info::pmport_mutex, \
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
579 sata_pmport_info::pmport_tgtnode_clean))
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
580 _NOTE(MUTEX_PROTECTS_DATA(sata_pmport_info::pmport_mutex, \
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
581 sata_pmport_info::pmport_event_flags))
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
582 _NOTE(DATA_READABLE_WITHOUT_LOCK(sata_pmport_info::pmport_sata_drive))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
583 _NOTE(DATA_READABLE_WITHOUT_LOCK(sata_pmult_info::pmult_dev_port))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
584 _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
585 #ifdef SATA_DEBUG
624f674f2ad8 6430966 SATA NCQ support is needed in SATA framework and hba drivers
ls24207
parents: 2539
diff changeset
586 _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
587 _NOTE(SCHEME_PROTECTS_DATA("No Mutex Needed", mbuffail_count))
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
588 _NOTE(SCHEME_PROTECTS_DATA("No Mutex Needed", sata_atapi_trace))
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
589 _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
590 #endif
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
591
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
592 /* End of warlock directives */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
593
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
594 /* ************** loadable module configuration functions ************** */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
595
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
596 int
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
597 _init()
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 rval;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
600
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
601 mutex_init(&sata_mutex, NULL, MUTEX_DRIVER, NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
602 mutex_init(&sata_event_mutex, NULL, MUTEX_DRIVER, NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
603 mutex_init(&sata_log_mutex, NULL, MUTEX_DRIVER, NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
604 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
605 sata_trace_rbuf_alloc();
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
606 if ((rval = mod_install(&modlinkage)) != 0) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
607 #ifdef SATA_DEBUG
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
608 cmn_err(CE_WARN, "sata: _init: mod_install failed\n");
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
609 #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
610 sata_trace_rbuf_free();
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
611 mutex_destroy(&sata_log_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
612 cv_destroy(&sata_event_cv);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
613 mutex_destroy(&sata_event_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
614 mutex_destroy(&sata_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
615 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
616 return (rval);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
617 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
618
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
619 int
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
620 _fini()
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
621 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
622 int rval;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
623
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
624 if ((rval = mod_remove(&modlinkage)) != 0)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
625 return (rval);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
626
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
627 sata_trace_rbuf_free();
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
628 mutex_destroy(&sata_log_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
629 cv_destroy(&sata_event_cv);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
630 mutex_destroy(&sata_event_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
631 mutex_destroy(&sata_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
632 return (rval);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
633 }
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 int
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
636 _info(struct modinfo *modinfop)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
637 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
638 return (mod_info(&modlinkage, modinfop));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
639 }
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
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
643 /* ********************* SATA HBA entry points ********************* */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
644
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
645
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
646 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
647 * Called by SATA HBA from _init().
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
648 * Registers HBA driver instance/sata framework pair with scsi framework, by
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
649 * calling scsi_hba_init().
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
650 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
651 * 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
652 * instead. SATA HBA framework cb_ops pointer overwrites SATA HBA driver
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
653 * cb_ops pointer in SATA HBA driver dev_ops structure.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
654 * 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
655 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
656 * 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
657 * driver.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
658 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
659 int
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
660 sata_hba_init(struct modlinkage *modlp)
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 int rval;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
663 struct dev_ops *hba_ops;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
664
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
665 SATADBG1(SATA_DBG_HBA_IF, NULL,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
666 "sata_hba_init: name %s \n",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
667 ((struct modldrv *)(modlp->ml_linkage[0]))->drv_linkinfo);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
668 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
669 * Fill-up cb_ops and dev_ops when necessary
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
670 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
671 hba_ops = ((struct modldrv *)(modlp->ml_linkage[0]))->drv_dev_ops;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
672 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
673 * Provide pointer to SATA dev_ops
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
674 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
675 hba_ops->devo_cb_ops = &sata_cb_ops;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
676
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
677 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
678 * Register SATA HBA with SCSI framework
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
679 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
680 if ((rval = scsi_hba_init(modlp)) != 0) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
681 SATADBG1(SATA_DBG_HBA_IF, NULL,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
682 "sata_hba_init: scsi hba init failed\n", NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
683 return (rval);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
684 }
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 return (0);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
687 }
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
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
690 /* HBA attach stages */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
691 #define HBA_ATTACH_STAGE_SATA_HBA_INST 1
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
692 #define HBA_ATTACH_STAGE_SCSI_ATTACHED 2
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
693 #define HBA_ATTACH_STAGE_SETUP 4
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
694 #define HBA_ATTACH_STAGE_LINKED 8
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
695
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
696
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 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
699 * 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
700 * the HBA.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
701 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
702 * For DDI_ATTACH command:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
703 * sata_hba_inst structure is allocated here and initialized with pointers to
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
704 * SATA framework implementation of required scsi tran functions.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
705 * 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
706 * to the soft structure (sata_hba_inst) allocated by SATA framework for
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
707 * SATA HBA instance related data.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
708 * 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
709 * store a pointer to per-HBA-instance of sata_hba_inst structure.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
710 * The sata_hba_inst structure is cross-linked to scsi tran structure.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
711 * 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
712 * 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
713 * linked together into the list, pointed to by sata_hba_list.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
714 * On the first HBA instance attach the sata event thread is initialized.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
715 * 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
716 * 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
717 * 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
718 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
719 * DDI_SUCCESS is returned when attachment process is successful,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
720 * DDI_FAILURE is returned otherwise.
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 * For DDI_RESUME command:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
723 * Not implemented at this time (postponed until phase 2 of the development).
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 int
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
726 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
727 ddi_attach_cmd_t cmd)
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 sata_hba_inst_t *sata_hba_inst;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
730 scsi_hba_tran_t *scsi_tran = NULL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
731 int hba_attach_state = 0;
1781
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
732 char taskq_name[MAXPATHLEN];
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
733
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
734 SATADBG3(SATA_DBG_HBA_IF, NULL,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
735 "sata_hba_attach: node %s (%s%d)\n",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
736 ddi_node_name(dip), ddi_driver_name(dip),
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
737 ddi_get_instance(dip));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
738
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
739 if (cmd == DDI_RESUME) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
740 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
741 * Postponed until phase 2 of the development
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
742 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
743 return (DDI_FAILURE);
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
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
746 if (cmd != DDI_ATTACH) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
747 return (DDI_FAILURE);
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
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
750 /* cmd == DDI_ATTACH */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
751
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
752 if (sata_validate_sata_hba_tran(dip, sata_tran) != SATA_SUCCESS) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
753 SATA_LOG_D((NULL, CE_WARN,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
754 "sata_hba_attach: invalid sata_hba_tran"));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
755 return (DDI_FAILURE);
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 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
758 * Allocate and initialize SCSI tran structure.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
759 * SATA copy of tran_bus_config is provided to create port nodes.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
760 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
761 scsi_tran = scsi_hba_tran_alloc(dip, SCSI_HBA_CANSLEEP);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
762 if (scsi_tran == NULL)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
763 return (DDI_FAILURE);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
764 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
765 * Allocate soft structure for SATA HBA instance.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
766 * There is a separate softstate for each HBA instance.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
767 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
768 sata_hba_inst = kmem_zalloc(sizeof (struct sata_hba_inst), KM_SLEEP);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
769 ASSERT(sata_hba_inst != NULL); /* this should not fail */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
770 mutex_init(&sata_hba_inst->satahba_mutex, NULL, MUTEX_DRIVER, NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
771 hba_attach_state |= HBA_ATTACH_STAGE_SATA_HBA_INST;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
772
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 * 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
775 * soft structure allocated by SATA framework for
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
776 * SATA HBA instance related data.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
777 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
778 scsi_tran->tran_hba_private = sata_hba_inst;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
779 scsi_tran->tran_tgt_private = NULL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
780
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
781 scsi_tran->tran_tgt_init = sata_scsi_tgt_init;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
782 scsi_tran->tran_tgt_probe = sata_scsi_tgt_probe;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
783 scsi_tran->tran_tgt_free = sata_scsi_tgt_free;
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 scsi_tran->tran_start = sata_scsi_start;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
786 scsi_tran->tran_reset = sata_scsi_reset;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
787 scsi_tran->tran_abort = sata_scsi_abort;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
788 scsi_tran->tran_getcap = sata_scsi_getcap;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
789 scsi_tran->tran_setcap = sata_scsi_setcap;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
790 scsi_tran->tran_init_pkt = sata_scsi_init_pkt;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
791 scsi_tran->tran_destroy_pkt = sata_scsi_destroy_pkt;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
792
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
793 scsi_tran->tran_dmafree = sata_scsi_dmafree;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
794 scsi_tran->tran_sync_pkt = sata_scsi_sync_pkt;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
795
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
796 scsi_tran->tran_reset_notify = NULL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
797 scsi_tran->tran_get_bus_addr = NULL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
798 scsi_tran->tran_quiesce = NULL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
799 scsi_tran->tran_unquiesce = NULL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
800 scsi_tran->tran_bus_reset = NULL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
801
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
802 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
803 scsi_tran, 0) != DDI_SUCCESS) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
804 #ifdef SATA_DEBUG
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
805 cmn_err(CE_WARN, "?SATA: %s%d hba scsi attach failed",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
806 ddi_driver_name(dip), ddi_get_instance(dip));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
807 #endif
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
808 goto fail;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
809 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
810 hba_attach_state |= HBA_ATTACH_STAGE_SCSI_ATTACHED;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
811
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
812 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
813 if (ddi_prop_update_int(DDI_DEV_T_NONE, dip,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
814 "sata", 1) != DDI_PROP_SUCCESS) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
815 SATA_LOG_D((NULL, CE_WARN, "sata_hba_attach: "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
816 "failed to create hba sata prop"));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
817 goto fail;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
818 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
819 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
820
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
821 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
822 * Save pointers in hba instance soft state.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
823 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
824 sata_hba_inst->satahba_scsi_tran = scsi_tran;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
825 sata_hba_inst->satahba_tran = sata_tran;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
826 sata_hba_inst->satahba_dip = dip;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
827
1781
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
828 /*
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
829 * 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
830 * 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
831 */
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
832 taskq_name[0] = '\0';
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
833 (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
834 sizeof (taskq_name));
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
835 (void) snprintf(taskq_name + strlen(taskq_name),
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
836 sizeof (taskq_name) - strlen(taskq_name),
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
837 "-%d", DEVI(dip)->devi_instance);
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
838 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
839 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
840 TASKQ_DYNAMIC);
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
841
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
842 hba_attach_state |= HBA_ATTACH_STAGE_SETUP;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
843
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
844 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
845 * Create events thread if not created yet.
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 sata_event_thread_control(1);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
848
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 * Link this hba instance into the list.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
851 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
852 mutex_enter(&sata_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
853
5014
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
854 if (sata_hba_list == NULL) {
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
855 /*
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
856 * The first instance of HBA is attached.
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
857 * 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
858 * 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
859 * 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
860 * 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
861 * 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
862 */
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
863 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
864 if (sata_current_max_qdepth > 32)
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
865 sata_current_max_qdepth = 32;
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
866 else if (sata_current_max_qdepth < 1)
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
867 sata_current_max_qdepth = 1;
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
868 }
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
869
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
870 sata_hba_inst->satahba_next = NULL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
871 sata_hba_inst->satahba_prev = sata_hba_list_tail;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
872 if (sata_hba_list == NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
873 sata_hba_list = sata_hba_inst;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
874 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
875 if (sata_hba_list_tail != NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
876 sata_hba_list_tail->satahba_next = sata_hba_inst;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
877 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
878 sata_hba_list_tail = sata_hba_inst;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
879 mutex_exit(&sata_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
880 hba_attach_state |= HBA_ATTACH_STAGE_LINKED;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
881
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 * Create SATA HBA devctl minor node for sata_hba_open, close, ioctl
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
884 * SATA HBA driver should not use its own open/close entry points.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
885 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
886 * Make sure that instance number doesn't overflow
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
887 * when forming minor numbers.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
888 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
889 ASSERT(ddi_get_instance(dip) <= (L_MAXMIN >> INST_MINOR_SHIFT));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
890 if (ddi_create_minor_node(dip, "devctl", S_IFCHR,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
891 INST2DEVCTL(ddi_get_instance(dip)),
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
892 DDI_NT_SATA_NEXUS, 0) != DDI_SUCCESS) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
893 #ifdef SATA_DEBUG
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
894 cmn_err(CE_WARN, "sata_hba_attach: "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
895 "cannot create devctl minor node");
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
896 #endif
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
897 goto fail;
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
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
900
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 * 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
903 * (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
904 */
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
905
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
906 /*
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
907 * 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
908 * 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
909 */
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
910 sata_hba_inst->satahba_attached = 1;
1258
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 * Probe controller ports. This operation will describe a current
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
913 * controller/port/multipliers/device configuration and will create
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
914 * attachment points.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
915 * 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
916 * 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
917 * are created and devices are initialized.
1258
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 sata_probe_ports(sata_hba_inst);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
920
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
921 return (DDI_SUCCESS);
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 fail:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
924 if (hba_attach_state & HBA_ATTACH_STAGE_LINKED) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
925 (void) sata_remove_hba_instance(dip);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
926 if (sata_hba_list == NULL)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
927 sata_event_thread_control(0);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
928 }
1781
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
929
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
930 if (hba_attach_state & HBA_ATTACH_STAGE_SETUP) {
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
931 (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
932 taskq_destroy(sata_hba_inst->satahba_taskq);
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
933 }
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
934
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
935 if (hba_attach_state & HBA_ATTACH_STAGE_SCSI_ATTACHED)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
936 (void) scsi_hba_detach(dip);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
937
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
938 if (hba_attach_state & HBA_ATTACH_STAGE_SATA_HBA_INST) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
939 mutex_destroy(&sata_hba_inst->satahba_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
940 kmem_free((void *)sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
941 sizeof (struct sata_hba_inst));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
942 scsi_hba_tran_free(scsi_tran);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
943 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
944
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
945 sata_log(NULL, CE_WARN, "?SATA: %s%d hba attach failed",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
946 ddi_driver_name(dip), ddi_get_instance(dip));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
947
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
948 return (DDI_FAILURE);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
949 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
950
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 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
953 * Called by SATA HBA from to detach an instance of the driver.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
954 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
955 * For DDI_DETACH command:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
956 * Free local structures allocated for SATA HBA instance during
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
957 * sata_hba_attach processing.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
958 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
959 * Returns DDI_SUCCESS when HBA was detached, DDI_FAILURE otherwise.
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 * For DDI_SUSPEND command:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
962 * Not implemented at this time (postponed until phase 2 of the development)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
963 * Returnd DDI_SUCCESS.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
964 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
965 * When the last HBA instance is detached, the event daemon is terminated.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
966 *
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
967 * NOTE: Port multiplier is supported.
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
968 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
969 int
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
970 sata_hba_detach(dev_info_t *dip, ddi_detach_cmd_t cmd)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
971 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
972 dev_info_t *tdip;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
973 sata_hba_inst_t *sata_hba_inst;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
974 scsi_hba_tran_t *scsi_hba_tran;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
975 sata_cport_info_t *cportinfo;
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
976 sata_pmult_info_t *pminfo;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
977 sata_drive_info_t *sdinfo;
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
978 sata_device_t sdevice;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
979 int ncport, npmport;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
980
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
981 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
982 ddi_node_name(dip), ddi_driver_name(dip), ddi_get_instance(dip));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
983
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
984 switch (cmd) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
985 case DDI_DETACH:
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 if ((scsi_hba_tran = ddi_get_driver_private(dip)) == NULL)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
988 return (DDI_FAILURE);
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 sata_hba_inst = scsi_hba_tran->tran_hba_private;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
991 if (sata_hba_inst == NULL)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
992 return (DDI_FAILURE);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
993
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
994 if (scsi_hba_detach(dip) == DDI_FAILURE) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
995 sata_hba_inst->satahba_attached = 1;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
996 return (DDI_FAILURE);
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 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1000 * Free all target nodes - at this point
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1001 * devices should be at least offlined
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1002 * otherwise scsi_hba_detach() should not be called.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1003 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1004 for (ncport = 0; ncport < SATA_NUM_CPORTS(sata_hba_inst);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1005 ncport++) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1006 cportinfo = SATA_CPORT_INFO(sata_hba_inst, ncport);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1007 if (cportinfo->cport_dev_type != SATA_DTYPE_PMULT) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1008 sdinfo = SATA_CPORTINFO_DRV_INFO(cportinfo);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1009 if (sdinfo != NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1010 tdip = sata_get_target_dip(dip,
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
1011 ncport, 0);
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1012 if (tdip != NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1013 if (ndi_devi_offline(tdip,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1014 NDI_DEVI_REMOVE) !=
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1015 NDI_SUCCESS) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1016 SATA_LOG_D((
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1017 sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1018 CE_WARN,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1019 "sata_hba_detach: "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1020 "Target node not "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1021 "removed !"));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1022 return (DDI_FAILURE);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1023 }
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 }
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
1026 } else { /* SATA_DTYPE_PMULT */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
1027 mutex_enter(&cportinfo->cport_mutex);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
1028 pminfo = SATA_CPORTINFO_PMULT_INFO(cportinfo);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
1029
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
1030 if (pminfo == NULL) {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
1031 SATA_LOG_D((sata_hba_inst, CE_WARN,
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
1032 "sata_hba_detach: Port multiplier "
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
1033 "not ready yet!"));
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
1034 mutex_exit(&cportinfo->cport_mutex);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
1035 return (DDI_FAILURE);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
1036 }
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
1037
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
1038 /*
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
1039 * Detach would fail if removal of any of the
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
1040 * target nodes is failed - albeit in that
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
1041 * case some of them may have been removed.
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
1042 */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
1043 for (npmport = 0; npmport < SATA_NUM_PMPORTS(
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
1044 sata_hba_inst, ncport); npmport++) {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
1045 tdip = sata_get_target_dip(dip, ncport,
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
1046 npmport);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
1047 if (tdip != NULL) {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
1048 if (ndi_devi_offline(tdip,
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
1049 NDI_DEVI_REMOVE) !=
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
1050 NDI_SUCCESS) {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
1051 SATA_LOG_D((
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
1052 sata_hba_inst,
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
1053 CE_WARN,
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
1054 "sata_hba_detach: "
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
1055 "Target node not "
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
1056 "removed !"));
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
1057 mutex_exit(&cportinfo->
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
1058 cport_mutex);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
1059 return (DDI_FAILURE);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
1060 }
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
1061 }
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
1062 }
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
1063 mutex_exit(&cportinfo->cport_mutex);
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1064 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1065 }
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 * Disable sata event daemon processing for this HBA
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 sata_hba_inst->satahba_attached = 0;
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 * Remove event daemon thread, if it is last HBA instance.
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 mutex_enter(&sata_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1076 if (sata_hba_list->satahba_next == NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1077 mutex_exit(&sata_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1078 sata_event_thread_control(0);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1079 mutex_enter(&sata_mutex);
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 mutex_exit(&sata_mutex);
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 /* Remove this HBA instance from the HBA list */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1084 sata_remove_hba_instance(dip);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1085
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 * At this point there should be no target nodes attached.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1088 * Detach and destroy device and port info structures.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1089 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1090 for (ncport = 0; ncport < SATA_NUM_CPORTS(sata_hba_inst);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1091 ncport++) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1092 cportinfo = SATA_CPORT_INFO(sata_hba_inst, ncport);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1093 if (cportinfo->cport_dev_type != SATA_DTYPE_PMULT) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1094 sdinfo =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1095 cportinfo->cport_devp.cport_sata_drive;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1096 if (sdinfo != NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1097 /* Release device structure */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1098 kmem_free(sdinfo,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1099 sizeof (sata_drive_info_t));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1100 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1101 /* Release cport info */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1102 mutex_destroy(&cportinfo->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1103 kmem_free(cportinfo,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1104 sizeof (sata_cport_info_t));
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
1105 } else { /* SATA_DTYPE_PMULT */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
1106 sdevice.satadev_addr.cport = (uint8_t)ncport;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
1107 sdevice.satadev_addr.qual = SATA_ADDR_PMULT;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
1108 sata_free_pmult(sata_hba_inst, &sdevice);
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1109 }
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
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1112 scsi_hba_tran_free(sata_hba_inst->satahba_scsi_tran);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1113
1781
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
1114 (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
1115
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
1116 taskq_destroy(sata_hba_inst->satahba_taskq);
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
1117
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1118 mutex_destroy(&sata_hba_inst->satahba_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1119 kmem_free((void *)sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1120 sizeof (struct sata_hba_inst));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1121
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1122 return (DDI_SUCCESS);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1123
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1124 case DDI_SUSPEND:
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 * Postponed until phase 2
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1127 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1128 return (DDI_FAILURE);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1129
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1130 default:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1131 return (DDI_FAILURE);
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
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1135
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1136 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1137 * Called by an HBA drive from _fini() routine.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1138 * Unregisters SATA HBA instance/SATA framework pair from the scsi framework.
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 void
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1141 sata_hba_fini(struct modlinkage *modlp)
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 SATADBG1(SATA_DBG_HBA_IF, NULL,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1144 "sata_hba_fini: name %s\n",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1145 ((struct modldrv *)(modlp->ml_linkage[0]))->drv_linkinfo);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1146
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1147 scsi_hba_fini(modlp);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1148 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1149
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 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1152 * Default open and close routine for sata_hba framework.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1153 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1154 */
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 * Open devctl node.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1157 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1158 * Returns:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1159 * 0 if node was open successfully, error code otherwise.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1160 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1161 *
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
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1164 static int
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1165 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
1166 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1167 #ifndef __lock_lint
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1168 _NOTE(ARGUNUSED(credp))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1169 #endif
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1170 int rv = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1171 dev_info_t *dip;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1172 scsi_hba_tran_t *scsi_hba_tran;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1173 sata_hba_inst_t *sata_hba_inst;
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 SATADBG1(SATA_DBG_IOCTL_IF, NULL, "sata_hba_open: entered", NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1176
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1177 if (otyp != OTYP_CHR)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1178 return (EINVAL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1179
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1180 dip = sata_devt_to_devinfo(*devp);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1181 if (dip == NULL)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1182 return (ENXIO);
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 if ((scsi_hba_tran = ddi_get_driver_private(dip)) == NULL)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1185 return (ENXIO);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1186
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1187 sata_hba_inst = scsi_hba_tran->tran_hba_private;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1188 if (sata_hba_inst == NULL || sata_hba_inst->satahba_attached == 0)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1189 return (ENXIO);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1190
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1191 mutex_enter(&sata_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1192 if (flags & FEXCL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1193 if (sata_hba_inst->satahba_open_flag != 0) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1194 rv = EBUSY;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1195 } else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1196 sata_hba_inst->satahba_open_flag =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1197 SATA_DEVCTL_EXOPENED;
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 } else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1200 if (sata_hba_inst->satahba_open_flag == SATA_DEVCTL_EXOPENED) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1201 rv = EBUSY;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1202 } else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1203 sata_hba_inst->satahba_open_flag =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1204 SATA_DEVCTL_SOPENED;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1205 }
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 mutex_exit(&sata_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1208
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1209 return (rv);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1210 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1211
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1212
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1213 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1214 * Close devctl node.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1215 * Returns:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1216 * 0 if node was closed successfully, error code otherwise.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1217 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1218 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1219
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1220 static int
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1221 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
1222 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1223 #ifndef __lock_lint
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1224 _NOTE(ARGUNUSED(credp))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1225 _NOTE(ARGUNUSED(flag))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1226 #endif
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1227 dev_info_t *dip;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1228 scsi_hba_tran_t *scsi_hba_tran;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1229 sata_hba_inst_t *sata_hba_inst;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1230
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1231 SATADBG1(SATA_DBG_IOCTL_IF, NULL, "sata_hba_close: entered", NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1232
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1233 if (otyp != OTYP_CHR)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1234 return (EINVAL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1235
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1236 dip = sata_devt_to_devinfo(dev);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1237 if (dip == NULL)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1238 return (ENXIO);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1239
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1240 if ((scsi_hba_tran = ddi_get_driver_private(dip)) == NULL)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1241 return (ENXIO);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1242
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1243 sata_hba_inst = scsi_hba_tran->tran_hba_private;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1244 if (sata_hba_inst == NULL || sata_hba_inst->satahba_attached == 0)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1245 return (ENXIO);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1246
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1247 mutex_enter(&sata_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1248 sata_hba_inst->satahba_open_flag = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1249 mutex_exit(&sata_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1250 return (0);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1251 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1252
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1253
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1254
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 * Standard IOCTL commands for SATA hotplugging.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1257 * Implemented DEVCTL_AP commands:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1258 * DEVCTL_AP_CONNECT
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1259 * DEVCTL_AP_DISCONNECT
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1260 * DEVCTL_AP_CONFIGURE
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1261 * DEVCTL_UNCONFIGURE
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1262 * DEVCTL_AP_CONTROL
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1263 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1264 * Commands passed to default ndi ioctl handler:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1265 * DEVCTL_DEVICE_GETSTATE
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1266 * DEVCTL_DEVICE_ONLINE
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1267 * DEVCTL_DEVICE_OFFLINE
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1268 * DEVCTL_DEVICE_REMOVE
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1269 * DEVCTL_DEVICE_INSERT
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1270 * DEVCTL_BUS_GETSTATE
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 * 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
1273 * if not.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1274 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1275 * Returns:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1276 * 0 if successful,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1277 * error code if operation failed.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1278 *
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
1279 * Port Multiplier support is supported now.
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
1280 *
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
1281 * NOTE: qual should be SATA_ADDR_DCPORT or SATA_ADDR_DPMPORT
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1282 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1283
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1284 static int
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1285 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
1286 int *rvalp)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1287 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1288 #ifndef __lock_lint
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1289 _NOTE(ARGUNUSED(credp))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1290 _NOTE(ARGUNUSED(rvalp))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1291 #endif
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1292 int rv = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1293 int32_t comp_port = -1;
5832
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
1294 dev_info_t *dip;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1295 devctl_ap_state_t ap_state;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1296 struct devctl_iocdata *dcp = NULL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1297 scsi_hba_tran_t *scsi_hba_tran;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1298 sata_hba_inst_t *sata_hba_inst;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1299 sata_device_t sata_device;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1300 sata_cport_info_t *cportinfo;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1301 int cport, pmport, qual;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1302 int rval = SATA_SUCCESS;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1303
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1304 dip = sata_devt_to_devinfo(dev);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1305 if (dip == NULL)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1306 return (ENXIO);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1307
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1308 if ((scsi_hba_tran = ddi_get_driver_private(dip)) == NULL)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1309 return (ENXIO);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1310
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1311 sata_hba_inst = scsi_hba_tran->tran_hba_private;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1312 if (sata_hba_inst == NULL)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1313 return (ENXIO);
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 if (sata_hba_inst->satahba_tran == NULL)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1316 return (ENXIO);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1317
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1318 switch (cmd) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1319
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1320 case DEVCTL_DEVICE_GETSTATE:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1321 case DEVCTL_DEVICE_ONLINE:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1322 case DEVCTL_DEVICE_OFFLINE:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1323 case DEVCTL_DEVICE_REMOVE:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1324 case DEVCTL_BUS_GETSTATE:
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 * 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
1327 * handler rather than fail them.
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1328 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1329 return (ndi_devctl_ioctl(dip, cmd, arg, mode, 0));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1330 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1331
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1332 /* read devctl ioctl data */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1333 if (cmd != DEVCTL_AP_CONTROL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1334 if (ndi_dc_allochdl((void *)arg, &dcp) != NDI_SUCCESS)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1335 return (EFAULT);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1336
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1337 if ((comp_port = sata_get_port_num(sata_hba_inst, dcp)) ==
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1338 -1) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1339 if (dcp)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1340 ndi_dc_freehdl(dcp);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1341 return (EINVAL);
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
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
1344 /*
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
1345 * According to SCSI_TO_SATA_ADDR_QUAL, qual should be either
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
1346 * SATA_ADDR_DCPORT or SATA_ADDR_DPMPORT.
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
1347 */
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1348 cport = SCSI_TO_SATA_CPORT(comp_port);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1349 pmport = SCSI_TO_SATA_PMPORT(comp_port);
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
1350 qual = SCSI_TO_SATA_ADDR_QUAL(comp_port);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
1351
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1352 if (sata_validate_sata_address(sata_hba_inst, cport, pmport,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1353 qual) != 0) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1354 ndi_dc_freehdl(dcp);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1355 return (EINVAL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1356 }
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 cportinfo = SATA_CPORT_INFO(sata_hba_inst, cport);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1359 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, cport)->
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1360 cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1361 if (cportinfo->cport_event_flags & SATA_EVNT_LOCK_PORT_BUSY) {
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 * Cannot process ioctl request now. Come back later.
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 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1366 cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1367 ndi_dc_freehdl(dcp);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1368 return (EBUSY);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1369 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1370 /* Block event processing for this port */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1371 cportinfo->cport_event_flags |= SATA_APCTL_LOCK_PORT_BUSY;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1372 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1373
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1374 sata_device.satadev_addr.cport = cport;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1375 sata_device.satadev_addr.pmport = pmport;
5832
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
1376 sata_device.satadev_addr.qual = qual;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1377 sata_device.satadev_rev = SATA_DEVICE_REV;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1378 }
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 switch (cmd) {
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 case DEVCTL_AP_DISCONNECT:
5832
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
1383
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1384 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1385 * Normally, cfgadm sata plugin will try to offline
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1386 * (unconfigure) device before this request. Nevertheless,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1387 * if a device is still configured, we need to
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1388 * attempt to offline and unconfigure device first, and we will
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1389 * deactivate the port regardless of the unconfigure
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1390 * operation results.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1391 *
5832
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
1392 */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
1393 rv = sata_ioctl_disconnect(sata_hba_inst, &sata_device);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
1394
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1395 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1396
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1397 case DEVCTL_AP_UNCONFIGURE:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1398
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1399 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1400 * The unconfigure operation uses generic nexus operation to
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1401 * offline a device. It leaves a target device node attached.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1402 * and obviously sata_drive_info attached as well, because
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1403 * from the hardware point of view nothing has changed.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1404 */
5832
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
1405 rv = sata_ioctl_unconfigure(sata_hba_inst, &sata_device);
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1406 break;
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 case DEVCTL_AP_CONNECT:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1409 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1410 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1411 * The sata cfgadm pluging will invoke this operation only if
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1412 * port was found in the disconnect state (failed state
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1413 * is also treated as the disconnected state).
5832
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
1414 * If port activation is successful and a device is found
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
1415 * attached to the port, the initialization sequence is
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
1416 * executed to probe the port and attach
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1417 * a device structure to a port structure. The device is not
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1418 * set in configured state (system-wise) by this operation.
5832
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
1419 */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
1420
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
1421 rv = sata_ioctl_connect(sata_hba_inst, &sata_device);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
1422
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1423 break;
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
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1426 case DEVCTL_AP_CONFIGURE:
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 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1429 * A port may be in an active or shutdown state.
5832
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
1430 * If port is in a failed state, operation is aborted.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
1431 * 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
1432 * is invoked prior to any other operation.
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1433 *
5832
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
1434 * Onlining the device involves creating a new target node.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
1435 * If there is an old target node present (belonging to
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
1436 * previously removed device), the operation is aborted - the
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
1437 * old node has to be released and removed before configure
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
1438 * operation is attempted.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
1439 */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
1440
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
1441 rv = sata_ioctl_configure(sata_hba_inst, &sata_device);
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1442
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1443 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1444 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1445
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1446 case DEVCTL_AP_GETSTATE:
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 sata_cfgadm_state(sata_hba_inst, comp_port, &ap_state);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1449
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1450 ap_state.ap_last_change = (time_t)-1;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1451 ap_state.ap_error_code = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1452 ap_state.ap_in_transition = 0;
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 /* Copy the return AP-state information to the user space */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1455 if (ndi_dc_return_ap_state(&ap_state, dcp) != NDI_SUCCESS) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1456 rv = EFAULT;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1457 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1458 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1459
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1460 case DEVCTL_AP_CONTROL:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1461 {
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 * Generic devctl for hardware specific functionality
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1464 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1465 sata_ioctl_data_t ioc;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1466
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1467 ASSERT(dcp == NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1468
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1469 /* Copy in user ioctl data first */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1470 #ifdef _MULTI_DATAMODEL
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1471 if (ddi_model_convert_from(mode & FMODELS) ==
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1472 DDI_MODEL_ILP32) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1473
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1474 sata_ioctl_data_32_t ioc32;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1475
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1476 if (ddi_copyin((void *)arg, (void *)&ioc32,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1477 sizeof (ioc32), mode) != 0) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1478 rv = EFAULT;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1479 break;
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 ioc.cmd = (uint_t)ioc32.cmd;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1482 ioc.port = (uint_t)ioc32.port;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1483 ioc.get_size = (uint_t)ioc32.get_size;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1484 ioc.buf = (caddr_t)(uintptr_t)ioc32.buf;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1485 ioc.bufsiz = (uint_t)ioc32.bufsiz;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1486 ioc.misc_arg = (uint_t)ioc32.misc_arg;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1487 } else
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1488 #endif /* _MULTI_DATAMODEL */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1489 if (ddi_copyin((void *)arg, (void *)&ioc, sizeof (ioc),
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1490 mode) != 0) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1491 return (EFAULT);
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
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1494 SATADBG2(SATA_DBG_IOCTL_IF, sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1495 "sata_hba_ioctl: DEVCTL_AP_CONTROL "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1496 "cmd 0x%x, port 0x%x", ioc.cmd, ioc.port);
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 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1499 * 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
1500 * a 32-bit number.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1501 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1502 if (ioc.get_size != 0 && ioc.bufsiz != (sizeof (uint32_t))) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1503 return (EINVAL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1504 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1505 /* validate address */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1506 cport = SCSI_TO_SATA_CPORT(ioc.port);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1507 pmport = SCSI_TO_SATA_PMPORT(ioc.port);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1508 qual = SCSI_TO_SATA_ADDR_QUAL(ioc.port);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1509
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
1510 SATADBG3(SATA_DBG_IOCTL_IF, sata_hba_inst,
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
1511 "sata_hba_ioctl: target port is %d:%d (%d)",
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
1512 cport, pmport, qual);
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1513
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1514 if (sata_validate_sata_address(sata_hba_inst, cport,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1515 pmport, qual) != 0)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1516 return (EINVAL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1517
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1518 cportinfo = SATA_CPORT_INFO(sata_hba_inst, cport);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1519 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, cport)->
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1520 cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1521 /* Is the port locked by event processing daemon ? */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1522 if (cportinfo->cport_event_flags & SATA_EVNT_LOCK_PORT_BUSY) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1523 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1524 * Cannot process ioctl request now. Come back later
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1525 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1526 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1527 cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1528 return (EBUSY);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1529 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1530 /* Block event processing for this port */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1531 cportinfo->cport_event_flags |= SATA_APCTL_LOCK_PORT_BUSY;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1532 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1533
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1534
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1535 sata_device.satadev_addr.cport = cport;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1536 sata_device.satadev_addr.pmport = pmport;
5832
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
1537 sata_device.satadev_addr.qual = qual;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1538 sata_device.satadev_rev = SATA_DEVICE_REV;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1539
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1540 switch (ioc.cmd) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1541
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1542 case SATA_CFGA_RESET_PORT:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1543 /*
5832
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
1544 * There is no protection for configured device.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
1545 */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
1546 rv = sata_ioctl_reset_port(sata_hba_inst, &sata_device);
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1547 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1548
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1549 case SATA_CFGA_RESET_DEVICE:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1550 /*
5832
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
1551 * There is no protection for configured device.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
1552 */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
1553 rv = sata_ioctl_reset_device(sata_hba_inst,
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1554 &sata_device);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1555 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1556
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1557 case SATA_CFGA_RESET_ALL:
5832
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
1558 /*
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
1559 * There is no protection for configured devices.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
1560 */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
1561 rv = sata_ioctl_reset_all(sata_hba_inst);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
1562 /*
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1563 * We return here, because common return is for
5832
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
1564 * a single port operation - we have already unlocked
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
1565 * all ports and no dc handle was allocated.
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1566 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1567 return (rv);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1568
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1569 case SATA_CFGA_PORT_DEACTIVATE:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1570 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1571 * Arbitrarily unconfigure attached device, if any.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1572 * Even if the unconfigure fails, proceed with the
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1573 * port deactivation.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1574 */
5832
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
1575 rv = sata_ioctl_deactivate(sata_hba_inst, &sata_device);
1258
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 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1578
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1579 case SATA_CFGA_PORT_ACTIVATE:
5832
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
1580
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
1581 rv = sata_ioctl_activate(sata_hba_inst, &sata_device);
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1582 break;
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 case SATA_CFGA_PORT_SELF_TEST:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1585
5832
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
1586 rv = sata_ioctl_port_self_test(sata_hba_inst,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
1587 &sata_device);
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1588 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1589
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1590 case SATA_CFGA_GET_DEVICE_PATH:
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
1591
5832
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
1592 rv = sata_ioctl_get_device_path(sata_hba_inst,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
1593 &sata_device, &ioc, mode);
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1594 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1595
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1596 case SATA_CFGA_GET_AP_TYPE:
5832
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
1597
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
1598 rv = sata_ioctl_get_ap_type(sata_hba_inst,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
1599 &sata_device, &ioc, mode);
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1600 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1601
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1602 case SATA_CFGA_GET_MODEL_INFO:
5832
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
1603
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
1604 rv = sata_ioctl_get_model_info(sata_hba_inst,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
1605 &sata_device, &ioc, mode);
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1606 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1607
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1608 case SATA_CFGA_GET_REVFIRMWARE_INFO:
5832
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
1609
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
1610 rv = sata_ioctl_get_revfirmware_info(sata_hba_inst,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
1611 &sata_device, &ioc, mode);
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1612 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1613
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1614 case SATA_CFGA_GET_SERIALNUMBER_INFO:
5832
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
1615
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
1616 rv = sata_ioctl_get_serialnumber_info(sata_hba_inst,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
1617 &sata_device, &ioc, mode);
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1618 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1619
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1620 default:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1621 rv = EINVAL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1622 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1623
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1624 } /* End of DEVCTL_AP_CONTROL cmd switch */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1625
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1626 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1627 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1628
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1629 default:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1630 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1631 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1632 * If we got here, we got an IOCTL that SATA HBA Framework
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1633 * does not recognize. Pass ioctl to HBA driver, in case
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1634 * it could process it.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1635 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1636 sata_hba_tran_t *sata_tran = sata_hba_inst->satahba_tran;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1637 dev_info_t *mydip = SATA_DIP(sata_hba_inst);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1638
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1639 SATADBG1(SATA_DBG_IOCTL_IF, sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1640 "IOCTL 0x%2x not supported in SATA framework, "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1641 "passthrough to HBA", cmd);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1642
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1643 if (sata_tran->sata_tran_ioctl == NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1644 rv = EINVAL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1645 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1646 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1647 rval = (*sata_tran->sata_tran_ioctl)(mydip, cmd, arg);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1648 if (rval != 0) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1649 SATADBG1(SATA_DBG_IOCTL_IF, sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1650 "IOCTL 0x%2x failed in HBA", cmd);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1651 rv = rval;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1652 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1653 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1654 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1655
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1656 } /* End of main IOCTL switch */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1657
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1658 if (dcp) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1659 ndi_dc_freehdl(dcp);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1660 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1661 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1662 cportinfo->cport_event_flags &= ~SATA_APCTL_LOCK_PORT_BUSY;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1663 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1664
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1665 return (rv);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1666 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1667
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1668
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
1669 /*
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
1670 * Create error retrieval sata packet
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 * 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
1673 * command and appropriate dma-able data buffer.
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
1674 * 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
1675 * specified.
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
1676 *
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
1677 * Returns a pointer to sata packet upon successfull packet creation.
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
1678 * Returns NULL, if packet cannot be created.
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
1679 */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
1680 sata_pkt_t *
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
1681 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
1682 int pkt_type)
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
1683 {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
1684 sata_hba_inst_t *sata_hba_inst;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
1685 sata_pkt_txlate_t *spx;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
1686 sata_pkt_t *spkt;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
1687 sata_drive_info_t *sdinfo;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
1688
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
1689 mutex_enter(&sata_mutex);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
1690 for (sata_hba_inst = sata_hba_list; sata_hba_inst != NULL;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
1691 sata_hba_inst = sata_hba_inst->satahba_next) {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
1692 if (SATA_DIP(sata_hba_inst) == dip)
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
1693 break;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
1694 }
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
1695 mutex_exit(&sata_mutex);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
1696 ASSERT(sata_hba_inst != NULL);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
1697
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
1698 sdinfo = sata_get_device_info(sata_hba_inst, sata_device);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
1699 if (sdinfo == NULL) {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
1700 sata_log(sata_hba_inst, CE_WARN,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
1701 "sata: error recovery request for non-attached device at "
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
1702 "cport %d", sata_device->satadev_addr.cport);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
1703 return (NULL);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
1704 }
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
1705
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
1706 spx = kmem_zalloc(sizeof (sata_pkt_txlate_t), KM_SLEEP);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
1707 spx->txlt_sata_hba_inst = sata_hba_inst;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
1708 spx->txlt_scsi_pkt = NULL; /* No scsi pkt involved */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
1709 spkt = sata_pkt_alloc(spx, NULL);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
1710 if (spkt == NULL) {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
1711 kmem_free(spx, sizeof (sata_pkt_txlate_t));
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
1712 return (NULL);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
1713 }
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
1714 /* address is needed now */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
1715 spkt->satapkt_device.satadev_addr = sata_device->satadev_addr;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
1716
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
1717 switch (pkt_type) {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
1718 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
1719 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
1720 return (spkt);
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
1721 break;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
1722
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
1723 case SATA_ERR_RETR_PKT_TYPE_ATAPI:
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
1724 if (sata_atapi_err_ret_cmd_setup(spx, sdinfo) == SATA_SUCCESS)
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
1725 return (spkt);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
1726 break;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
1727
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
1728 default:
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
1729 break;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
1730 }
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
1731
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
1732 sata_pkt_free(spx);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
1733 kmem_free(spx, sizeof (sata_pkt_txlate_t));
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
1734 return (NULL);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
1735
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
1736 }
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
1737
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
1738
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
1739 /*
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
1740 * Free error retrieval sata packet
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
1741 *
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
1742 * Free sata packet and any associated resources allocated previously by
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
1743 * sata_get_error_retrieval_pkt().
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
1744 *
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
1745 * Void return.
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
1746 */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
1747 void
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
1748 sata_free_error_retrieval_pkt(sata_pkt_t *sata_pkt)
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
1749 {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
1750 sata_pkt_txlate_t *spx =
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
1751 (sata_pkt_txlate_t *)sata_pkt->satapkt_framework_private;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
1752
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
1753 ASSERT(sata_pkt != NULL);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
1754
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
1755 sata_free_local_buffer(spx);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
1756 sata_pkt_free(spx);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
1757 kmem_free(spx, sizeof (sata_pkt_txlate_t));
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
1758
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
1759 }
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1760
6777
cc437863808b PSARC 2008/337 scsi-self-identifying
jw149990
parents: 6591
diff changeset
1761 /*
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
1762 * Create READ PORT MULTIPLIER and WRITE PORT MULTIPLIER sata packet
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
1763 *
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
1764 * No association with any scsi packet is made and no callback routine is
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
1765 * specified.
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
1766 *
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
1767 * Returns a pointer to sata packet upon successfull packet creation.
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
1768 * Returns NULL, if packet cannot be created.
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
1769 *
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
1770 * NOTE: Input/Output value includes 64 bits accoring to SATA Spec 2.6,
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
1771 * only lower 32 bits are available currently.
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
1772 */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
1773 sata_pkt_t *
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
1774 sata_get_rdwr_pmult_pkt(dev_info_t *dip, sata_device_t *sd,
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
1775 uint8_t regn, uint32_t regv, uint32_t type)
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
1776 {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
1777 sata_hba_inst_t *sata_hba_inst;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
1778 sata_pkt_txlate_t *spx;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
1779 sata_pkt_t *spkt;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
1780 sata_cmd_t *scmd;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
1781
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
1782 /* Only READ/WRITE commands are accepted. */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
1783 ASSERT(type == SATA_RDWR_PMULT_PKT_TYPE_READ ||
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
1784 type == SATA_RDWR_PMULT_PKT_TYPE_WRITE);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
1785
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
1786 mutex_enter(&sata_mutex);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
1787 for (sata_hba_inst = sata_hba_list; sata_hba_inst != NULL;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
1788 sata_hba_inst = sata_hba_inst->satahba_next) {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
1789 if (SATA_DIP(sata_hba_inst) == dip)
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
1790 break;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
1791 }
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
1792 mutex_exit(&sata_mutex);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
1793 ASSERT(sata_hba_inst != NULL);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
1794
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
1795 spx = kmem_zalloc(sizeof (sata_pkt_txlate_t), KM_SLEEP);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
1796 spx->txlt_sata_hba_inst = sata_hba_inst;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
1797 spx->txlt_scsi_pkt = NULL; /* No scsi pkt involved */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
1798 spkt = sata_pkt_alloc(spx, SLEEP_FUNC);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
1799 if (spkt == NULL) {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
1800 kmem_free(spx, sizeof (sata_pkt_txlate_t));
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
1801 return (NULL);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
1802 }
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
1803
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
1804 /*
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
1805 * NOTE: We need to send this command to the port multiplier,
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
1806 * that means send to SATA_PMULT_HOSTPORT(0xf) pmport
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
1807 *
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
1808 * sata_device contains the address of actual target device, and the
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
1809 * pmport number in the command comes from the sata_device structure.
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
1810 */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
1811 spkt->satapkt_device.satadev_addr = sd->satadev_addr;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
1812 spkt->satapkt_device.satadev_addr.pmport = SATA_PMULT_HOSTPORT;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
1813 spkt->satapkt_device.satadev_addr.qual = SATA_ADDR_PMULT;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
1814
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
1815 /* Fill sata_pkt */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
1816 spkt->satapkt_op_mode = SATA_OPMODE_SYNCH | SATA_OPMODE_POLLING;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
1817 spkt->satapkt_comp = NULL; /* Synchronous mode, no callback */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
1818 spkt->satapkt_time = 10; /* Timeout 10s */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
1819
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
1820 /* Build READ PORT MULTIPLIER cmd in the sata_pkt */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
1821 scmd = &spkt->satapkt_cmd;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
1822 scmd->satacmd_features_reg = regn & 0xff;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
1823 scmd->satacmd_features_reg_ext = (regn >> 8) & 0xff;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
1824 scmd->satacmd_device_reg = sd->satadev_addr.pmport;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
1825 scmd->satacmd_addr_type = 0; /* N/A */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
1826
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
1827 scmd->satacmd_flags.sata_ignore_dev_reset = B_TRUE;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
1828
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
1829 if (type == SATA_RDWR_PMULT_PKT_TYPE_READ) {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
1830 scmd->satacmd_cmd_reg = SATAC_READ_PORTMULT;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
1831 scmd->satacmd_flags.sata_data_direction = SATA_DIR_READ;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
1832 scmd->satacmd_flags.sata_special_regs = 1;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
1833 scmd->satacmd_flags.sata_copy_out_lba_high_lsb = 1;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
1834 scmd->satacmd_flags.sata_copy_out_lba_mid_lsb = 1;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
1835 scmd->satacmd_flags.sata_copy_out_lba_low_lsb = 1;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
1836 scmd->satacmd_flags.sata_copy_out_sec_count_lsb = 1;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
1837 } else if (type == SATA_RDWR_PMULT_PKT_TYPE_WRITE) {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
1838 scmd->satacmd_cmd_reg = SATAC_WRITE_PORTMULT;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
1839 scmd->satacmd_flags.sata_data_direction = SATA_DIR_WRITE;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
1840 scmd->satacmd_sec_count_lsb = regv & 0xff;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
1841 scmd->satacmd_lba_low_lsb = regv >> 8 & 0xff;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
1842 scmd->satacmd_lba_mid_lsb = regv >> 16 & 0xff;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
1843 scmd->satacmd_lba_high_lsb = regv >> 24 & 0xff;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
1844 }
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
1845
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
1846 return (spkt);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
1847 }
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
1848
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
1849 /*
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
1850 * Free sata packet and any associated resources allocated previously by
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
1851 * sata_get_rdwr_pmult_pkt().
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
1852 *
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
1853 * Void return.
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
1854 */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
1855 void
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
1856 sata_free_rdwr_pmult_pkt(sata_pkt_t *sata_pkt)
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
1857 {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
1858 sata_pkt_txlate_t *spx =
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
1859 (sata_pkt_txlate_t *)sata_pkt->satapkt_framework_private;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
1860
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
1861 /* Free allocated resources */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
1862 sata_pkt_free(spx);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
1863 kmem_free(spx, sizeof (sata_pkt_txlate_t));
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
1864 }
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
1865
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
1866 /*
10663
4d59e1faf654 6881565 sata hba interfaces need to keep backward compatibility
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10427
diff changeset
1867 * Register a port multiplier to framework.
4d59e1faf654 6881565 sata hba interfaces need to keep backward compatibility
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10427
diff changeset
1868 * 1) Store the GSCR values in the previous allocated pmult_info strctures.
4d59e1faf654 6881565 sata hba interfaces need to keep backward compatibility
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10427
diff changeset
1869 * 2) Search in the blacklist and update the number of the device ports of the
4d59e1faf654 6881565 sata hba interfaces need to keep backward compatibility
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10427
diff changeset
1870 * port multiplier.
4d59e1faf654 6881565 sata hba interfaces need to keep backward compatibility
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10427
diff changeset
1871 *
4d59e1faf654 6881565 sata hba interfaces need to keep backward compatibility
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10427
diff changeset
1872 * Void return.
4d59e1faf654 6881565 sata hba interfaces need to keep backward compatibility
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10427
diff changeset
1873 */
4d59e1faf654 6881565 sata hba interfaces need to keep backward compatibility
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10427
diff changeset
1874 void
4d59e1faf654 6881565 sata hba interfaces need to keep backward compatibility
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10427
diff changeset
1875 sata_register_pmult(dev_info_t *dip, sata_device_t *sd, sata_pmult_gscr_t *sg)
4d59e1faf654 6881565 sata hba interfaces need to keep backward compatibility
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10427
diff changeset
1876 {
4d59e1faf654 6881565 sata hba interfaces need to keep backward compatibility
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10427
diff changeset
1877 sata_hba_inst_t *sata_hba_inst = NULL;
4d59e1faf654 6881565 sata hba interfaces need to keep backward compatibility
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10427
diff changeset
1878 sata_pmult_info_t *pmultinfo;
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
1879 sata_pmult_bl_t *blp;
10663
4d59e1faf654 6881565 sata hba interfaces need to keep backward compatibility
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10427
diff changeset
1880 int cport = sd->satadev_addr.cport;
4d59e1faf654 6881565 sata hba interfaces need to keep backward compatibility
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10427
diff changeset
1881
4d59e1faf654 6881565 sata hba interfaces need to keep backward compatibility
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10427
diff changeset
1882 mutex_enter(&sata_mutex);
4d59e1faf654 6881565 sata hba interfaces need to keep backward compatibility
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10427
diff changeset
1883 for (sata_hba_inst = sata_hba_list; sata_hba_inst != NULL;
4d59e1faf654 6881565 sata hba interfaces need to keep backward compatibility
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10427
diff changeset
1884 sata_hba_inst = sata_hba_inst->satahba_next) {
4d59e1faf654 6881565 sata hba interfaces need to keep backward compatibility
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10427
diff changeset
1885 if (SATA_DIP(sata_hba_inst) == dip)
4d59e1faf654 6881565 sata hba interfaces need to keep backward compatibility
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10427
diff changeset
1886 if (sata_hba_inst->satahba_attached == 1)
4d59e1faf654 6881565 sata hba interfaces need to keep backward compatibility
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10427
diff changeset
1887 break;
4d59e1faf654 6881565 sata hba interfaces need to keep backward compatibility
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10427
diff changeset
1888 }
4d59e1faf654 6881565 sata hba interfaces need to keep backward compatibility
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10427
diff changeset
1889 mutex_exit(&sata_mutex);
4d59e1faf654 6881565 sata hba interfaces need to keep backward compatibility
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10427
diff changeset
1890 /* HBA not attached? */
4d59e1faf654 6881565 sata hba interfaces need to keep backward compatibility
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10427
diff changeset
1891 if (sata_hba_inst == NULL)
4d59e1faf654 6881565 sata hba interfaces need to keep backward compatibility
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10427
diff changeset
1892 return;
4d59e1faf654 6881565 sata hba interfaces need to keep backward compatibility
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10427
diff changeset
1893
4d59e1faf654 6881565 sata hba interfaces need to keep backward compatibility
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10427
diff changeset
1894 /* Number of pmports */
4d59e1faf654 6881565 sata hba interfaces need to keep backward compatibility
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10427
diff changeset
1895 sd->satadev_add_info = sg->gscr2 & SATA_PMULT_PORTNUM_MASK;
4d59e1faf654 6881565 sata hba interfaces need to keep backward compatibility
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10427
diff changeset
1896
4d59e1faf654 6881565 sata hba interfaces need to keep backward compatibility
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10427
diff changeset
1897 /* Check the blacklist */
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
1898 for (blp = sata_pmult_blacklist; blp->bl_gscr0; blp++) {
10663
4d59e1faf654 6881565 sata hba interfaces need to keep backward compatibility
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10427
diff changeset
1899 if (sg->gscr0 != blp->bl_gscr0 && blp->bl_gscr0)
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
1900 continue;
10663
4d59e1faf654 6881565 sata hba interfaces need to keep backward compatibility
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10427
diff changeset
1901 if (sg->gscr1 != blp->bl_gscr1 && blp->bl_gscr1)
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
1902 continue;
10663
4d59e1faf654 6881565 sata hba interfaces need to keep backward compatibility
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10427
diff changeset
1903 if (sg->gscr2 != blp->bl_gscr2 && blp->bl_gscr2)
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
1904 continue;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
1905
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
1906 cmn_err(CE_WARN, "!Port multiplier is on the blacklist.");
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
1907 sd->satadev_add_info = blp->bl_flags;
10663
4d59e1faf654 6881565 sata hba interfaces need to keep backward compatibility
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10427
diff changeset
1908 break;
4d59e1faf654 6881565 sata hba interfaces need to keep backward compatibility
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10427
diff changeset
1909 }
4d59e1faf654 6881565 sata hba interfaces need to keep backward compatibility
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10427
diff changeset
1910
4d59e1faf654 6881565 sata hba interfaces need to keep backward compatibility
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10427
diff changeset
1911 /* Register the port multiplier GSCR */
4d59e1faf654 6881565 sata hba interfaces need to keep backward compatibility
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10427
diff changeset
1912 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
4d59e1faf654 6881565 sata hba interfaces need to keep backward compatibility
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10427
diff changeset
1913 pmultinfo = SATA_PMULT_INFO(sata_hba_inst, cport);
4d59e1faf654 6881565 sata hba interfaces need to keep backward compatibility
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10427
diff changeset
1914 if (pmultinfo != NULL) {
4d59e1faf654 6881565 sata hba interfaces need to keep backward compatibility
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10427
diff changeset
1915 pmultinfo->pmult_gscr = *sg;
4d59e1faf654 6881565 sata hba interfaces need to keep backward compatibility
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10427
diff changeset
1916 pmultinfo->pmult_num_dev_ports =
4d59e1faf654 6881565 sata hba interfaces need to keep backward compatibility
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10427
diff changeset
1917 sd->satadev_add_info & SATA_PMULT_PORTNUM_MASK;
4d59e1faf654 6881565 sata hba interfaces need to keep backward compatibility
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10427
diff changeset
1918 SATADBG1(SATA_DBG_PMULT, sata_hba_inst,
4d59e1faf654 6881565 sata hba interfaces need to keep backward compatibility
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10427
diff changeset
1919 "Port multiplier registered at port %d", cport);
4d59e1faf654 6881565 sata hba interfaces need to keep backward compatibility
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10427
diff changeset
1920 }
4d59e1faf654 6881565 sata hba interfaces need to keep backward compatibility
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10427
diff changeset
1921 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
1922 }
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
1923
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
1924 /*
6777
cc437863808b PSARC 2008/337 scsi-self-identifying
jw149990
parents: 6591
diff changeset
1925 * sata_name_child is for composing the name of the node
cc437863808b PSARC 2008/337 scsi-self-identifying
jw149990
parents: 6591
diff changeset
1926 * the format of the name is "target,0".
cc437863808b PSARC 2008/337 scsi-self-identifying
jw149990
parents: 6591
diff changeset
1927 */
cc437863808b PSARC 2008/337 scsi-self-identifying
jw149990
parents: 6591
diff changeset
1928 static int
cc437863808b PSARC 2008/337 scsi-self-identifying
jw149990
parents: 6591
diff changeset
1929 sata_name_child(dev_info_t *dip, char *name, int namelen)
cc437863808b PSARC 2008/337 scsi-self-identifying
jw149990
parents: 6591
diff changeset
1930 {
cc437863808b PSARC 2008/337 scsi-self-identifying
jw149990
parents: 6591
diff changeset
1931 int target;
cc437863808b PSARC 2008/337 scsi-self-identifying
jw149990
parents: 6591
diff changeset
1932
cc437863808b PSARC 2008/337 scsi-self-identifying
jw149990
parents: 6591
diff changeset
1933 target = ddi_prop_get_int(DDI_DEV_T_ANY, dip,
cc437863808b PSARC 2008/337 scsi-self-identifying
jw149990
parents: 6591
diff changeset
1934 DDI_PROP_DONTPASS, "target", -1);
cc437863808b PSARC 2008/337 scsi-self-identifying
jw149990
parents: 6591
diff changeset
1935 if (target == -1)
cc437863808b PSARC 2008/337 scsi-self-identifying
jw149990
parents: 6591
diff changeset
1936 return (DDI_FAILURE);
cc437863808b PSARC 2008/337 scsi-self-identifying
jw149990
parents: 6591
diff changeset
1937 (void) snprintf(name, namelen, "%x,0", target);
cc437863808b PSARC 2008/337 scsi-self-identifying
jw149990
parents: 6591
diff changeset
1938 return (DDI_SUCCESS);
cc437863808b PSARC 2008/337 scsi-self-identifying
jw149990
parents: 6591
diff changeset
1939 }
cc437863808b PSARC 2008/337 scsi-self-identifying
jw149990
parents: 6591
diff changeset
1940
cc437863808b PSARC 2008/337 scsi-self-identifying
jw149990
parents: 6591
diff changeset
1941
1258
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 /* ****************** SCSA required entry points *********************** */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1944
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 * Implementation of scsi tran_tgt_init.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1947 * sata_scsi_tgt_init() initializes scsi_device structure
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1948 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1949 * If successful, DDI_SUCCESS is returned.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1950 * DDI_FAILURE is returned if addressed device does not exist
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1951 */
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 static int
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1954 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
1955 scsi_hba_tran_t *hba_tran, struct scsi_device *sd)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1956 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1957 #ifndef __lock_lint
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1958 _NOTE(ARGUNUSED(hba_dip))
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
1959 _NOTE(ARGUNUSED(tgt_dip))
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1960 #endif
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1961 sata_device_t sata_device;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1962 sata_drive_info_t *sdinfo;
4582
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
1963 struct sata_id *sid;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1964 sata_hba_inst_t *sata_hba_inst;
4582
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
1965 char model[SATA_ID_MODEL_LEN + 1];
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
1966 char fw[SATA_ID_FW_LEN + 1];
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
1967 char *vid, *pid;
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
1968 int i;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1969
6777
cc437863808b PSARC 2008/337 scsi-self-identifying
jw149990
parents: 6591
diff changeset
1970 /*
cc437863808b PSARC 2008/337 scsi-self-identifying
jw149990
parents: 6591
diff changeset
1971 * Fail tran_tgt_init for .conf stub node
cc437863808b PSARC 2008/337 scsi-self-identifying
jw149990
parents: 6591
diff changeset
1972 */
cc437863808b PSARC 2008/337 scsi-self-identifying
jw149990
parents: 6591
diff changeset
1973 if (ndi_dev_is_persistent_node(tgt_dip) == 0) {
cc437863808b PSARC 2008/337 scsi-self-identifying
jw149990
parents: 6591
diff changeset
1974 (void) ndi_merge_node(tgt_dip, sata_name_child);
cc437863808b PSARC 2008/337 scsi-self-identifying
jw149990
parents: 6591
diff changeset
1975 ddi_set_name_addr(tgt_dip, NULL);
cc437863808b PSARC 2008/337 scsi-self-identifying
jw149990
parents: 6591
diff changeset
1976 return (DDI_FAILURE);
cc437863808b PSARC 2008/337 scsi-self-identifying
jw149990
parents: 6591
diff changeset
1977 }
cc437863808b PSARC 2008/337 scsi-self-identifying
jw149990
parents: 6591
diff changeset
1978
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1979 sata_hba_inst = (sata_hba_inst_t *)(hba_tran->tran_hba_private);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1980
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1981 /* Validate scsi device address */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1982 if (sata_validate_scsi_address(sata_hba_inst, &sd->sd_address,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1983 &sata_device) != 0)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1984 return (DDI_FAILURE);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1985
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1986 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1987 sata_device.satadev_addr.cport)));
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 /* sata_device now contains a valid sata address */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1990 sdinfo = sata_get_device_info(sata_hba_inst, &sata_device);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1991 if (sdinfo == NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1992 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1993 sata_device.satadev_addr.cport)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1994 return (DDI_FAILURE);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1995 }
4582
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
1996 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
1997 sata_device.satadev_addr.cport)));
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
1998
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
1999 /*
4876
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
2000 * 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
2001 * the target disks.
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
2002 *
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
2003 * 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
2004 * 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
2005 * 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
2006 * 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
2007 * attach(9F) function.
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
2008 */
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
2009 if ((sdinfo->satadrv_type == SATA_DTYPE_ATADISK) &&
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
2010 (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
2011 "use-cmdk-devid-format", 0) == 1)) {
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
2012 /* register a legacy devid for this target node */
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
2013 sata_target_devid_register(tgt_dip, sdinfo);
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
2014 }
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
2015
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
2016
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
2017 /*
4582
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
2018 * 'Identify Device Data' does not always fit in standard SCSI
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
2019 * INQUIRY data, so establish INQUIRY_* properties with full-form
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
2020 * of information.
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
2021 */
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
2022 sid = &sdinfo->satadrv_id;
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
2023 #ifdef _LITTLE_ENDIAN
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
2024 swab(sid->ai_model, model, SATA_ID_MODEL_LEN);
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
2025 swab(sid->ai_fw, fw, SATA_ID_FW_LEN);
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
2026 #else /* _LITTLE_ENDIAN */
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
2027 bcopy(sid->ai_model, model, SATA_ID_MODEL_LEN);
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
2028 bcopy(sid->ai_fw, fw, SATA_ID_FW_LEN);
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
2029 #endif /* _LITTLE_ENDIAN */
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
2030 model[SATA_ID_MODEL_LEN] = 0;
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
2031 fw[SATA_ID_FW_LEN] = 0;
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
2032
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
2033 /* split model into into vid/pid */
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
2034 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
2035 if ((*pid == ' ') || (*pid == '\t'))
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
2036 break;
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
2037 if (i < SATA_ID_MODEL_LEN) {
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
2038 vid = model;
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
2039 *pid++ = 0; /* terminate vid, establish pid */
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
2040 } else {
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
2041 vid = NULL; /* vid will stay "ATA " */
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
2042 pid = model; /* model is all pid */
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
2043 }
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
2044
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
2045 if (vid)
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents: 10679
diff changeset
2046 (void) scsi_device_prop_update_inqstring(sd, INQUIRY_VENDOR_ID,
4582
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
2047 vid, strlen(vid));
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
2048 if (pid)
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents: 10679
diff changeset
2049 (void) scsi_device_prop_update_inqstring(sd, INQUIRY_PRODUCT_ID,
4582
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
2050 pid, strlen(pid));
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents: 10679
diff changeset
2051 (void) scsi_device_prop_update_inqstring(sd, INQUIRY_REVISION_ID,
4582
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
2052 fw, strlen(fw));
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
2053
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2054 return (DDI_SUCCESS);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2055 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2056
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2057 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2058 * Implementation of scsi tran_tgt_probe.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2059 * Probe target, by calling default scsi routine scsi_hba_probe()
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2060 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2061 static int
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2062 sata_scsi_tgt_probe(struct scsi_device *sd, int (*callback)(void))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2063 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2064 sata_hba_inst_t *sata_hba_inst =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2065 (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
2066 int rval;
10131
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
2067 uint32_t pm_cap;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2068
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2069 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
2070 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
2071 SATA_CAP_LOG_SENSE;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2072
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2073 if (rval == SCSIPROBE_EXISTS) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2074 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2075 * Set property "pm-capable" on the target device node, so that
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2076 * the target driver will not try to fetch scsi cycle counters
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2077 * before enabling device power-management.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2078 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2079 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
2080 "pm-capable", pm_cap)) != DDI_PROP_SUCCESS) {
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2081 sata_log(sata_hba_inst, CE_WARN,
4582
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
2082 "SATA device at port %d: "
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
2083 "will not be power-managed ",
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
2084 SCSI_TO_SATA_CPORT(sd->sd_address.a_target));
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2085 SATA_LOG_D((sata_hba_inst, CE_WARN,
4582
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
2086 "failure updating pm-capable property"));
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2087 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2088 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2089 return (rval);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2090 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2091
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2092 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2093 * Implementation of scsi tran_tgt_free.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2094 * Release all resources allocated for scsi_device
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2095 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2096 static void
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2097 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
2098 scsi_hba_tran_t *hba_tran, struct scsi_device *sd)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2099 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2100 #ifndef __lock_lint
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2101 _NOTE(ARGUNUSED(hba_dip))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2102 #endif
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2103 sata_device_t sata_device;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2104 sata_drive_info_t *sdinfo;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2105 sata_hba_inst_t *sata_hba_inst;
4876
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
2106 ddi_devid_t devid;
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 sata_hba_inst = (sata_hba_inst_t *)(hba_tran->tran_hba_private);
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 /* Validate scsi device address */
10391
12b08c516444 6838603 Under heavy I/O load, all Seagate Dragonfly drives in an x4x40 go offline at the same time
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 10318
diff changeset
2111 /*
12b08c516444 6838603 Under heavy I/O load, all Seagate Dragonfly drives in an x4x40 go offline at the same time
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 10318
diff changeset
2112 * Note: tgt_free relates to the SCSA view of a device. If called, there
12b08c516444 6838603 Under heavy I/O load, all Seagate Dragonfly drives in an x4x40 go offline at the same time
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 10318
diff changeset
2113 * was a device at this address, so even if the sata framework internal
12b08c516444 6838603 Under heavy I/O load, all Seagate Dragonfly drives in an x4x40 go offline at the same time
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 10318
diff changeset
2114 * resources were alredy released because a device was detached,
12b08c516444 6838603 Under heavy I/O load, all Seagate Dragonfly drives in an x4x40 go offline at the same time
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 10318
diff changeset
2115 * this function should be executed as long as its actions do
12b08c516444 6838603 Under heavy I/O load, all Seagate Dragonfly drives in an x4x40 go offline at the same time
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 10318
diff changeset
2116 * not require the internal sata view of a device and the address
12b08c516444 6838603 Under heavy I/O load, all Seagate Dragonfly drives in an x4x40 go offline at the same time
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 10318
diff changeset
2117 * refers to a valid sata address.
12b08c516444 6838603 Under heavy I/O load, all Seagate Dragonfly drives in an x4x40 go offline at the same time
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 10318
diff changeset
2118 * Validating the address here means that we do not trust SCSA...
12b08c516444 6838603 Under heavy I/O load, all Seagate Dragonfly drives in an x4x40 go offline at the same time
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 10318
diff changeset
2119 */
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2120 if (sata_validate_scsi_address(sata_hba_inst, &sd->sd_address,
10391
12b08c516444 6838603 Under heavy I/O load, all Seagate Dragonfly drives in an x4x40 go offline at the same time
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 10318
diff changeset
2121 &sata_device) == -1)
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2122 return;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2123
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2124 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2125 sata_device.satadev_addr.cport)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2126
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2127 /* sata_device now should contain a valid sata address */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2128 sdinfo = sata_get_device_info(sata_hba_inst, &sata_device);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2129 if (sdinfo == NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2130 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2131 sata_device.satadev_addr.cport)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2132 return;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2133 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2134 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2135 * 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
2136 * other than few properties.
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
2137 * Free them.
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
2138 */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
2139 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
2140 sata_device.satadev_addr.cport)));
5832
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
2141 (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
2142
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
2143 /*
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
2144 * 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
2145 * 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
2146 */
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
2147 if ((sdinfo->satadrv_type == SATA_DTYPE_ATADISK) &&
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
2148 (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
2149 "use-cmdk-devid-format", 0) == 1) &&
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
2150 (ddi_devid_get(tgt_dip, &devid) == DDI_SUCCESS)) {
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
2151 ddi_devid_unregister(tgt_dip);
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
2152 ddi_devid_free(devid);
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
2153 }
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2154 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2155
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2156 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2157 * Implementation of scsi tran_init_pkt
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2158 * Upon successful return, scsi pkt buffer has DMA resources allocated.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2159 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2160 * 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
2161 * for non-existing device - just use some default for dma_attr.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2162 * 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
2163 * Subsequent call to sata_scsi_start may fail appropriately.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2164 * Simply returning NULL does not seem to discourage a target driver...
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2165 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2166 * Returns a pointer to initialized scsi_pkt, or NULL otherwise.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2167 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2168 static struct scsi_pkt *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2169 sata_scsi_init_pkt(struct scsi_address *ap, struct scsi_pkt *pkt,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2170 struct buf *bp, int cmdlen, int statuslen, int tgtlen, int flags,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2171 int (*callback)(caddr_t), caddr_t arg)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2172 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2173 sata_hba_inst_t *sata_hba_inst =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2174 (sata_hba_inst_t *)(ap->a_hba_tran->tran_hba_private);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2175 dev_info_t *dip = SATA_DIP(sata_hba_inst);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2176 sata_device_t sata_device;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2177 sata_drive_info_t *sdinfo;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2178 sata_pkt_txlate_t *spx;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2179 ddi_dma_attr_t cur_dma_attr;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2180 int rval;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2181 boolean_t new_pkt = TRUE;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2182
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2183 ASSERT(ap->a_hba_tran->tran_hba_dip == dip);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2184
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2185 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2186 * We need to translate the address, even if it could be
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2187 * a bogus one, for a non-existing device
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2188 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2189 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
2190 sata_device.satadev_addr.cport = SCSI_TO_SATA_CPORT(ap->a_target);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2191 sata_device.satadev_addr.pmport = SCSI_TO_SATA_PMPORT(ap->a_target);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2192 sata_device.satadev_rev = SATA_DEVICE_REV;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2193
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2194 if (pkt == NULL) {
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 * Have to allocate a brand new scsi packet.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2197 * We need to operate with auto request sense enabled.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2198 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2199 pkt = scsi_hba_pkt_alloc(dip, ap, cmdlen,
11222
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
2200 MAX(statuslen, SATA_MAX_SENSE_LEN),
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2201 tgtlen, sizeof (sata_pkt_txlate_t), callback, arg);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2202
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2203 if (pkt == NULL)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2204 return (NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2205
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2206 /* Fill scsi packet structure */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2207 pkt->pkt_comp = (void (*)())NULL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2208 pkt->pkt_time = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2209 pkt->pkt_resid = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2210 pkt->pkt_statistics = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2211 pkt->pkt_reason = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2212
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2213 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2214 * pkt_hba_private will point to sata pkt txlate structure
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2215 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2216 spx = (sata_pkt_txlate_t *)pkt->pkt_ha_private;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2217 bzero(spx, sizeof (sata_pkt_txlate_t));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2218
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2219 spx->txlt_scsi_pkt = pkt;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2220 spx->txlt_sata_hba_inst = sata_hba_inst;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2221
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2222 /* Allocate sata_pkt */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2223 spx->txlt_sata_pkt = sata_pkt_alloc(spx, callback);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2224 if (spx->txlt_sata_pkt == NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2225 /* Could not allocate sata pkt */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2226 scsi_hba_pkt_free(ap, pkt);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2227 return (NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2228 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2229 /* 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
2230 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
2231 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
2232 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
2233 sata_device.satadev_rev;
1258
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 if ((bp == NULL) || (bp->b_bcount == 0))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2236 return (pkt);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2237
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2238 spx->txlt_total_residue = bp->b_bcount;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2239 } else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2240 new_pkt = FALSE;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2241 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2242 * Packet was preallocated/initialized by previous call
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2243 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2244 spx = (sata_pkt_txlate_t *)pkt->pkt_ha_private;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2245
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2246 if ((bp == NULL) || (bp->b_bcount == 0)) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2247 return (pkt);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2248 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2249
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2250 /* Pkt is available already: spx->txlt_scsi_pkt == pkt; */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2251 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2252
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2253 spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp = bp;
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 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2256 * We use an adjusted version of the dma_attr, to account
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2257 * for device addressing limitations.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2258 * sata_adjust_dma_attr() will handle sdinfo == NULL which may
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2259 * happen when a device is not yet configured.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2260 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2261 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2262 sata_device.satadev_addr.cport)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2263 sdinfo = sata_get_device_info(spx->txlt_sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2264 &spx->txlt_sata_pkt->satapkt_device);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2265 /* NULL sdinfo may be passsed to sata_adjust_dma_attr() */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2266 sata_adjust_dma_attr(sdinfo,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2267 SATA_DMA_ATTR(spx->txlt_sata_hba_inst), &cur_dma_attr);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2268 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2269 sata_device.satadev_addr.cport)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2270 /*
3935
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
2271 * 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
2272 * NOTE:
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
2273 * 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
2274 * 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
2275 * 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
2276 * returning correct packet residue is crucial.
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2277 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2278 if ((rval = sata_dma_buf_setup(spx, flags, callback, arg,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2279 &cur_dma_attr)) != DDI_SUCCESS) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2280 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2281 * If a DMA allocation request fails with
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2282 * DDI_DMA_NOMAPPING, indicate the error by calling
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2283 * bioerror(9F) with bp and an error code of EFAULT.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2284 * If a DMA allocation request fails with
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2285 * DDI_DMA_TOOBIG, indicate the error by calling
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2286 * 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
2287 * 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
2288 * Request may be repeated later - there is no real error.
1258
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 switch (rval) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2291 case DDI_DMA_NORESOURCES:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2292 bioerror(bp, 0);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2293 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2294 case DDI_DMA_NOMAPPING:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2295 case DDI_DMA_BADATTR:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2296 bioerror(bp, EFAULT);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2297 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2298 case DDI_DMA_TOOBIG:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2299 default:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2300 bioerror(bp, EINVAL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2301 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2302 }
7246
27944777b08c 6723493 sata: pf panic in sata_get_device_info with kmem_flags=0x2f/0x3f
pawelw
parents: 7152
diff changeset
2303 if (new_pkt == TRUE) {
27944777b08c 6723493 sata: pf panic in sata_get_device_info with kmem_flags=0x2f/0x3f
pawelw
parents: 7152
diff changeset
2304 /*
27944777b08c 6723493 sata: pf panic in sata_get_device_info with kmem_flags=0x2f/0x3f
pawelw
parents: 7152
diff changeset
2305 * 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
2306 * everything
27944777b08c 6723493 sata: pf panic in sata_get_device_info with kmem_flags=0x2f/0x3f
pawelw
parents: 7152
diff changeset
2307 */
27944777b08c 6723493 sata: pf panic in sata_get_device_info with kmem_flags=0x2f/0x3f
pawelw
parents: 7152
diff changeset
2308 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
2309 } else {
27944777b08c 6723493 sata: pf panic in sata_get_device_info with kmem_flags=0x2f/0x3f
pawelw
parents: 7152
diff changeset
2310 /*
27944777b08c 6723493 sata: pf panic in sata_get_device_info with kmem_flags=0x2f/0x3f
pawelw
parents: 7152
diff changeset
2311 * 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
2312 * 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
2313 * will free allocated resources).
27944777b08c 6723493 sata: pf panic in sata_get_device_info with kmem_flags=0x2f/0x3f
pawelw
parents: 7152
diff changeset
2314 * 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
2315 * 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
2316 * be retried.
27944777b08c 6723493 sata: pf panic in sata_get_device_info with kmem_flags=0x2f/0x3f
pawelw
parents: 7152
diff changeset
2317 */
27944777b08c 6723493 sata: pf panic in sata_get_device_info with kmem_flags=0x2f/0x3f
pawelw
parents: 7152
diff changeset
2318 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
2319 sata_pkt_free(spx);
27944777b08c 6723493 sata: pf panic in sata_get_device_info with kmem_flags=0x2f/0x3f
pawelw
parents: 7152
diff changeset
2320 }
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2321 return (NULL);
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 /* Set number of bytes that are not yet accounted for */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2324 pkt->pkt_resid = spx->txlt_total_residue;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2325 ASSERT(pkt->pkt_resid >= 0);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2326
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2327 return (pkt);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2328 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2329
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2330 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2331 * Implementation of scsi tran_start.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2332 * 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
2333 * 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
2334 * are supported.
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
2335 * For SATA hard disks, supported scsi commands:
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2336 * SCMD_INQUIRY
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2337 * SCMD_TEST_UNIT_READY
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2338 * SCMD_START_STOP
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2339 * SCMD_READ_CAPACITY
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2340 * SCMD_REQUEST_SENSE
1781
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
2341 * SCMD_LOG_SENSE_G1
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
2342 * SCMD_LOG_SELECT_G1
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2343 * SCMD_MODE_SENSE (specific pages)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2344 * SCMD_MODE_SENSE_G1 (specific pages)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2345 * SCMD_MODE_SELECT (specific pages)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2346 * SCMD_MODE_SELECT_G1 (specific pages)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2347 * SCMD_SYNCHRONIZE_CACHE
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2348 * SCMD_SYNCHRONIZE_CACHE_G1
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2349 * SCMD_READ
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2350 * SCMD_READ_G1
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2351 * SCMD_READ_G4
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2352 * SCMD_READ_G5
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2353 * SCMD_WRITE
4014
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
2354 * SCMD_WRITE_BUFFER
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2355 * SCMD_WRITE_G1
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2356 * SCMD_WRITE_G4
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2357 * SCMD_WRITE_G5
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2358 * SCMD_SEEK (noop)
1940
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
2359 * SCMD_SDIAG
1258
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 * All other commands are rejected as unsupported.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2362 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2363 * Returns:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2364 * 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
2365 * 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
2366 * a callback could be scheduled.
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2367 * TRAN_BADPKT if cmd was directed to invalid address.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2368 * 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
2369 * 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
2370 * was removed and there was no callback specified in scsi pkt.
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2371 * 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
2372 * framework was busy performing some other operation(s).
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2373 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2374 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2375 static int
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2376 sata_scsi_start(struct scsi_address *ap, struct scsi_pkt *pkt)
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 sata_hba_inst_t *sata_hba_inst =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2379 (sata_hba_inst_t *)(ap->a_hba_tran->tran_hba_private);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2380 sata_pkt_txlate_t *spx = (sata_pkt_txlate_t *)pkt->pkt_ha_private;
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
2381 sata_device_t *sdevice = &spx->txlt_sata_pkt->satapkt_device;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2382 sata_drive_info_t *sdinfo;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2383 struct buf *bp;
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
2384 uint8_t cport, pmport;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
2385 boolean_t dev_gone = B_FALSE;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2386 int rval;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2387
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2388 SATADBG1(SATA_DBG_SCSI_IF, sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2389 "sata_scsi_start: cmd 0x%02x\n", pkt->pkt_cdbp[0]);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2390
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2391 ASSERT(spx != NULL &&
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2392 spx->txlt_scsi_pkt == pkt && spx->txlt_sata_pkt != NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2393
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2394 cport = SCSI_TO_SATA_CPORT(ap->a_target);
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
2395 pmport = SCSI_TO_SATA_PMPORT(ap->a_target);
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2396
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2397 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
2398
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
2399 if (sdevice->satadev_addr.qual == SATA_ADDR_DCPORT) {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
2400 sdinfo = sata_get_device_info(sata_hba_inst, sdevice);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
2401 if (sdinfo == NULL ||
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
2402 SATA_CPORT_INFO(sata_hba_inst, cport)->
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
2403 cport_tgtnode_clean == B_FALSE ||
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
2404 (sdinfo->satadrv_state & SATA_DSTATE_FAILED) != 0) {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
2405 dev_gone = B_TRUE;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
2406 }
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
2407 } else if (sdevice->satadev_addr.qual == SATA_ADDR_DPMPORT) {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
2408 if (SATA_CPORT_DEV_TYPE(sata_hba_inst, cport) !=
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
2409 SATA_DTYPE_PMULT || SATA_PMULT_INFO(sata_hba_inst,
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
2410 cport) == NULL) {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
2411 dev_gone = B_TRUE;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
2412 } else if (SATA_PMPORT_INFO(sata_hba_inst, cport,
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
2413 pmport) == NULL) {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
2414 dev_gone = B_TRUE;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
2415 } else {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
2416 mutex_enter(&(SATA_PMPORT_MUTEX(sata_hba_inst,
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
2417 cport, pmport)));
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
2418 sdinfo = sata_get_device_info(sata_hba_inst, sdevice);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
2419 if (sdinfo == NULL ||
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
2420 SATA_PMPORT_INFO(sata_hba_inst, cport, pmport)->
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
2421 pmport_tgtnode_clean == B_FALSE ||
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
2422 (sdinfo->satadrv_state & SATA_DSTATE_FAILED) != 0) {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
2423 dev_gone = B_TRUE;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
2424 }
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
2425 mutex_exit(&(SATA_PMPORT_MUTEX(sata_hba_inst,
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
2426 cport, pmport)));
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
2427 }
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
2428 }
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
2429
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
2430 if (dev_gone == B_TRUE) {
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2431 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
2432 pkt->pkt_reason = CMD_DEV_GONE;
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
2433 /*
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
2434 * 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
2435 * 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
2436 * in the dump code path.
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
2437 * 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
2438 * 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
2439 */
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
2440 if (pkt->pkt_comp != NULL) {
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
2441 /* scsi callback required */
11853
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
2442 if (servicing_interrupt()) {
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
2443 if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
2444 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
2445 (void *)spx->txlt_scsi_pkt, TQ_NOSLEEP) ==
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
2446 NULL) {
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
2447 return (TRAN_BUSY);
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
2448 }
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
2449 } else if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
2450 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
2451 (void *)spx->txlt_scsi_pkt, TQ_SLEEP) == NULL) {
3935
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
2452 /* Scheduling the callback failed */
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
2453 return (TRAN_BUSY);
11853
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
2454 }
3935
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
2455 return (TRAN_ACCEPT);
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
2456 }
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
2457 /* No callback available */
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2458 return (TRAN_FATAL_ERROR);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2459 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2460
8010
95c42a8a213e 6703522 ahci driver needs to support SATA tape
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 7954
diff changeset
2461 if (sdinfo->satadrv_type & SATA_DTYPE_ATAPI) {
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2462 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2463 rval = sata_txlt_atapi(spx);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2464 SATADBG1(SATA_DBG_SCSI_IF, sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2465 "sata_scsi_start atapi: rval %d\n", rval);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2466 return (rval);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2467 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2468 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2469
10131
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
2470 /*
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
2471 * 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
2472 * 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
2473 * of processing media access command. And
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
2474 * 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
2475 * 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
2476 */
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
2477 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
2478 (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
2479 (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
2480 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
2481 SD_SCSI_ASC_LU_NOT_READY));
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
2482 }
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
2483
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2484 /* ATA Disk commands processing starts here */
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 bp = spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2487
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2488 switch (pkt->pkt_cdbp[0]) {
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 case SCMD_INQUIRY:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2491 /* Mapped to identify device */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2492 if (bp != NULL && (bp->b_flags & (B_PHYS | B_PAGEIO)))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2493 bp_mapin(bp);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2494 rval = sata_txlt_inquiry(spx);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2495 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2496
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2497 case SCMD_TEST_UNIT_READY:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2498 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2499 * SAT "SATA to ATA Translation" doc specifies translation
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2500 * to ATA CHECK POWER MODE.
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 rval = sata_txlt_test_unit_ready(spx);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2503 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2504
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2505 case SCMD_START_STOP:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2506 /* Mapping depends on the command */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2507 rval = sata_txlt_start_stop_unit(spx);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2508 break;
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 case SCMD_READ_CAPACITY:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2511 if (bp != NULL && (bp->b_flags & (B_PHYS | B_PAGEIO)))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2512 bp_mapin(bp);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2513 rval = sata_txlt_read_capacity(spx);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2514 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2515
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2516 case SCMD_REQUEST_SENSE:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2517 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2518 * Always No Sense, since we force ARQ
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2519 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2520 if (bp != NULL && (bp->b_flags & (B_PHYS | B_PAGEIO)))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2521 bp_mapin(bp);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2522 rval = sata_txlt_request_sense(spx);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2523 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2524
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2525 case SCMD_LOG_SENSE_G1:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2526 if (bp != NULL && (bp->b_flags & (B_PHYS | B_PAGEIO)))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2527 bp_mapin(bp);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2528 rval = sata_txlt_log_sense(spx);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2529 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2530
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2531 case SCMD_LOG_SELECT_G1:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2532 if (bp != NULL && (bp->b_flags & (B_PHYS | B_PAGEIO)))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2533 bp_mapin(bp);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2534 rval = sata_txlt_log_select(spx);
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
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2537 case SCMD_MODE_SENSE:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2538 case SCMD_MODE_SENSE_G1:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2539 if (bp != NULL && (bp->b_flags & (B_PHYS | B_PAGEIO)))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2540 bp_mapin(bp);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2541 rval = sata_txlt_mode_sense(spx);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2542 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2543
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2544
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2545 case SCMD_MODE_SELECT:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2546 case SCMD_MODE_SELECT_G1:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2547 if (bp != NULL && (bp->b_flags & (B_PHYS | B_PAGEIO)))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2548 bp_mapin(bp);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2549 rval = sata_txlt_mode_select(spx);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2550 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2551
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2552 case SCMD_SYNCHRONIZE_CACHE:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2553 case SCMD_SYNCHRONIZE_CACHE_G1:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2554 rval = sata_txlt_synchronize_cache(spx);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2555 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2556
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2557 case SCMD_READ:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2558 case SCMD_READ_G1:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2559 case SCMD_READ_G4:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2560 case SCMD_READ_G5:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2561 rval = sata_txlt_read(spx);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2562 break;
4014
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
2563 case SCMD_WRITE_BUFFER:
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
2564 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
2565 bp_mapin(bp);
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
2566 rval = sata_txlt_write_buffer(spx);
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
2567 break;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2568
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2569 case SCMD_WRITE:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2570 case SCMD_WRITE_G1:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2571 case SCMD_WRITE_G4:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2572 case SCMD_WRITE_G5:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2573 rval = sata_txlt_write(spx);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2574 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2575
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2576 case SCMD_SEEK:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2577 rval = sata_txlt_nodata_cmd_immediate(spx);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2578 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2579
11222
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
2580 case SPC3_CMD_ATA_COMMAND_PASS_THROUGH12:
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
2581 case SPC3_CMD_ATA_COMMAND_PASS_THROUGH16:
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
2582 if (bp != NULL && (bp->b_flags & (B_PHYS | B_PAGEIO)))
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
2583 bp_mapin(bp);
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
2584 rval = sata_txlt_ata_pass_thru(spx);
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
2585 break;
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
2586
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2587 /* Other cases will be filed later */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2588 /* postponed until phase 2 of the development */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2589 default:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2590 rval = sata_txlt_invalid_command(spx);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2591 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2592 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2593
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2594 SATADBG1(SATA_DBG_SCSI_IF, sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2595 "sata_scsi_start: rval %d\n", rval);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2596
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2597 return (rval);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2598 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2599
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 * Implementation of scsi tran_abort.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2602 * Abort specific pkt or all packets.
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 * Returns 1 if one or more packets were aborted, returns 0 otherwise
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2605 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2606 * May be called from an interrupt level.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2607 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2608 static int
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2609 sata_scsi_abort(struct scsi_address *ap, struct scsi_pkt *scsi_pkt)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2610 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2611 sata_hba_inst_t *sata_hba_inst =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2612 (sata_hba_inst_t *)(ap->a_hba_tran->tran_hba_private);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2613 sata_device_t sata_device;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2614 sata_pkt_t *sata_pkt;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2615
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2616 SATADBG2(SATA_DBG_SCSI_IF, sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2617 "sata_scsi_abort: %s at target: 0x%x\n",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2618 scsi_pkt == NULL ? "all packets" : "one pkt", ap->a_target);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2619
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2620 /* Validate address */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2621 if (sata_validate_scsi_address(sata_hba_inst, ap, &sata_device) != 0)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2622 /* Invalid address */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2623 return (0);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2624
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2625 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2626 sata_device.satadev_addr.cport)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2627 if (sata_get_device_info(sata_hba_inst, &sata_device) == NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2628 /* invalid address */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2629 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2630 sata_device.satadev_addr.cport)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2631 return (0);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2632 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2633 if (scsi_pkt == NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2634 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2635 * Abort all packets.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2636 * Although we do not have specific packet, we still need
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2637 * dummy packet structure to pass device address to HBA.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2638 * Allocate one, without sleeping. Fail if pkt cannot be
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2639 * allocated.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2640 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2641 sata_pkt = kmem_zalloc(sizeof (sata_pkt_t), KM_NOSLEEP);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2642 if (sata_pkt == NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2643 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2644 sata_device.satadev_addr.cport)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2645 SATA_LOG_D((sata_hba_inst, CE_WARN, "sata_pkt_abort: "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2646 "could not allocate sata_pkt"));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2647 return (0);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2648 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2649 sata_pkt->satapkt_rev = SATA_PKT_REV;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2650 sata_pkt->satapkt_device = sata_device;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2651 sata_pkt->satapkt_device.satadev_rev = SATA_DEVICE_REV;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2652 } else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2653 if (scsi_pkt->pkt_ha_private == NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2654 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2655 sata_device.satadev_addr.cport)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2656 return (0); /* Bad scsi pkt */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2657 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2658 /* extract pointer to sata pkt */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2659 sata_pkt = ((sata_pkt_txlate_t *)scsi_pkt->pkt_ha_private)->
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2660 txlt_sata_pkt;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2661 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2662
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2663 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2664 sata_device.satadev_addr.cport)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2665 /* Send abort request to HBA */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2666 if ((*SATA_ABORT_FUNC(sata_hba_inst))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2667 (SATA_DIP(sata_hba_inst), sata_pkt,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2668 scsi_pkt == NULL ? SATA_ABORT_ALL_PACKETS : SATA_ABORT_PACKET) ==
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2669 SATA_SUCCESS) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2670 if (scsi_pkt == NULL)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2671 kmem_free(sata_pkt, sizeof (sata_pkt_t));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2672 /* Success */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2673 return (1);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2674 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2675 /* Else, something did not go right */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2676 if (scsi_pkt == NULL)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2677 kmem_free(sata_pkt, sizeof (sata_pkt_t));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2678 /* Failure */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2679 return (0);
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 /*
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
2684 * Implementation of scsi tran_reset.
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2685 * RESET_ALL request is translated into port reset.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2686 * RESET_TARGET requests is translated into a device reset,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2687 * RESET_LUN request is accepted only for LUN 0 and translated into
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2688 * device reset.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2689 * The target reset should cause all HBA active and queued packets to
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2690 * be terminated and returned with pkt reason SATA_PKT_RESET prior to
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2691 * the return. HBA should report reset event for the device.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2692 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2693 * Returns 1 upon success, 0 upon failure.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2694 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2695 static int
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2696 sata_scsi_reset(struct scsi_address *ap, int level)
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 sata_hba_inst_t *sata_hba_inst =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2699 (sata_hba_inst_t *)(ap->a_hba_tran->tran_hba_private);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2700 sata_device_t sata_device;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2701 int val;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2702
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2703 SATADBG2(SATA_DBG_SCSI_IF, sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2704 "sata_scsi_reset: level %d target: 0x%x\n",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2705 level, ap->a_target);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2706
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2707 /* Validate address */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2708 val = sata_validate_scsi_address(sata_hba_inst, ap, &sata_device);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2709 if (val == -1)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2710 /* Invalid address */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2711 return (0);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2712
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2713 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2714 sata_device.satadev_addr.cport)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2715 if (sata_get_device_info(sata_hba_inst, &sata_device) == NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2716 /* invalid address */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2717 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2718 sata_device.satadev_addr.cport)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2719 return (0);
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 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2722 sata_device.satadev_addr.cport)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2723 if (level == RESET_ALL) {
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
2724 /* port reset */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
2725 if (sata_device.satadev_addr.qual == SATA_ADDR_DCPORT)
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
2726 sata_device.satadev_addr.qual = SATA_ADDR_CPORT;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
2727 else
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
2728 sata_device.satadev_addr.qual = SATA_ADDR_PMPORT;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
2729
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2730 if ((*SATA_RESET_DPORT_FUNC(sata_hba_inst))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2731 (SATA_DIP(sata_hba_inst), &sata_device) == SATA_SUCCESS)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2732 return (1);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2733 else
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2734 return (0);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2735
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2736 } else if (val == 0 &&
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2737 (level == RESET_TARGET || level == RESET_LUN)) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2738 /* reset device (device attached) */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2739 if ((*SATA_RESET_DPORT_FUNC(sata_hba_inst))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2740 (SATA_DIP(sata_hba_inst), &sata_device) == SATA_SUCCESS)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2741 return (1);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2742 else
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2743 return (0);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2744 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2745 return (0);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2746 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2747
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2748
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2749 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2750 * Implementation of scsi tran_getcap (get transport/device capabilities).
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
2751 * Supported capabilities for SATA hard disks:
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2752 * auto-rqsense (always supported)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2753 * 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
2754 * 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
2755 * caching behavior allowing untagged queuing actually
624f674f2ad8 6430966 SATA NCQ support is needed in SATA framework and hba drivers
ls24207
parents: 2539
diff changeset
2756 * 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
2757 * 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
2758 * 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
2759 * 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
2760 * results in cache thrashing.)
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
2761 * sector_size
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
2762 * dma_max
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
2763 * interconnect-type (INTERCONNECT_SATA)
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
2764 *
8010
95c42a8a213e 6703522 ahci driver needs to support SATA tape
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 7954
diff changeset
2765 * Supported capabilities for ATAPI CD/DVD devices:
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
2766 * auto-rqsense (always supported)
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
2767 * sector_size
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2768 * dma_max
8010
95c42a8a213e 6703522 ahci driver needs to support SATA tape
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 7954
diff changeset
2769 * max-cdb-length
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2770 * interconnect-type (INTERCONNECT_SATA)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2771 *
8010
95c42a8a213e 6703522 ahci driver needs to support SATA tape
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 7954
diff changeset
2772 * 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
2773 * 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
2774 * dma_max
95c42a8a213e 6703522 ahci driver needs to support SATA tape
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 7954
diff changeset
2775 * max-cdb-length
95c42a8a213e 6703522 ahci driver needs to support SATA tape
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 7954
diff changeset
2776 *
8317
249d7b80428e 6767262 ahci driver should support Dell PowerVault RD1000 backup device
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 8168
diff changeset
2777 * 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
2778 * 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
2779 * 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
2780 * 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
2781 *
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2782 * Request for other capabilities is rejected as unsupported.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2783 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2784 * 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
2785 * the address is invalid - no device.
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2786 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2787
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2788 static int
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2789 sata_scsi_getcap(struct scsi_address *ap, char *cap, int whom)
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
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2792 sata_hba_inst_t *sata_hba_inst =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2793 (sata_hba_inst_t *)(ap->a_hba_tran->tran_hba_private);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2794 sata_device_t sata_device;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2795 sata_drive_info_t *sdinfo;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2796 ddi_dma_attr_t adj_dma_attr;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2797 int rval;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2798
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2799 SATADBG2(SATA_DBG_SCSI_IF, sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2800 "sata_scsi_getcap: target: 0x%x, cap: %s\n",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2801 ap->a_target, cap);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2802
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2803 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2804 * We want to process the capabilities on per port granularity.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2805 * So, we are specifically restricting ourselves to whom != 0
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2806 * to exclude the controller wide handling.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2807 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2808 if (cap == NULL || whom == 0)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2809 return (-1);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2810
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2811 if (sata_validate_scsi_address(sata_hba_inst, ap, &sata_device) != 0) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2812 /* Invalid address */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2813 return (-1);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2814 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2815 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2816 sata_device.satadev_addr.cport)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2817 if ((sdinfo = sata_get_device_info(sata_hba_inst, &sata_device)) ==
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2818 NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2819 /* invalid address */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2820 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2821 sata_device.satadev_addr.cport)));
3821
2c5d11a65307 6498799 marvell88sx driver/hardware wedges when doing multiple concurrent tagged commands
ls24207
parents: 3116
diff changeset
2822 return (-1);
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2823 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2824
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2825 switch (scsi_hba_lookup_capstr(cap)) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2826 case SCSI_CAP_ARQ:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2827 rval = 1; /* ARQ supported, turned on */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2828 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2829
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2830 case SCSI_CAP_SECTOR_SIZE:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2831 if (sdinfo->satadrv_type == SATA_DTYPE_ATADISK)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2832 rval = SATA_DISK_SECTOR_SIZE; /* fixed size */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2833 else if (sdinfo->satadrv_type == SATA_DTYPE_ATAPICD)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2834 rval = SATA_ATAPI_SECTOR_SIZE;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2835 else rval = -1;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2836 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2837
2553
624f674f2ad8 6430966 SATA NCQ support is needed in SATA framework and hba drivers
ls24207
parents: 2539
diff changeset
2838 /*
624f674f2ad8 6430966 SATA NCQ support is needed in SATA framework and hba drivers
ls24207
parents: 2539
diff changeset
2839 * 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
2840 * 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
2841 * use it when available.
624f674f2ad8 6430966 SATA NCQ support is needed in SATA framework and hba drivers
ls24207
parents: 2539
diff changeset
2842 */
624f674f2ad8 6430966 SATA NCQ support is needed in SATA framework and hba drivers
ls24207
parents: 2539
diff changeset
2843 case SCSI_CAP_UNTAGGED_QING:
3821
2c5d11a65307 6498799 marvell88sx driver/hardware wedges when doing multiple concurrent tagged commands
ls24207
parents: 3116
diff changeset
2844 if (sdinfo->satadrv_features_enabled &
2c5d11a65307 6498799 marvell88sx driver/hardware wedges when doing multiple concurrent tagged commands
ls24207
parents: 3116
diff changeset
2845 SATA_DEV_F_E_UNTAGGED_QING)
2c5d11a65307 6498799 marvell88sx driver/hardware wedges when doing multiple concurrent tagged commands
ls24207
parents: 3116
diff changeset
2846 rval = 1; /* Untagged queuing available */
2553
624f674f2ad8 6430966 SATA NCQ support is needed in SATA framework and hba drivers
ls24207
parents: 2539
diff changeset
2847 else
3821
2c5d11a65307 6498799 marvell88sx driver/hardware wedges when doing multiple concurrent tagged commands
ls24207
parents: 3116
diff changeset
2848 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
2849 break;
624f674f2ad8 6430966 SATA NCQ support is needed in SATA framework and hba drivers
ls24207
parents: 2539
diff changeset
2850
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2851 case SCSI_CAP_TAGGED_QING:
5014
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
2852 if ((sdinfo->satadrv_features_enabled &
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
2853 SATA_DEV_F_E_TAGGED_QING) &&
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
2854 (sdinfo->satadrv_max_queue_depth > 1))
3821
2c5d11a65307 6498799 marvell88sx driver/hardware wedges when doing multiple concurrent tagged commands
ls24207
parents: 3116
diff changeset
2855 rval = 1; /* Tagged queuing available */
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2856 else
3821
2c5d11a65307 6498799 marvell88sx driver/hardware wedges when doing multiple concurrent tagged commands
ls24207
parents: 3116
diff changeset
2857 rval = -1; /* Tagged queuing not available */
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2858 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2859
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2860 case SCSI_CAP_DMA_MAX:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2861 sata_adjust_dma_attr(sdinfo, SATA_DMA_ATTR(sata_hba_inst),
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2862 &adj_dma_attr);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2863 rval = (int)adj_dma_attr.dma_attr_maxxfer;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2864 /* We rely on the fact that dma_attr_maxxfer < 0x80000000 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2865 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2866
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2867 case SCSI_CAP_INTERCONNECT_TYPE:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2868 rval = INTERCONNECT_SATA; /* SATA interconnect type */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2869 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2870
8010
95c42a8a213e 6703522 ahci driver needs to support SATA tape
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 7954
diff changeset
2871 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
2872 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
2873 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
2874 else
95c42a8a213e 6703522 ahci driver needs to support SATA tape
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 7954
diff changeset
2875 rval = -1;
95c42a8a213e 6703522 ahci driver needs to support SATA tape
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 7954
diff changeset
2876 break;
95c42a8a213e 6703522 ahci driver needs to support SATA tape
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 7954
diff changeset
2877
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2878 default:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2879 rval = -1;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2880 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2881 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2882 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2883 sata_device.satadev_addr.cport)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2884 return (rval);
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 * Implementation of scsi tran_setcap
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
2889 *
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
2890 * 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
2891 *
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2892 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2893 static int
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2894 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
2895 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2896 sata_hba_inst_t *sata_hba_inst =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2897 (sata_hba_inst_t *)(ap->a_hba_tran->tran_hba_private);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2898 sata_device_t sata_device;
3821
2c5d11a65307 6498799 marvell88sx driver/hardware wedges when doing multiple concurrent tagged commands
ls24207
parents: 3116
diff changeset
2899 sata_drive_info_t *sdinfo;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2900 int rval;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2901
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2902 SATADBG2(SATA_DBG_SCSI_IF, sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2903 "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
2904
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2905 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2906 * We want to process the capabilities on per port granularity.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2907 * So, we are specifically restricting ourselves to whom != 0
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2908 * to exclude the controller wide handling.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2909 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2910 if (cap == NULL || whom == 0) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2911 return (-1);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2912 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2913
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2914 if (sata_validate_scsi_address(sata_hba_inst, ap, &sata_device) != 0) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2915 /* Invalid address */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2916 return (-1);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2917 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2918 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2919 sata_device.satadev_addr.cport)));
4582
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
2920 if ((sdinfo = sata_get_device_info(sata_hba_inst,
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
2921 &sata_device)) == NULL) {
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2922 /* invalid address */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2923 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2924 sata_device.satadev_addr.cport)));
3821
2c5d11a65307 6498799 marvell88sx driver/hardware wedges when doing multiple concurrent tagged commands
ls24207
parents: 3116
diff changeset
2925 return (-1);
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2926 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2927 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2928 sata_device.satadev_addr.cport)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2929
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2930 switch (scsi_hba_lookup_capstr(cap)) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2931 case SCSI_CAP_ARQ:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2932 case SCSI_CAP_SECTOR_SIZE:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2933 case SCSI_CAP_DMA_MAX:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2934 case SCSI_CAP_INTERCONNECT_TYPE:
3821
2c5d11a65307 6498799 marvell88sx driver/hardware wedges when doing multiple concurrent tagged commands
ls24207
parents: 3116
diff changeset
2935 rval = 0;
2c5d11a65307 6498799 marvell88sx driver/hardware wedges when doing multiple concurrent tagged commands
ls24207
parents: 3116
diff changeset
2936 break;
2553
624f674f2ad8 6430966 SATA NCQ support is needed in SATA framework and hba drivers
ls24207
parents: 2539
diff changeset
2937 case SCSI_CAP_UNTAGGED_QING:
3821
2c5d11a65307 6498799 marvell88sx driver/hardware wedges when doing multiple concurrent tagged commands
ls24207
parents: 3116
diff changeset
2938 if (SATA_QDEPTH(sata_hba_inst) > 1) {
2c5d11a65307 6498799 marvell88sx driver/hardware wedges when doing multiple concurrent tagged commands
ls24207
parents: 3116
diff changeset
2939 rval = 1;
2c5d11a65307 6498799 marvell88sx driver/hardware wedges when doing multiple concurrent tagged commands
ls24207
parents: 3116
diff changeset
2940 if (value == 1) {
2c5d11a65307 6498799 marvell88sx driver/hardware wedges when doing multiple concurrent tagged commands
ls24207
parents: 3116
diff changeset
2941 sdinfo->satadrv_features_enabled |=
4582
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
2942 SATA_DEV_F_E_UNTAGGED_QING;
3821
2c5d11a65307 6498799 marvell88sx driver/hardware wedges when doing multiple concurrent tagged commands
ls24207
parents: 3116
diff changeset
2943 } else if (value == 0) {
2c5d11a65307 6498799 marvell88sx driver/hardware wedges when doing multiple concurrent tagged commands
ls24207
parents: 3116
diff changeset
2944 sdinfo->satadrv_features_enabled &=
4582
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
2945 ~SATA_DEV_F_E_UNTAGGED_QING;
3821
2c5d11a65307 6498799 marvell88sx driver/hardware wedges when doing multiple concurrent tagged commands
ls24207
parents: 3116
diff changeset
2946 } else {
2c5d11a65307 6498799 marvell88sx driver/hardware wedges when doing multiple concurrent tagged commands
ls24207
parents: 3116
diff changeset
2947 rval = -1;
2c5d11a65307 6498799 marvell88sx driver/hardware wedges when doing multiple concurrent tagged commands
ls24207
parents: 3116
diff changeset
2948 }
2c5d11a65307 6498799 marvell88sx driver/hardware wedges when doing multiple concurrent tagged commands
ls24207
parents: 3116
diff changeset
2949 } else {
2c5d11a65307 6498799 marvell88sx driver/hardware wedges when doing multiple concurrent tagged commands
ls24207
parents: 3116
diff changeset
2950 rval = 0;
2c5d11a65307 6498799 marvell88sx driver/hardware wedges when doing multiple concurrent tagged commands
ls24207
parents: 3116
diff changeset
2951 }
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2952 break;
3821
2c5d11a65307 6498799 marvell88sx driver/hardware wedges when doing multiple concurrent tagged commands
ls24207
parents: 3116
diff changeset
2953 case SCSI_CAP_TAGGED_QING:
2c5d11a65307 6498799 marvell88sx driver/hardware wedges when doing multiple concurrent tagged commands
ls24207
parents: 3116
diff changeset
2954 /* This can TCQ or NCQ */
2c5d11a65307 6498799 marvell88sx driver/hardware wedges when doing multiple concurrent tagged commands
ls24207
parents: 3116
diff changeset
2955 if (sata_func_enable & SATA_ENABLE_QUEUING &&
2c5d11a65307 6498799 marvell88sx driver/hardware wedges when doing multiple concurrent tagged commands
ls24207
parents: 3116
diff changeset
2956 ((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
2957 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
2958 (sata_func_enable & SATA_ENABLE_NCQ &&
2c5d11a65307 6498799 marvell88sx driver/hardware wedges when doing multiple concurrent tagged commands
ls24207
parents: 3116
diff changeset
2959 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
2960 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
2961 (sdinfo->satadrv_max_queue_depth > 1)) {
3821
2c5d11a65307 6498799 marvell88sx driver/hardware wedges when doing multiple concurrent tagged commands
ls24207
parents: 3116
diff changeset
2962 rval = 1;
2c5d11a65307 6498799 marvell88sx driver/hardware wedges when doing multiple concurrent tagged commands
ls24207
parents: 3116
diff changeset
2963 if (value == 1) {
2c5d11a65307 6498799 marvell88sx driver/hardware wedges when doing multiple concurrent tagged commands
ls24207
parents: 3116
diff changeset
2964 sdinfo->satadrv_features_enabled |=
4582
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
2965 SATA_DEV_F_E_TAGGED_QING;
3821
2c5d11a65307 6498799 marvell88sx driver/hardware wedges when doing multiple concurrent tagged commands
ls24207
parents: 3116
diff changeset
2966 } else if (value == 0) {
2c5d11a65307 6498799 marvell88sx driver/hardware wedges when doing multiple concurrent tagged commands
ls24207
parents: 3116
diff changeset
2967 sdinfo->satadrv_features_enabled &=
4582
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
2968 ~SATA_DEV_F_E_TAGGED_QING;
3821
2c5d11a65307 6498799 marvell88sx driver/hardware wedges when doing multiple concurrent tagged commands
ls24207
parents: 3116
diff changeset
2969 } else {
2c5d11a65307 6498799 marvell88sx driver/hardware wedges when doing multiple concurrent tagged commands
ls24207
parents: 3116
diff changeset
2970 rval = -1;
2c5d11a65307 6498799 marvell88sx driver/hardware wedges when doing multiple concurrent tagged commands
ls24207
parents: 3116
diff changeset
2971 }
2c5d11a65307 6498799 marvell88sx driver/hardware wedges when doing multiple concurrent tagged commands
ls24207
parents: 3116
diff changeset
2972 } else {
2c5d11a65307 6498799 marvell88sx driver/hardware wedges when doing multiple concurrent tagged commands
ls24207
parents: 3116
diff changeset
2973 rval = 0;
2c5d11a65307 6498799 marvell88sx driver/hardware wedges when doing multiple concurrent tagged commands
ls24207
parents: 3116
diff changeset
2974 }
2c5d11a65307 6498799 marvell88sx driver/hardware wedges when doing multiple concurrent tagged commands
ls24207
parents: 3116
diff changeset
2975 break;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2976 default:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2977 rval = -1;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2978 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2979 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2980 return (rval);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2981 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2982
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2983 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2984 * Implementations of scsi tran_destroy_pkt.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2985 * Free resources allocated by sata_scsi_init_pkt()
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2986 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2987 static void
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2988 sata_scsi_destroy_pkt(struct scsi_address *ap, struct scsi_pkt *pkt)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2989 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2990 sata_pkt_txlate_t *spx;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2991
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2992 spx = (sata_pkt_txlate_t *)pkt->pkt_ha_private;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2993
7152
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
2994 sata_common_free_dma_rsrcs(spx);
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
2995
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2996 spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp = NULL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2997 sata_pkt_free(spx);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2998
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2999 scsi_hba_pkt_free(ap, pkt);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3000 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3001
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3002 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3003 * Implementation of scsi tran_dmafree.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3004 * Free DMA resources allocated by sata_scsi_init_pkt()
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3005 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3006
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3007 static void
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3008 sata_scsi_dmafree(struct scsi_address *ap, struct scsi_pkt *pkt)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3009 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3010 #ifndef __lock_lint
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3011 _NOTE(ARGUNUSED(ap))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3012 #endif
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3013 sata_pkt_txlate_t *spx;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3014
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3015 ASSERT(pkt != NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3016 spx = (sata_pkt_txlate_t *)pkt->pkt_ha_private;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3017
7152
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
3018 sata_common_free_dma_rsrcs(spx);
1258
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 * Implementation of scsi tran_sync_pkt.
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 * 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
3025 *
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
3026 * 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
3027 * into/from the real buffer.
1258
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 static void
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3030 sata_scsi_sync_pkt(struct scsi_address *ap, struct scsi_pkt *pkt)
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 #ifndef __lock_lint
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3033 _NOTE(ARGUNUSED(ap))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3034 #endif
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3035 int rval;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3036 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
3037 struct buf *bp;
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
3038 int direction;
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
3039
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
3040 ASSERT(spx != NULL);
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3041 if (spx->txlt_buf_dma_handle != NULL) {
2539
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
3042 direction = spx->txlt_sata_pkt->
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
3043 satapkt_cmd.satacmd_flags.sata_data_direction;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3044 if (spx->txlt_sata_pkt != NULL &&
2539
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
3045 direction != SATA_DIR_NODATA_XFER) {
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
3046 if (spx->txlt_tmp_buf != NULL) {
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
3047 /* Intermediate DMA buffer used */
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
3048 bp = spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp;
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
3049
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
3050 if (direction & SATA_DIR_WRITE) {
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
3051 bcopy(bp->b_un.b_addr,
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
3052 spx->txlt_tmp_buf, bp->b_bcount);
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
3053 }
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
3054 }
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
3055 /* Sync the buffer for device or for CPU */
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
3056 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
3057 (direction & SATA_DIR_WRITE) ?
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
3058 DDI_DMA_SYNC_FORDEV : DDI_DMA_SYNC_FORCPU);
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
3059 ASSERT(rval == DDI_SUCCESS);
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
3060 if (spx->txlt_tmp_buf != NULL &&
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
3061 !(direction & SATA_DIR_WRITE)) {
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
3062 /* Intermediate DMA buffer used for read */
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
3063 bcopy(spx->txlt_tmp_buf,
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
3064 bp->b_un.b_addr, bp->b_bcount);
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
3065 }
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
3066
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3067 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3068 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3069 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3070
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3071
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3072
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3073 /* ******************* SATA - SCSI Translation functions **************** */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3074 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3075 * 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
3076 * translation.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3077 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3078
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3079 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3080 * Checks if a device exists and can be access and translates common
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3081 * scsi_pkt data to sata_pkt data.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3082 *
11401
1b705ea0360c 6913126 system hang possible in sata hba after CR 6911155
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 11391
diff changeset
3083 * Flag argument indicates that a non-read/write ATA command may be sent
1b705ea0360c 6913126 system hang possible in sata hba after CR 6911155
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 11391
diff changeset
3084 * to HBA in arbitrary SYNC mode to execute this packet.
11391
1f1cf000a9eb 6911155 kernel dump fails if panic happens in interrupt service routine
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 11351
diff changeset
3085 *
4010
d83e031dd201 6543221 sata: should abort processing a command when device is gone and scsi pkt callback is scheduled
pawelw
parents: 3935
diff changeset
3086 * 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
3087 * 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
3088 * 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
3089 * 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
3090 * 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
3091 * rejected with the returned TRAN_XXXXX value.
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3092 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3093 * This function should be called with port mutex held.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3094 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3095 static int
11391
1f1cf000a9eb 6911155 kernel dump fails if panic happens in interrupt service routine
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 11351
diff changeset
3096 sata_txlt_generic_pkt_info(sata_pkt_txlate_t *spx, int *reason, int flag)
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3097 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3098 sata_drive_info_t *sdinfo;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3099 sata_device_t sata_device;
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
3100 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
3101 SATA_DIR_NODATA_XFER,
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
3102 /* all other values to 0/FALSE */
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
3103 };
4010
d83e031dd201 6543221 sata: should abort processing a command when device is gone and scsi pkt callback is scheduled
pawelw
parents: 3935
diff changeset
3104 /*
d83e031dd201 6543221 sata: should abort processing a command when device is gone and scsi pkt callback is scheduled
pawelw
parents: 3935
diff changeset
3105 * 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
3106 * 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
3107 * 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
3108 * 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
3109 * 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
3110 * 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
3111 * determined.
d83e031dd201 6543221 sata: should abort processing a command when device is gone and scsi pkt callback is scheduled
pawelw
parents: 3935
diff changeset
3112 */
d83e031dd201 6543221 sata: should abort processing a command when device is gone and scsi pkt callback is scheduled
pawelw
parents: 3935
diff changeset
3113 spx->txlt_scsi_pkt->pkt_reason = CMD_TRAN_ERR;
6591
75b7f3a8280a 6696291 system panic'd running 'format -e c6t4d0'
pawelw
parents: 6539
diff changeset
3114 *reason = CMD_TRAN_ERR;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3115
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3116 /* Validate address */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3117 switch (sata_validate_scsi_address(spx->txlt_sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3118 &spx->txlt_scsi_pkt->pkt_address, &sata_device)) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3119
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3120 case -1:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3121 /* Invalid address or invalid device type */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3122 return (TRAN_BADPKT);
10391
12b08c516444 6838603 Under heavy I/O load, all Seagate Dragonfly drives in an x4x40 go offline at the same time
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 10318
diff changeset
3123 case 2:
12b08c516444 6838603 Under heavy I/O load, all Seagate Dragonfly drives in an x4x40 go offline at the same time
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 10318
diff changeset
3124 /*
12b08c516444 6838603 Under heavy I/O load, all Seagate Dragonfly drives in an x4x40 go offline at the same time
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 10318
diff changeset
3125 * Valid address but device type is unknown - Chack if it is
12b08c516444 6838603 Under heavy I/O load, all Seagate Dragonfly drives in an x4x40 go offline at the same time
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 10318
diff changeset
3126 * in the reset state and therefore in an indeterminate state.
12b08c516444 6838603 Under heavy I/O load, all Seagate Dragonfly drives in an x4x40 go offline at the same time
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 10318
diff changeset
3127 */
12b08c516444 6838603 Under heavy I/O load, all Seagate Dragonfly drives in an x4x40 go offline at the same time
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 10318
diff changeset
3128 sdinfo = sata_get_device_info(spx->txlt_sata_hba_inst,
12b08c516444 6838603 Under heavy I/O load, all Seagate Dragonfly drives in an x4x40 go offline at the same time
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 10318
diff changeset
3129 &spx->txlt_sata_pkt->satapkt_device);
12b08c516444 6838603 Under heavy I/O load, all Seagate Dragonfly drives in an x4x40 go offline at the same time
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 10318
diff changeset
3130 if (sdinfo != NULL && (sdinfo->satadrv_event_flags &
12b08c516444 6838603 Under heavy I/O load, all Seagate Dragonfly drives in an x4x40 go offline at the same time
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 10318
diff changeset
3131 (SATA_EVNT_DEVICE_RESET |
12b08c516444 6838603 Under heavy I/O load, all Seagate Dragonfly drives in an x4x40 go offline at the same time
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 10318
diff changeset
3132 SATA_EVNT_INPROC_DEVICE_RESET)) != 0) {
12b08c516444 6838603 Under heavy I/O load, all Seagate Dragonfly drives in an x4x40 go offline at the same time
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 10318
diff changeset
3133 if (!ddi_in_panic()) {
12b08c516444 6838603 Under heavy I/O load, all Seagate Dragonfly drives in an x4x40 go offline at the same time
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 10318
diff changeset
3134 spx->txlt_scsi_pkt->pkt_reason = CMD_INCOMPLETE;
12b08c516444 6838603 Under heavy I/O load, all Seagate Dragonfly drives in an x4x40 go offline at the same time
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 10318
diff changeset
3135 *reason = CMD_INCOMPLETE;
12b08c516444 6838603 Under heavy I/O load, all Seagate Dragonfly drives in an x4x40 go offline at the same time
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 10318
diff changeset
3136 SATADBG1(SATA_DBG_SCSI_IF,
12b08c516444 6838603 Under heavy I/O load, all Seagate Dragonfly drives in an x4x40 go offline at the same time
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 10318
diff changeset
3137 spx->txlt_sata_hba_inst,
12b08c516444 6838603 Under heavy I/O load, all Seagate Dragonfly drives in an x4x40 go offline at the same time
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 10318
diff changeset
3138 "sata_scsi_start: rejecting command "
12b08c516444 6838603 Under heavy I/O load, all Seagate Dragonfly drives in an x4x40 go offline at the same time
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 10318
diff changeset
3139 "because of device reset state\n", NULL);
12b08c516444 6838603 Under heavy I/O load, all Seagate Dragonfly drives in an x4x40 go offline at the same time
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 10318
diff changeset
3140 return (TRAN_BUSY);
12b08c516444 6838603 Under heavy I/O load, all Seagate Dragonfly drives in an x4x40 go offline at the same time
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 10318
diff changeset
3141 }
12b08c516444 6838603 Under heavy I/O load, all Seagate Dragonfly drives in an x4x40 go offline at the same time
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 10318
diff changeset
3142 }
12b08c516444 6838603 Under heavy I/O load, all Seagate Dragonfly drives in an x4x40 go offline at the same time
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 10318
diff changeset
3143 /* FALLTHROUGH */
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3144 case 1:
10391
12b08c516444 6838603 Under heavy I/O load, all Seagate Dragonfly drives in an x4x40 go offline at the same time
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 10318
diff changeset
3145 /* valid address but no valid device - it has disappeared */
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3146 spx->txlt_scsi_pkt->pkt_reason = CMD_DEV_GONE;
6591
75b7f3a8280a 6696291 system panic'd running 'format -e c6t4d0'
pawelw
parents: 6539
diff changeset
3147 *reason = CMD_DEV_GONE;
3935
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
3148 /*
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
3149 * 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
3150 * 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
3151 * in the dump code path.
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
3152 * 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
3153 * 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
3154 */
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
3155 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
3156 /* scsi callback required */
11853
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
3157 if (servicing_interrupt()) {
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
3158 if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
3159 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
3160 (void *)spx->txlt_scsi_pkt, TQ_NOSLEEP) ==
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
3161 NULL) {
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
3162 return (TRAN_BUSY);
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
3163 }
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
3164 } else if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
3935
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
3165 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
11853
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
3166 (void *)spx->txlt_scsi_pkt, TQ_SLEEP) == NULL) {
3935
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
3167 /* Scheduling the callback failed */
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
3168 return (TRAN_BUSY);
11853
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
3169 }
3935
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
3170
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
3171 return (TRAN_ACCEPT);
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
3172 }
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3173 return (TRAN_FATAL_ERROR);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3174 default:
6591
75b7f3a8280a 6696291 system panic'd running 'format -e c6t4d0'
pawelw
parents: 6539
diff changeset
3175 /* all OK; pkt reason will be overwritten later */
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3176 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3177 }
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
3178 /*
11391
1f1cf000a9eb 6911155 kernel dump fails if panic happens in interrupt service routine
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 11351
diff changeset
3179 * If pkt is to be executed in polling mode and a command will not be
11401
1b705ea0360c 6913126 system hang possible in sata hba after CR 6911155
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 11391
diff changeset
3180 * emulated in SATA module (requires sending a non-read/write ATA
1b705ea0360c 6913126 system hang possible in sata hba after CR 6911155
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 11391
diff changeset
3181 * command to HBA driver in arbitrary SYNC mode) and we are in the
1b705ea0360c 6913126 system hang possible in sata hba after CR 6911155
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 11391
diff changeset
3182 * interrupt context and not in the panic dump, then reject the packet
1b705ea0360c 6913126 system hang possible in sata hba after CR 6911155
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 11391
diff changeset
3183 * to avoid a possible interrupt stack overrun or hang caused by
1b705ea0360c 6913126 system hang possible in sata hba after CR 6911155
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 11391
diff changeset
3184 * a potentially blocked interrupt.
1b705ea0360c 6913126 system hang possible in sata hba after CR 6911155
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 11391
diff changeset
3185 */
1b705ea0360c 6913126 system hang possible in sata hba after CR 6911155
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 11391
diff changeset
3186 if (((spx->txlt_scsi_pkt->pkt_flags & FLAG_NOINTR) != 0 || flag != 0) &&
11391
1f1cf000a9eb 6911155 kernel dump fails if panic happens in interrupt service routine
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 11351
diff changeset
3187 servicing_interrupt() && !ddi_in_panic()) {
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
3188 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
3189 "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
3190 "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
3191 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
3192 }
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
3193
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3194 sdinfo = sata_get_device_info(spx->txlt_sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3195 &spx->txlt_sata_pkt->satapkt_device);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3196
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 * 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
3199 * TRAN_BUSY, unless:
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
3200 * 1. system is panicking (dumping)
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
3201 * 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
3202 * process reset.
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
3203 * 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
3204 * 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
3205 * needs to be ignored for IOCTL operations.
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3206 */
3116
e4293e8671d8 6488114 system panic after unplugging disks during diskomizer/dd run
yt160523
parents: 3023
diff changeset
3207 if ((sdinfo->satadrv_event_flags &
3935
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
3208 (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
3209
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
3210 if (!ddi_in_panic() &&
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
3211 ((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
3212 sata_device.satadev_addr.cport) &
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
3213 SATA_APCTL_LOCK_PORT_BUSY) == 0)) {
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
3214 spx->txlt_scsi_pkt->pkt_reason = CMD_INCOMPLETE;
6591
75b7f3a8280a 6696291 system panic'd running 'format -e c6t4d0'
pawelw
parents: 6539
diff changeset
3215 *reason = CMD_INCOMPLETE;
3935
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
3216 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
3217 "sata_scsi_start: rejecting command because "
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
3218 "of device reset state\n", NULL);
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
3219 return (TRAN_BUSY);
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
3220 }
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3221 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3222
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3223 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3224 * 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
3225 * sata_scsi_pkt_init() because pkt init had to work also with
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3226 * non-existing devices.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3227 * 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
3228 * type is known.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3229 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3230 spx->txlt_sata_pkt->satapkt_device.satadev_type = sdinfo->satadrv_type;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3231
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
3232 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
3233 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
3234 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
3235 SATA_APCTL_LOCK_PORT_BUSY) != 0) {
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
3236 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
3237 sata_ignore_dev_reset = B_TRUE;
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
3238 }
4010
d83e031dd201 6543221 sata: should abort processing a command when device is gone and scsi pkt callback is scheduled
pawelw
parents: 3935
diff changeset
3239 /*
d83e031dd201 6543221 sata: should abort processing a command when device is gone and scsi pkt callback is scheduled
pawelw
parents: 3935
diff changeset
3240 * 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
3241 * 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
3242 * 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
3243 */
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3244 spx->txlt_scsi_pkt->pkt_reason = CMD_CMPLT;
6591
75b7f3a8280a 6696291 system panic'd running 'format -e c6t4d0'
pawelw
parents: 6539
diff changeset
3245 *reason = CMD_CMPLT;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3246
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3247 if ((spx->txlt_scsi_pkt->pkt_flags & FLAG_NOINTR) != 0) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3248 /* Synchronous execution */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3249 spx->txlt_sata_pkt->satapkt_op_mode = SATA_OPMODE_SYNCH |
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3250 SATA_OPMODE_POLLING;
3023
87cffc3df3bf 6485154 crash dumps for drivers using the sata framework fail
ls24207
parents: 2960
diff changeset
3251 spx->txlt_sata_pkt->satapkt_cmd.satacmd_flags.
87cffc3df3bf 6485154 crash dumps for drivers using the sata framework fail
ls24207
parents: 2960
diff changeset
3252 sata_ignore_dev_reset = ddi_in_panic();
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3253 } else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3254 /* Asynchronous execution */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3255 spx->txlt_sata_pkt->satapkt_op_mode = SATA_OPMODE_ASYNCH |
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3256 SATA_OPMODE_INTERRUPTS;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3257 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3258 /* Convert queuing information */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3259 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
3260 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
3261 B_TRUE;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3262 else if (spx->txlt_scsi_pkt->pkt_flags &
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3263 (FLAG_OTAG | FLAG_HTAG | FLAG_HEAD))
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
3264 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
3265 B_TRUE;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3266
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3267 /* Always limit pkt time */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3268 if (spx->txlt_scsi_pkt->pkt_time == 0)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3269 spx->txlt_sata_pkt->satapkt_time = sata_default_pkt_time;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3270 else
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3271 /* Pass on scsi_pkt time */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3272 spx->txlt_sata_pkt->satapkt_time =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3273 spx->txlt_scsi_pkt->pkt_time;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3274
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3275 return (TRAN_ACCEPT);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3276 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3277
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3278
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3279 /*
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
3280 * Translate ATA Identify Device data to SCSI Inquiry data.
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
3281 * This function may be called only for ATA devices.
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
3282 * This function should not be called for ATAPI devices - they
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
3283 * respond directly to SCSI Inquiry command.
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
3284 *
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
3285 * 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
3286 * Buffer has to accomodate the inquiry length (36 bytes).
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3287 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3288 * This function should be called with a port mutex held.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3289 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3290 static void
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3291 sata_identdev_to_inquiry(sata_hba_inst_t *sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3292 sata_drive_info_t *sdinfo, uint8_t *buf)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3293 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3294
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3295 struct scsi_inquiry *inq = (struct scsi_inquiry *)buf;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3296 struct sata_id *sid = &sdinfo->satadrv_id;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3297
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
3298 /* Start with a nice clean slate */
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
3299 bzero((void *)inq, sizeof (struct scsi_inquiry));
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
3300
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
3301 /*
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
3302 * Rely on the dev_type for setting paripheral qualifier.
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
3303 * Assume that DTYPE_RODIRECT applies to CD/DVD R/W devices.
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
3304 * 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
3305 * ATAPI Inquiry may provide more data to the target driver.
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
3306 */
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3307 inq->inq_dtype = sdinfo->satadrv_type == SATA_DTYPE_ATADISK ?
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
3308 DTYPE_DIRECT : DTYPE_RODIRECT; /* DTYPE_UNKNOWN; */
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3309
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
3310 /* 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
3311 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
3312 (sid->ai_config & SATA_REM_MEDIA)) ? 1 : 0;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3313 inq->inq_qual = 0; /* Device type qualifier (obsolete in SCSI3? */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3314 inq->inq_iso = 0; /* ISO version */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3315 inq->inq_ecma = 0; /* ECMA version */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3316 inq->inq_ansi = 3; /* ANSI version - SCSI 3 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3317 inq->inq_aenc = 0; /* Async event notification cap. */
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
3318 inq->inq_trmiop = 0; /* Supports TERMINATE I/O PROC msg - NO */
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3319 inq->inq_normaca = 0; /* setting NACA bit supported - NO */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3320 inq->inq_rdf = RDF_SCSI2; /* Response data format- SPC-3 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3321 inq->inq_len = 31; /* Additional length */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3322 inq->inq_dualp = 0; /* dual port device - NO */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3323 inq->inq_reladdr = 0; /* Supports relative addressing - NO */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3324 inq->inq_sync = 0; /* Supports synchronous data xfers - NO */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3325 inq->inq_linked = 0; /* Supports linked commands - NO */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3326 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3327 * Queuing support - controller has to
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3328 * support some sort of command queuing.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3329 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3330 if (SATA_QDEPTH(sata_hba_inst) > 1)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3331 inq->inq_cmdque = 1; /* Supports command queueing - YES */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3332 else
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3333 inq->inq_cmdque = 0; /* Supports command queueing - NO */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3334 inq->inq_sftre = 0; /* Supports Soft Reset option - NO ??? */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3335 inq->inq_wbus32 = 0; /* Supports 32 bit wide data xfers - NO */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3336 inq->inq_wbus16 = 0; /* Supports 16 bit wide data xfers - NO */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3337
4582
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
3338 #ifdef _LITTLE_ENDIAN
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3339 /* Swap text fields to match SCSI format */
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
3340 bcopy("ATA ", inq->inq_vid, 8); /* Vendor ID */
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
3341 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
3342 if (strncmp(&sid->ai_fw[4], " ", 4) == 0)
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
3343 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
3344 else
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
3345 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
3346 #else /* _LITTLE_ENDIAN */
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
3347 bcopy("ATA ", inq->inq_vid, 8); /* Vendor ID */
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
3348 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
3349 if (strncmp(&sid->ai_fw[4], " ", 4) == 0)
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
3350 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
3351 else
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
3352 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
3353 #endif /* _LITTLE_ENDIAN */
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3354 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3355
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3356
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 * Scsi response set up for invalid command (command not supported)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3359 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3360 * Returns TRAN_ACCEPT and appropriate values in scsi_pkt fields.
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 static int
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3363 sata_txlt_invalid_command(sata_pkt_txlate_t *spx)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3364 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3365 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3366 struct scsi_extended_sense *sense;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3367
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3368 scsipkt->pkt_reason = CMD_CMPLT;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3369 scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3370 STATE_SENT_CMD | STATE_GOT_STATUS;
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 *scsipkt->pkt_scbp = STATUS_CHECK;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3373
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3374 sense = sata_arq_sense(spx);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3375 sense->es_key = KEY_ILLEGAL_REQUEST;
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
3376 sense->es_add_code = SD_SCSI_ASC_INVALID_COMMAND_CODE;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3377
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3378 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3379 "Scsi_pkt completion reason %x\n", scsipkt->pkt_reason);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3380
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3381 if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0 &&
11853
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
3382 scsipkt->pkt_comp != NULL) {
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3383 /* scsi callback required */
11853
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
3384 if (servicing_interrupt()) {
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
3385 if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
3386 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
3387 (void *)spx->txlt_scsi_pkt, TQ_NOSLEEP) == NULL) {
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
3388 return (TRAN_BUSY);
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
3389 }
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
3390 } else if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
1781
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
3391 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
11853
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
3392 (void *)spx->txlt_scsi_pkt, TQ_SLEEP) == NULL) {
1781
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
3393 /* Scheduling the callback failed */
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
3394 return (TRAN_BUSY);
11853
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
3395 }
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
3396 }
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3397 return (TRAN_ACCEPT);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3398 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3399
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3400 /*
10131
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
3401 * 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
3402 * and additional sense code.
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 * 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
3405 */
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
3406 static int
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
3407 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
3408 {
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
3409 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
3410 int cport = SATA_TXLT_CPORT(spx);
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
3411 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
3412 struct scsi_extended_sense *sense;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
3413
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
3414 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
3415 scsipkt->pkt_reason = CMD_CMPLT;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
3416 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
3417 STATE_SENT_CMD | STATE_GOT_STATUS;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
3418
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
3419 *scsipkt->pkt_scbp = STATUS_CHECK;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
3420
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
3421 sense = sata_arq_sense(spx);
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
3422 sense->es_key = key;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
3423 sense->es_add_code = code;
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 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
3426
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
3427 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
3428 "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
3429
11853
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
3430 if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0 &&
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
3431 scsipkt->pkt_comp != NULL) {
10131
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
3432 /* scsi callback required */
11853
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
3433 if (servicing_interrupt()) {
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
3434 if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
3435 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
3436 (void *)spx->txlt_scsi_pkt, TQ_NOSLEEP) == NULL) {
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
3437 return (TRAN_BUSY);
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
3438 }
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
3439 } else if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
3440 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
3441 (void *)spx->txlt_scsi_pkt, TQ_SLEEP) == NULL) {
10131
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
3442 /* Scheduling the callback failed */
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
3443 return (TRAN_BUSY);
11853
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
3444 }
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
3445 }
10131
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
3446 return (TRAN_ACCEPT);
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 /*
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3450 * Scsi response setup for
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3451 * emulated non-data command that requires no action/return data
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3452 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3453 * Returns TRAN_ACCEPT and appropriate values in scsi_pkt fields.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3454 */
10131
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
3455 static int
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3456 sata_txlt_nodata_cmd_immediate(sata_pkt_txlate_t *spx)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3457 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3458 int rval;
6591
75b7f3a8280a 6696291 system panic'd running 'format -e c6t4d0'
pawelw
parents: 6539
diff changeset
3459 int reason;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3460
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3461 mutex_enter(&(SATA_TXLT_CPORT_MUTEX(spx)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3462
11391
1f1cf000a9eb 6911155 kernel dump fails if panic happens in interrupt service routine
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 11351
diff changeset
3463 if (((rval = sata_txlt_generic_pkt_info(spx, &reason, 0)) !=
6591
75b7f3a8280a 6696291 system panic'd running 'format -e c6t4d0'
pawelw
parents: 6539
diff changeset
3464 TRAN_ACCEPT) || (reason == CMD_DEV_GONE)) {
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3465 mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3466 return (rval);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3467 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3468 mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3469
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3470 spx->txlt_scsi_pkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3471 STATE_SENT_CMD | STATE_GOT_STATUS;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3472 spx->txlt_scsi_pkt->pkt_reason = CMD_CMPLT;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3473 *(spx->txlt_scsi_pkt->pkt_scbp) = STATUS_GOOD;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3474
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3475 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3476 "Scsi_pkt completion reason %x\n",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3477 spx->txlt_scsi_pkt->pkt_reason);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3478
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3479 if ((spx->txlt_scsi_pkt->pkt_flags & FLAG_NOINTR) == 0 &&
11853
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
3480 spx->txlt_scsi_pkt->pkt_comp != NULL) {
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3481 /* scsi callback required */
11853
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
3482 if (servicing_interrupt()) {
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
3483 if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
3484 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
3485 (void *)spx->txlt_scsi_pkt, TQ_NOSLEEP) == NULL) {
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
3486 return (TRAN_BUSY);
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
3487 }
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
3488 } else if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
1781
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
3489 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
11853
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
3490 (void *)spx->txlt_scsi_pkt, TQ_SLEEP) == NULL) {
1781
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
3491 /* Scheduling the callback failed */
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
3492 return (TRAN_BUSY);
11853
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
3493 }
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
3494 }
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3495 return (TRAN_ACCEPT);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3496 }
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: Inquiry / Identify Device
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
3501 * Use cached Identify Device data for now, rather than issuing actual
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3502 * Device Identify cmd request. If device is detached and re-attached,
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
3503 * asynchronous event processing should fetch and refresh Identify Device
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3504 * data.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3505 * Two VPD pages are supported now:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3506 * Vital Product Data page
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3507 * Unit Serial Number page
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 * Returns TRAN_ACCEPT and appropriate values in scsi_pkt fields.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3510 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3511
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3512 #define EVPD 1 /* Extended Vital Product Data flag */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3513 #define CMDDT 2 /* Command Support Data - Obsolete */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3514 #define INQUIRY_SUP_VPD_PAGE 0 /* Supported VDP Pages Page COde */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3515 #define INQUIRY_USN_PAGE 0x80 /* Unit Serial Number Page Code */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3516 #define INQUIRY_DEV_IDENTIFICATION_PAGE 0x83 /* Not needed yet */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3517
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3518 static int
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3519 sata_txlt_inquiry(sata_pkt_txlate_t *spx)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3520 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3521 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3522 struct buf *bp = spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3523 sata_drive_info_t *sdinfo;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3524 struct scsi_extended_sense *sense;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3525 int count;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3526 uint8_t *p;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3527 int i, j;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3528 uint8_t page_buf[0xff]; /* Max length */
6591
75b7f3a8280a 6696291 system panic'd running 'format -e c6t4d0'
pawelw
parents: 6539
diff changeset
3529 int rval, reason;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3530
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3531 mutex_enter(&(SATA_TXLT_CPORT_MUTEX(spx)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3532
11391
1f1cf000a9eb 6911155 kernel dump fails if panic happens in interrupt service routine
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 11351
diff changeset
3533 if (((rval = sata_txlt_generic_pkt_info(spx, &reason, 0)) !=
6591
75b7f3a8280a 6696291 system panic'd running 'format -e c6t4d0'
pawelw
parents: 6539
diff changeset
3534 TRAN_ACCEPT) || (reason == CMD_DEV_GONE)) {
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3535 mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3536 return (rval);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3537 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3538
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3539 sdinfo = sata_get_device_info(spx->txlt_sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3540 &spx->txlt_sata_pkt->satapkt_device);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3541
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3542 ASSERT(sdinfo != NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3543
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3544 scsipkt->pkt_reason = CMD_CMPLT;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3545 scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
4582
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
3546 STATE_SENT_CMD | STATE_GOT_STATUS;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3547
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3548 /* Reject not supported request */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3549 if (scsipkt->pkt_cdbp[1] & CMDDT) { /* No support for this bit */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3550 *scsipkt->pkt_scbp = STATUS_CHECK;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3551 sense = sata_arq_sense(spx);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3552 sense->es_key = KEY_ILLEGAL_REQUEST;
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
3553 sense->es_add_code = SD_SCSI_ASC_INVALID_FIELD_IN_CDB;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3554 goto done;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3555 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3556
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3557 /* Valid Inquiry request */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3558 *scsipkt->pkt_scbp = STATUS_GOOD;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3559
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3560 if (bp != NULL && bp->b_un.b_addr && bp->b_bcount) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3561
4876
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
3562 /*
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
3563 * Because it is fully emulated command storing data
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
3564 * programatically in the specified buffer, release
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
3565 * preallocated DMA resources before storing data in the buffer,
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
3566 * so no unwanted DMA sync would take place.
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
3567 */
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
3568 sata_scsi_dmafree(NULL, scsipkt);
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
3569
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3570 if (!(scsipkt->pkt_cdbp[1] & EVPD)) {
4876
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
3571 /* Standard Inquiry Data request */
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3572 struct scsi_inquiry inq;
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
3573 unsigned int bufsize;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
3574
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3575 sata_identdev_to_inquiry(spx->txlt_sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3576 sdinfo, (uint8_t *)&inq);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3577 /* Copy no more than requested */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3578 count = MIN(bp->b_bcount,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3579 sizeof (struct scsi_inquiry));
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
3580 bufsize = scsipkt->pkt_cdbp[4];
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
3581 bufsize |= scsipkt->pkt_cdbp[3] << 8;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
3582 count = MIN(count, bufsize);
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3583 bcopy(&inq, bp->b_un.b_addr, count);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3584
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3585 scsipkt->pkt_state |= STATE_XFERRED_DATA;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3586 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
3587 bufsize - count : 0;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3588 } else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3589 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3590 * peripheral_qualifier = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3591 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3592 * We are dealing only with HD and will be
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3593 * dealing with CD/DVD devices soon
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3594 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3595 uint8_t peripheral_device_type =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3596 sdinfo->satadrv_type == SATA_DTYPE_ATADISK ?
4582
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
3597 DTYPE_DIRECT : DTYPE_RODIRECT;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3598
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3599 switch ((uint_t)scsipkt->pkt_cdbp[2]) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3600 case INQUIRY_SUP_VPD_PAGE:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3601 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3602 * Request for suported Vital Product Data
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3603 * 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
3604 * supported.
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3605 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3606 page_buf[0] = peripheral_device_type;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3607 page_buf[1] = INQUIRY_SUP_VPD_PAGE;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3608 page_buf[2] = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3609 page_buf[3] = 2; /* page length */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3610 page_buf[4] = INQUIRY_SUP_VPD_PAGE;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3611 page_buf[5] = INQUIRY_USN_PAGE;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3612 /* Copy no more than requested */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3613 count = MIN(bp->b_bcount, 6);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3614 bcopy(page_buf, bp->b_un.b_addr, count);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3615 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
3616
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3617 case INQUIRY_USN_PAGE:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3618 /*
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
3619 * 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
3620 * Set-up the page.
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3621 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3622 page_buf[0] = peripheral_device_type;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3623 page_buf[1] = INQUIRY_USN_PAGE;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3624 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
3625 /* 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
3626 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
3627
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
3628 /*
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
3629 * 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
3630 * 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
3631 * 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
3632 */
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3633 p = (uint8_t *)(sdinfo->satadrv_id.ai_drvser);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3634 #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
3635 swab(p, &page_buf[4], SATA_ID_SERIAL_LEN);
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3636 #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
3637 bcopy(p, &page_buf[4], SATA_ID_SERIAL_LEN);
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3638 #endif
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3639 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3640 * Least significant character of the serial
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3641 * number shall appear as the last byte,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3642 * 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
3643 * 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
3644 * necessary shift length.
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3645 */
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
3646 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
3647 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
3648 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
3649 *(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
3650 break;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3651 }
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
3652
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
3653 /*
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
3654 * 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
3655 * 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
3656 * 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
3657 * '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
3658 */
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
3659 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
3660 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
3661 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
3662 *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
3663
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
3664 /*
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
3665 * 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
3666 * 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
3667 */
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
3668 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
3669 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
3670
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
3671 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
3672 SATA_ID_SERIAL_LEN + 4);
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3673 bcopy(page_buf, bp->b_un.b_addr, count);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3674 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3675
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3676 case INQUIRY_DEV_IDENTIFICATION_PAGE:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3677 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3678 * We may want to implement this page, when
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3679 * identifiers are common for SATA devices
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3680 * But not now.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3681 */
3935
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
3682 /*FALLTHROUGH*/
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3683
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3684 default:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3685 /* Request for unsupported VPD page */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3686 *scsipkt->pkt_scbp = STATUS_CHECK;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3687 sense = sata_arq_sense(spx);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3688 sense->es_key = KEY_ILLEGAL_REQUEST;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3689 sense->es_add_code =
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
3690 SD_SCSI_ASC_INVALID_FIELD_IN_CDB;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3691 goto done;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3692 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3693 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3694 scsipkt->pkt_state |= STATE_XFERRED_DATA;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3695 scsipkt->pkt_resid = scsipkt->pkt_cdbp[4] > count ?
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3696 scsipkt->pkt_cdbp[4] - count : 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3697 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3698 done:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3699 mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3700
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3701 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3702 "Scsi_pkt completion reason %x\n",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3703 scsipkt->pkt_reason);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3704
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3705 if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0 &&
1781
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
3706 scsipkt->pkt_comp != NULL) {
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3707 /* scsi callback required */
11853
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
3708 if (servicing_interrupt()) {
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
3709 if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
3710 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
3711 (void *)spx->txlt_scsi_pkt, TQ_NOSLEEP) == NULL) {
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
3712 return (TRAN_BUSY);
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
3713 }
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
3714 } else if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
3715 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
3716 (void *)spx->txlt_scsi_pkt, TQ_SLEEP) == NULL) {
1781
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
3717 /* Scheduling the callback failed */
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
3718 return (TRAN_BUSY);
11853
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
3719 }
1781
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
3720 }
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3721 return (TRAN_ACCEPT);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3722 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3723
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3724 /*
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
3725 * SATA translate command: Request Sense.
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3726 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3727 * 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
3728 * 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
3729 * 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
3730 *
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
3731 * 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
3732 * 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
3733 * 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
3734 * 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
3735 * implemented here.
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3736 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3737 static int
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3738 sata_txlt_request_sense(sata_pkt_txlate_t *spx)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3739 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3740 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3741 struct scsi_extended_sense sense;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3742 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
3743 sata_drive_info_t *sdinfo;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
3744 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
3745 int rval, reason, power_state = 0;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3746
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3747 mutex_enter(&(SATA_TXLT_CPORT_MUTEX(spx)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3748
11391
1f1cf000a9eb 6911155 kernel dump fails if panic happens in interrupt service routine
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 11351
diff changeset
3749 if (((rval = sata_txlt_generic_pkt_info(spx, &reason, 1)) !=
6591
75b7f3a8280a 6696291 system panic'd running 'format -e c6t4d0'
pawelw
parents: 6539
diff changeset
3750 TRAN_ACCEPT) || (reason == CMD_DEV_GONE)) {
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3751 mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3752 return (rval);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3753 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3754
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3755 scsipkt->pkt_reason = CMD_CMPLT;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3756 scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3757 STATE_SENT_CMD | STATE_GOT_STATUS;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3758 *scsipkt->pkt_scbp = STATUS_GOOD;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3759
10131
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
3760 /*
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
3761 * 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
3762 * return ILLEGAL_REQUEST
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 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
3765 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
3766 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
3767 SD_SCSI_ASC_CMD_SEQUENCE_ERR));
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
3768 }
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
3769
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
3770 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
3771 &spx->txlt_sata_pkt->satapkt_device);
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
3772 ASSERT(sdinfo != NULL);
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
3773
10427
7d60ed90f743 6873542 forced core dump fails
Ada <Ada.Feng@Sun.COM>
parents: 10391
diff changeset
3774 spx->txlt_sata_pkt->satapkt_op_mode |= SATA_OPMODE_SYNCH;
10131
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
3775
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
3776 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
3777 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
3778 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
3779 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
3780 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
3781 return (rval);
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
3782 } else {
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
3783 if (scmd->satacmd_error_reg != 0) {
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
3784 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
3785 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
3786 SD_SCSI_ASC_NO_ADD_SENSE));
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
3787 }
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 switch (scmd->satacmd_sec_count_lsb) {
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
3791 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
3792 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
3793 power_state = SATA_POWER_STOPPED;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
3794 else {
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
3795 power_state = SATA_POWER_STANDBY;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
3796 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
3797 }
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
3798 break;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
3799 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
3800 power_state = SATA_POWER_IDLE;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
3801 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
3802 break;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
3803 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
3804 default: /* 0x40, 0x41 active mode */
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
3805 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
3806 power_state = SATA_POWER_IDLE;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
3807 else {
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
3808 power_state = SATA_POWER_ACTIVE;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
3809 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
3810 }
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
3811 break;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
3812 }
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
3813
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
3814 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
3815
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3816 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
3817 /*
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
3818 * Because it is fully emulated command storing data
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
3819 * programatically in the specified buffer, release
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
3820 * preallocated DMA resources before storing data in the buffer,
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
3821 * so no unwanted DMA sync would take place.
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
3822 */
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3823 int count = MIN(bp->b_bcount,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3824 sizeof (struct scsi_extended_sense));
4876
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
3825 sata_scsi_dmafree(NULL, scsipkt);
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3826 bzero(&sense, sizeof (struct scsi_extended_sense));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3827 sense.es_valid = 0; /* Valid LBA */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3828 sense.es_class = 7; /* Response code 0x70 - current err */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3829 sense.es_key = KEY_NO_SENSE;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3830 sense.es_add_len = 6; /* Additional length */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3831 /* Copy no more than requested */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3832 bcopy(&sense, bp->b_un.b_addr, count);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3833 scsipkt->pkt_state |= STATE_XFERRED_DATA;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3834 scsipkt->pkt_resid = 0;
10131
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
3835 switch (power_state) {
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
3836 case SATA_POWER_IDLE:
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
3837 case SATA_POWER_STANDBY:
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
3838 sense.es_add_code =
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
3839 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
3840 break;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
3841 case SATA_POWER_STOPPED:
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
3842 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
3843 break;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
3844 case SATA_POWER_ACTIVE:
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
3845 default:
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
3846 break;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
3847 }
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3848 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3849
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3850 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3851 "Scsi_pkt completion reason %x\n",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3852 scsipkt->pkt_reason);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3853
11853
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
3854 if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0 &&
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
3855 scsipkt->pkt_comp != NULL) {
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3856 /* scsi callback required */
11853
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
3857 if (servicing_interrupt()) {
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
3858 if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
3859 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
3860 (void *)spx->txlt_scsi_pkt, TQ_NOSLEEP) == NULL) {
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
3861 return (TRAN_BUSY);
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
3862 }
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
3863 } else if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
3864 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
3865 (void *)spx->txlt_scsi_pkt, TQ_SLEEP) == NULL) {
1781
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
3866 /* Scheduling the callback failed */
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
3867 return (TRAN_BUSY);
11853
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
3868 }
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
3869 }
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3870 return (TRAN_ACCEPT);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3871 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3872
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3873 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3874 * SATA translate command: Test Unit Ready
10391
12b08c516444 6838603 Under heavy I/O load, all Seagate Dragonfly drives in an x4x40 go offline at the same time
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 10318
diff changeset
3875 * (ATA version for SATA hard disks).
12b08c516444 6838603 Under heavy I/O load, all Seagate Dragonfly drives in an x4x40 go offline at the same time
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 10318
diff changeset
3876 * It is translated into the Check Power Mode command.
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3877 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3878 * Returns TRAN_ACCEPT and appropriate values in scsi_pkt fields.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3879 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3880 static int
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3881 sata_txlt_test_unit_ready(sata_pkt_txlate_t *spx)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3882 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3883 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3884 struct scsi_extended_sense *sense;
10131
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
3885 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
3886 sata_drive_info_t *sdinfo;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3887 int power_state;
6591
75b7f3a8280a 6696291 system panic'd running 'format -e c6t4d0'
pawelw
parents: 6539
diff changeset
3888 int rval, reason;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3889
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3890 mutex_enter(&(SATA_TXLT_CPORT_MUTEX(spx)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3891
11391
1f1cf000a9eb 6911155 kernel dump fails if panic happens in interrupt service routine
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 11351
diff changeset
3892 if (((rval = sata_txlt_generic_pkt_info(spx, &reason, 1)) !=
6591
75b7f3a8280a 6696291 system panic'd running 'format -e c6t4d0'
pawelw
parents: 6539
diff changeset
3893 TRAN_ACCEPT) || (reason == CMD_DEV_GONE)) {
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3894 mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3895 return (rval);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3896 }
10131
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
3897
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
3898 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
3899 &spx->txlt_sata_pkt->satapkt_device);
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
3900 ASSERT(sdinfo != NULL);
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
3901
10427
7d60ed90f743 6873542 forced core dump fails
Ada <Ada.Feng@Sun.COM>
parents: 10391
diff changeset
3902 spx->txlt_sata_pkt->satapkt_op_mode |= SATA_OPMODE_SYNCH;
10131
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
3903
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
3904 /* send CHECK POWER MODE command */
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
3905 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
3906 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
3907 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
3908 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
3909 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
3910 return (rval);
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
3911 } else {
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
3912 if (scmd->satacmd_error_reg != 0) {
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
3913 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
3914 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
3915 SD_SCSI_ASC_LU_NOT_RESPONSE));
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
3916 }
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 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
3920
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
3921 /*
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
3922 * 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
3923 */
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
3924 if (power_state == SATA_PWRMODE_STANDBY &&
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
3925 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
3926 *scsipkt->pkt_scbp = STATUS_CHECK;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
3927 sense = sata_arq_sense(spx);
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
3928 sense->es_key = KEY_NOT_READY;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
3929 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
3930 } else {
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
3931 /*
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
3932 * 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
3933 */
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
3934 *scsipkt->pkt_scbp = STATUS_GOOD;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
3935 }
1258
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 scsipkt->pkt_reason = CMD_CMPLT;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3938 scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3939 STATE_SENT_CMD | STATE_GOT_STATUS;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3940
10131
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
3941 mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx)));
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3942
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3943 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3944 "Scsi_pkt completion reason %x\n", scsipkt->pkt_reason);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3945
11853
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
3946 if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0 &&
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
3947 scsipkt->pkt_comp != NULL) {
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3948 /* scsi callback required */
11853
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
3949 if (servicing_interrupt()) {
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
3950 if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
3951 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
3952 (void *)spx->txlt_scsi_pkt, TQ_NOSLEEP) == NULL) {
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
3953 return (TRAN_BUSY);
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
3954 }
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
3955 } else if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
3956 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
3957 (void *)spx->txlt_scsi_pkt, TQ_SLEEP) == NULL) {
1781
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
3958 /* Scheduling the callback failed */
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
3959 return (TRAN_BUSY);
11853
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
3960 }
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
3961 }
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3962
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3963 return (TRAN_ACCEPT);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3964 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3965
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3966 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3967 * SATA translate command: Start Stop Unit
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3968 * Translation depends on a command:
10131
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
3969 *
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
3970 * Power condition bits will be supported
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
3971 * 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
3972 * 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
3973 * 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
3974 * 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
3975 *
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
3976 * 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
3977 * -----------------------------------------------------------------------
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
3978 * 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
3979 * 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
3980 * 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
3981 * 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
3982 *
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3983 * Unload Media / NOT SUPPORTED YET
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3984 * Load Media / NOT SUPPROTED YET
10131
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
3985 * Immediate bit / NOT SUPPORTED YET (deferred error)
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3986 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3987 * Returns TRAN_ACCEPT or code returned by sata_hba_start() and
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3988 * appropriate values in scsi_pkt fields.
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 static int
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3991 sata_txlt_start_stop_unit(sata_pkt_txlate_t *spx)
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 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3994 sata_cmd_t *scmd = &spx->txlt_sata_pkt->satapkt_cmd;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3995 sata_hba_inst_t *shi = SATA_TXLT_HBA_INST(spx);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3996 int cport = SATA_TXLT_CPORT(spx);
6591
75b7f3a8280a 6696291 system panic'd running 'format -e c6t4d0'
pawelw
parents: 6539
diff changeset
3997 int rval, reason;
10131
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
3998 sata_drive_info_t *sdinfo;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
3999 sata_id_t *sata_id;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4000
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4001 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4002 "sata_txlt_start_stop_unit: %d\n", scsipkt->pkt_scbp[4] & 1);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4003
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4004 mutex_enter(&SATA_CPORT_MUTEX(shi, cport));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4005
11391
1f1cf000a9eb 6911155 kernel dump fails if panic happens in interrupt service routine
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 11351
diff changeset
4006 if (((rval = sata_txlt_generic_pkt_info(spx, &reason, 1)) !=
6591
75b7f3a8280a 6696291 system panic'd running 'format -e c6t4d0'
pawelw
parents: 6539
diff changeset
4007 TRAN_ACCEPT) || (reason == CMD_DEV_GONE)) {
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4008 mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4009 return (rval);
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
10131
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
4012 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
4013 /* IMMED bit - not supported */
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4014 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
4015 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
4016 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
4017 }
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
4018
10427
7d60ed90f743 6873542 forced core dump fails
Ada <Ada.Feng@Sun.COM>
parents: 10391
diff changeset
4019 spx->txlt_sata_pkt->satapkt_op_mode |= SATA_OPMODE_SYNCH;
10131
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
4020 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
4021
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
4022 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
4023 &spx->txlt_sata_pkt->satapkt_device);
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
4024 ASSERT(sdinfo != NULL);
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
4025 sata_id = &sdinfo->satadrv_id;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
4026
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
4027 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
4028 case 0:
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
4029 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
4030 /* Load/Unload Media - invalid request */
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
4031 goto err_out;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
4032 }
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
4033 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
4034 /* Start Unit */
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
4035 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
4036 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
4037 /* Transfer command to HBA */
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
4038 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
4039 /* Pkt not accepted for execution */
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
4040 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
4041 return (rval);
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
4042 } else {
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
4043 if (scmd->satacmd_error_reg != 0) {
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
4044 goto err_out;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
4045 }
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
4046 }
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
4047 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
4048 } else {
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
4049 /* Stop Unit */
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
4050 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
4051 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
4052 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
4053 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
4054 return (rval);
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
4055 } else {
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
4056 if (scmd->satacmd_error_reg != 0) {
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
4057 goto err_out;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
4058 }
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
4059 }
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
4060 /* ata standby immediate command */
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
4061 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
4062 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
4063 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
4064 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
4065 return (rval);
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
4066 } else {
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
4067 if (scmd->satacmd_error_reg != 0) {
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
4068 goto err_out;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
4069 }
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
4070 }
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
4071 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
4072 }
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
4073 break;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
4074 case 0x1:
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
4075 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
4076 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
4077 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
4078 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
4079 return (rval);
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
4080 } else {
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
4081 if (scmd->satacmd_error_reg != 0) {
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
4082 goto err_out;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
4083 }
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
4084 }
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
4085 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
4086 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
4087 /* Transfer command to HBA */
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
4088 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
4089 /* Pkt not accepted for execution */
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
4090 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
4091 return (rval);
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
4092 } else {
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
4093 if (scmd->satacmd_error_reg != 0) {
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
4094 goto err_out;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
4095 }
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
4096 }
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
4097 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
4098 break;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
4099 case 0x2:
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
4100 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
4101 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
4102 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
4103 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
4104 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
4105 return (rval);
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
4106 } else {
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
4107 if (scmd->satacmd_error_reg != 0) {
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
4108 goto err_out;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
4109 }
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
4110 }
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
4111 }
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
4112 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
4113 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
4114 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
4115 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
4116 return (rval);
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
4117 } else {
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
4118 if (scmd->satacmd_error_reg != 0) {
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
4119 goto err_out;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
4120 }
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
4121 }
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
4122 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
4123 /*
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
4124 * POWER CONDITION MODIFIER bit set
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
4125 * 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
4126 * 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
4127 */
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
4128 if (!(sata_id->ai_cmdset84 &
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
4129 SATA_IDLE_UNLOAD_SUPPORTED)) {
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
4130 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
4131 break;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
4132 }
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
4133 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
4134 scmd->satacmd_features_reg = 0x44;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
4135 scmd->satacmd_lba_low_lsb = 0x4c;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
4136 scmd->satacmd_lba_mid_lsb = 0x4e;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
4137 scmd->satacmd_lba_high_lsb = 0x55;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
4138 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
4139 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
4140 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
4141 return (rval);
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
4142 } else {
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
4143 if (scmd->satacmd_error_reg != 0) {
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
4144 goto err_out;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
4145 }
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
4146 }
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
4147 }
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
4148 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
4149 break;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
4150 case 0x3:
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
4151 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
4152 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
4153 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
4154 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
4155 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
4156 return (rval);
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
4157 } else {
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
4158 if (scmd->satacmd_error_reg != 0) {
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
4159 goto err_out;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
4160 }
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
4161 }
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
4162 }
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
4163 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
4164 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
4165 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
4166 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
4167 return (rval);
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
4168 } else {
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
4169 if (scmd->satacmd_error_reg != 0) {
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
4170 goto err_out;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
4171 }
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
4172 }
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
4173 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
4174 break;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
4175 case 0x7:
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
4176 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
4177 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
4178 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
4179 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
4180 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
4181 return (rval);
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
4182 } else {
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
4183 if (scmd->satacmd_error_reg != 0) {
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
4184 goto err_out;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
4185 }
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
4186 }
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
4187 switch (scmd->satacmd_sec_count_lsb) {
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
4188 case SATA_PWRMODE_STANDBY:
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
4189 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
4190 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
4191 sdinfo->satadrv_standby_timer);
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
4192 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
4193 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
4194 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
4195 return (rval);
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
4196 } else {
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
4197 if (scmd->satacmd_error_reg != 0) {
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
4198 goto err_out;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
4199 }
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
4200 }
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
4201 break;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
4202 case SATA_PWRMODE_IDLE:
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
4203 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
4204 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
4205 sdinfo->satadrv_standby_timer);
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
4206 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
4207 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
4208 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
4209 return (rval);
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
4210 } else {
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
4211 if (scmd->satacmd_error_reg != 0) {
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
4212 goto err_out;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
4213 }
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
4214 }
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
4215 break;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
4216 case SATA_PWRMODE_ACTIVE_SPINDOWN:
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
4217 case SATA_PWRMODE_ACTIVE_SPINUP:
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
4218 case SATA_PWRMODE_ACTIVE:
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
4219 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
4220 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
4221 sdinfo->satadrv_standby_timer);
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
4222 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
4223 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
4224 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
4225 return (rval);
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
4226 } else {
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
4227 if (scmd->satacmd_error_reg != 0) {
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
4228 goto err_out;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
4229 }
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
4230 }
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
4231 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
4232 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
4233 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
4234 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
4235 return (rval);
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
4236 } else {
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
4237 if (scmd->satacmd_error_reg != 0) {
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
4238 goto err_out;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
4239 }
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
4240 }
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
4241 break;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
4242 default:
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
4243 goto err_out;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
4244 }
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
4245 break;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
4246 case 0xb:
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
4247 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
4248 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
4249 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
4250 return (sata_txlt_check_condition(spx,
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
4251 KEY_ILLEGAL_REQUEST,
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
4252 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
4253 }
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
4254 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
4255 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
4256 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
4257 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
4258 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
4259 return (rval);
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
4260 } else {
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
4261 if (scmd->satacmd_error_reg != 0) {
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
4262 goto err_out;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
4263 }
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
4264 }
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
4265 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
4266 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
4267 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
4268 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
4269 return (rval);
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
4270 } else {
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
4271 if (scmd->satacmd_error_reg != 0) {
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
4272 goto err_out;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
4273 }
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
4274 }
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
4275 }
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
4276 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
4277 break;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
4278 default:
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
4279 err_out:
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
4280 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
4281 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
4282 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
4283 }
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
4284
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
4285 /*
10391
12b08c516444 6838603 Under heavy I/O load, all Seagate Dragonfly drives in an x4x40 go offline at the same time
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 10318
diff changeset
4286 * Since it was a synchronous command,
12b08c516444 6838603 Under heavy I/O load, all Seagate Dragonfly drives in an x4x40 go offline at the same time
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 10318
diff changeset
4287 * a callback function will be called directly.
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4288 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4289 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
4290 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
4291 "synchronous execution status %x\n",
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
4292 spx->txlt_sata_pkt->satapkt_reason);
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
4293
11853
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
4294 if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0 &&
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
4295 scsipkt->pkt_comp != NULL) {
10131
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
4296 sata_set_arq_data(spx->txlt_sata_pkt);
11853
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
4297 if (servicing_interrupt()) {
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
4298 if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
4299 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
4300 (void *)spx->txlt_scsi_pkt, TQ_NOSLEEP) == NULL) {
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
4301 return (TRAN_BUSY);
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
4302 }
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
4303 } else if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
4304 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
4305 (void *)spx->txlt_scsi_pkt, TQ_SLEEP) == NULL) {
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
4306 /* Scheduling the callback failed */
10131
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
4307 return (TRAN_BUSY);
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
4308 }
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
4309 }
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
4310 else
1258
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 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
4313
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4314 return (TRAN_ACCEPT);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4315
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4316 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4317
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4318 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4319 * SATA translate command: Read Capacity.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4320 * Emulated command for SATA disks.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4321 * Capacity is retrieved from cached Idenifty Device data.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4322 * Identify Device data shows effective disk capacity, not the native
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4323 * capacity, which may be limitted by Set Max Address command.
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
4324 * This is ATA version for SATA hard disks.
1258
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 * Returns TRAN_ACCEPT and appropriate values in scsi_pkt fields.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4327 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4328 static int
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4329 sata_txlt_read_capacity(sata_pkt_txlate_t *spx)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4330 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4331 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4332 struct buf *bp = spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4333 sata_drive_info_t *sdinfo;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4334 uint64_t val;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4335 uchar_t *rbuf;
6591
75b7f3a8280a 6696291 system panic'd running 'format -e c6t4d0'
pawelw
parents: 6539
diff changeset
4336 int rval, reason;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4337
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4338 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4339 "sata_txlt_read_capacity: ", NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4340
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4341 mutex_enter(&(SATA_TXLT_CPORT_MUTEX(spx)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4342
11391
1f1cf000a9eb 6911155 kernel dump fails if panic happens in interrupt service routine
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 11351
diff changeset
4343 if (((rval = sata_txlt_generic_pkt_info(spx, &reason, 0)) !=
6591
75b7f3a8280a 6696291 system panic'd running 'format -e c6t4d0'
pawelw
parents: 6539
diff changeset
4344 TRAN_ACCEPT) || (reason == CMD_DEV_GONE)) {
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4345 mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4346 return (rval);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4347 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4348
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4349 scsipkt->pkt_reason = CMD_CMPLT;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4350 scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4351 STATE_SENT_CMD | STATE_GOT_STATUS;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4352 *scsipkt->pkt_scbp = STATUS_GOOD;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4353 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
4354 /*
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
4355 * Because it is fully emulated command storing data
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
4356 * programatically in the specified buffer, release
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
4357 * preallocated DMA resources before storing data in the buffer,
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
4358 * so no unwanted DMA sync would take place.
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
4359 */
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
4360 sata_scsi_dmafree(NULL, scsipkt);
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
4361
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4362 sdinfo = sata_get_device_info(
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4363 spx->txlt_sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4364 &spx->txlt_sata_pkt->satapkt_device);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4365 /* Last logical block address */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4366 val = sdinfo->satadrv_capacity - 1;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4367 rbuf = (uchar_t *)bp->b_un.b_addr;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4368 /* Need to swap endians to match scsi format */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4369 rbuf[0] = (val >> 24) & 0xff;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4370 rbuf[1] = (val >> 16) & 0xff;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4371 rbuf[2] = (val >> 8) & 0xff;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4372 rbuf[3] = val & 0xff;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4373 /* block size - always 512 bytes, for now */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4374 rbuf[4] = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4375 rbuf[5] = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4376 rbuf[6] = 0x02;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4377 rbuf[7] = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4378 scsipkt->pkt_state |= STATE_XFERRED_DATA;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4379 scsipkt->pkt_resid = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4380
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4381 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst, "%d\n",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4382 sdinfo->satadrv_capacity -1);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4383 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4384 mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4385 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4386 * If a callback was requested, do it now.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4387 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4388 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4389 "Scsi_pkt completion reason %x\n", scsipkt->pkt_reason);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4390
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4391 if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0 &&
11853
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
4392 scsipkt->pkt_comp != NULL) {
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4393 /* scsi callback required */
11853
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
4394 if (servicing_interrupt()) {
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
4395 if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
4396 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
4397 (void *)spx->txlt_scsi_pkt, TQ_NOSLEEP) == NULL) {
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
4398 return (TRAN_BUSY);
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
4399 }
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
4400 } else if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
4401 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
4402 (void *)spx->txlt_scsi_pkt, TQ_SLEEP) == NULL) {
1781
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
4403 /* Scheduling the callback failed */
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
4404 return (TRAN_BUSY);
11853
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
4405 }
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
4406 }
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4407
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4408 return (TRAN_ACCEPT);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4409 }
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 * SATA translate command: Mode Sense.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4413 * Translated into appropriate SATA command or emulated.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4414 * Saved Values Page Control (03) are not supported.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4415 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4416 * NOTE: only caching mode sense page is currently implemented.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4417 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4418 * Returns TRAN_ACCEPT and appropriate values in scsi_pkt fields.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4419 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4420
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
4421 #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
4422
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4423 static int
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4424 sata_txlt_mode_sense(sata_pkt_txlate_t *spx)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4425 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4426 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4427 struct buf *bp = spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4428 sata_drive_info_t *sdinfo;
1675
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
4429 sata_id_t *sata_id;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4430 struct scsi_extended_sense *sense;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4431 int len, bdlen, count, alc_len;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4432 int pc; /* Page Control code */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4433 uint8_t *buf; /* mode sense buffer */
6591
75b7f3a8280a 6696291 system panic'd running 'format -e c6t4d0'
pawelw
parents: 6539
diff changeset
4434 int rval, reason;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4435
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4436 SATADBG2(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4437 "sata_txlt_mode_sense, pc %x page code 0x%02x\n",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4438 spx->txlt_scsi_pkt->pkt_cdbp[2] >> 6,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4439 spx->txlt_scsi_pkt->pkt_cdbp[2] & 0x3f);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4440
11853
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
4441 if (servicing_interrupt()) {
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
4442 buf = kmem_zalloc(1024, KM_NOSLEEP);
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
4443 if (buf == NULL) {
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
4444 return (TRAN_BUSY);
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
4445 }
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
4446 } else {
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
4447 buf = kmem_zalloc(1024, KM_SLEEP);
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
4448 }
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4449
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4450 mutex_enter(&(SATA_TXLT_CPORT_MUTEX(spx)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4451
11391
1f1cf000a9eb 6911155 kernel dump fails if panic happens in interrupt service routine
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 11351
diff changeset
4452 if (((rval = sata_txlt_generic_pkt_info(spx, &reason, 0)) !=
6591
75b7f3a8280a 6696291 system panic'd running 'format -e c6t4d0'
pawelw
parents: 6539
diff changeset
4453 TRAN_ACCEPT) || (reason == CMD_DEV_GONE)) {
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4454 mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4455 kmem_free(buf, 1024);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4456 return (rval);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4457 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4458
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4459 scsipkt->pkt_reason = CMD_CMPLT;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4460 scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4461 STATE_SENT_CMD | STATE_GOT_STATUS;
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 pc = scsipkt->pkt_cdbp[2] >> 6;
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 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
4466 /*
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
4467 * Because it is fully emulated command storing data
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
4468 * programatically in the specified buffer, release
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
4469 * preallocated DMA resources before storing data in the buffer,
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
4470 * so no unwanted DMA sync would take place.
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
4471 */
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
4472 sata_scsi_dmafree(NULL, scsipkt);
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
4473
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4474 len = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4475 bdlen = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4476 if (!(scsipkt->pkt_cdbp[1] & 8)) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4477 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
4478 (scsipkt->pkt_cdbp[1] & LLBAA))
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4479 bdlen = 16;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4480 else
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4481 bdlen = 8;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4482 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4483 /* Build mode parameter header */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4484 if (spx->txlt_scsi_pkt->pkt_cdbp[0] == SCMD_MODE_SENSE) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4485 /* 4-byte mode parameter header */
10131
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
4486 buf[len++] = 0; /* mode data length */
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4487 buf[len++] = 0; /* medium type */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4488 buf[len++] = 0; /* dev-specific param */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4489 buf[len++] = bdlen; /* Block Descriptor length */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4490 } else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4491 /* 8-byte mode parameter header */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4492 buf[len++] = 0; /* mode data length */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4493 buf[len++] = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4494 buf[len++] = 0; /* medium type */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4495 buf[len++] = 0; /* dev-specific param */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4496 if (bdlen == 16)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4497 buf[len++] = 1; /* long lba descriptor */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4498 else
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4499 buf[len++] = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4500 buf[len++] = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4501 buf[len++] = 0; /* Block Descriptor length */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4502 buf[len++] = bdlen;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4503 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4504
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4505 sdinfo = sata_get_device_info(
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4506 spx->txlt_sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4507 &spx->txlt_sata_pkt->satapkt_device);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4508
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4509 /* Build block descriptor only if not disabled (DBD) */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4510 if ((scsipkt->pkt_cdbp[1] & 0x08) == 0) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4511 /* Block descriptor - direct-access device format */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4512 if (bdlen == 8) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4513 /* build regular block descriptor */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4514 buf[len++] =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4515 (sdinfo->satadrv_capacity >> 24) & 0xff;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4516 buf[len++] =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4517 (sdinfo->satadrv_capacity >> 16) & 0xff;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4518 buf[len++] =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4519 (sdinfo->satadrv_capacity >> 8) & 0xff;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4520 buf[len++] = sdinfo->satadrv_capacity & 0xff;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4521 buf[len++] = 0; /* density code */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4522 buf[len++] = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4523 if (sdinfo->satadrv_type ==
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4524 SATA_DTYPE_ATADISK)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4525 buf[len++] = 2;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4526 else
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4527 /* ATAPI */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4528 buf[len++] = 8;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4529 buf[len++] = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4530 } else if (bdlen == 16) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4531 /* Long LBA Accepted */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4532 /* build long lba block descriptor */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4533 #ifndef __lock_lint
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4534 buf[len++] =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4535 (sdinfo->satadrv_capacity >> 56) & 0xff;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4536 buf[len++] =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4537 (sdinfo->satadrv_capacity >> 48) & 0xff;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4538 buf[len++] =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4539 (sdinfo->satadrv_capacity >> 40) & 0xff;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4540 buf[len++] =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4541 (sdinfo->satadrv_capacity >> 32) & 0xff;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4542 #endif
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4543 buf[len++] =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4544 (sdinfo->satadrv_capacity >> 24) & 0xff;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4545 buf[len++] =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4546 (sdinfo->satadrv_capacity >> 16) & 0xff;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4547 buf[len++] =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4548 (sdinfo->satadrv_capacity >> 8) & 0xff;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4549 buf[len++] = sdinfo->satadrv_capacity & 0xff;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4550 buf[len++] = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4551 buf[len++] = 0; /* density code */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4552 buf[len++] = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4553 buf[len++] = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4554 if (sdinfo->satadrv_type ==
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4555 SATA_DTYPE_ATADISK)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4556 buf[len++] = 2;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4557 else
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4558 /* ATAPI */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4559 buf[len++] = 8;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4560 buf[len++] = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4561 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4562 }
1675
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
4563
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
4564 sata_id = &sdinfo->satadrv_id;
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
4565
1258
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 * Add requested pages.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4568 * Page 3 and 4 are obsolete and we are not supporting them.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4569 * We deal now with:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4570 * caching (read/write cache control).
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4571 * We should eventually deal with following mode pages:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4572 * error recovery (0x01),
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4573 * power condition (0x1a),
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4574 * exception control page (enables SMART) (0x1c),
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4575 * enclosure management (ses),
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4576 * protocol-specific port mode (port control).
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4577 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4578 switch (scsipkt->pkt_cdbp[2] & 0x3f) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4579 case MODEPAGE_RW_ERRRECOV:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4580 /* DAD_MODE_ERR_RECOV */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4581 /* R/W recovery */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4582 len += sata_build_msense_page_1(sdinfo, pc, buf+len);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4583 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4584 case MODEPAGE_CACHING:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4585 /* DAD_MODE_CACHE */
1675
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
4586 /* Reject not supported request for saved parameters */
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
4587 if (pc == 3) {
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
4588 *scsipkt->pkt_scbp = STATUS_CHECK;
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
4589 sense = sata_arq_sense(spx);
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
4590 sense->es_key = KEY_ILLEGAL_REQUEST;
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
4591 sense->es_add_code =
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
4592 SD_SCSI_ASC_SAVING_PARAMS_NOT_SUPPORTED;
1675
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
4593 goto done;
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
4594 }
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
4595
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4596 /* caching */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4597 len += sata_build_msense_page_8(sdinfo, pc, buf+len);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4598 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4599 case MODEPAGE_INFO_EXCPT:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4600 /* exception cntrl */
1675
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
4601 if (sata_id->ai_cmdset82 & SATA_SMART_SUPPORTED) {
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
4602 len += sata_build_msense_page_1c(sdinfo, pc,
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
4603 buf+len);
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
4604 }
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
4605 else
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
4606 goto err;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4607 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4608 case MODEPAGE_POWER_COND:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4609 /* DAD_MODE_POWER_COND */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4610 /* power condition */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4611 len += sata_build_msense_page_1a(sdinfo, pc, buf+len);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4612 break;
4836
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
4613
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
4614 case MODEPAGE_ACOUSTIC_MANAG:
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
4615 /* acoustic management */
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
4616 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
4617 break;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4618 case MODEPAGE_ALLPAGES:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4619 /* all pages */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4620 len += sata_build_msense_page_1(sdinfo, pc, buf+len);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4621 len += sata_build_msense_page_8(sdinfo, pc, buf+len);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4622 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
4623 if (sata_id->ai_cmdset82 & SATA_SMART_SUPPORTED) {
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
4624 len += sata_build_msense_page_1c(sdinfo, pc,
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
4625 buf+len);
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
4626 }
4836
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
4627 len += sata_build_msense_page_30(sdinfo, pc, buf+len);
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4628 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4629 default:
1675
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
4630 err:
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4631 /* Invalid request */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4632 *scsipkt->pkt_scbp = STATUS_CHECK;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4633 sense = sata_arq_sense(spx);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4634 sense->es_key = KEY_ILLEGAL_REQUEST;
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
4635 sense->es_add_code = SD_SCSI_ASC_INVALID_FIELD_IN_CDB;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4636 goto done;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4637 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4638
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4639 /* fix total mode data length */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4640 if (spx->txlt_scsi_pkt->pkt_cdbp[0] == SCMD_MODE_SENSE) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4641 /* 4-byte mode parameter header */
10131
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
4642 buf[0] = len - 1; /* mode data length */
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4643 } else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4644 buf[0] = (len -2) >> 8;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4645 buf[1] = (len -2) & 0xff;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4646 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4647
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4648
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4649 /* Check allocation length */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4650 if (scsipkt->pkt_cdbp[0] == SCMD_MODE_SENSE) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4651 alc_len = scsipkt->pkt_cdbp[4];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4652 } else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4653 alc_len = scsipkt->pkt_cdbp[7];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4654 alc_len = (len << 8) | scsipkt->pkt_cdbp[8];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4655 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4656 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4657 * We do not check for possible parameters truncation
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4658 * (alc_len < len) assuming that the target driver works
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4659 * correctly. Just avoiding overrun.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4660 * Copy no more than requested and possible, buffer-wise.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4661 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4662 count = MIN(alc_len, len);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4663 count = MIN(bp->b_bcount, count);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4664 bcopy(buf, bp->b_un.b_addr, count);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4665
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4666 scsipkt->pkt_state |= STATE_XFERRED_DATA;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4667 scsipkt->pkt_resid = alc_len > count ? alc_len - count : 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4668 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4669 *scsipkt->pkt_scbp = STATUS_GOOD;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4670 done:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4671 mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4672 (void) kmem_free(buf, 1024);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4673
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4674 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4675 "Scsi_pkt completion reason %x\n", scsipkt->pkt_reason);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4676
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4677 if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0 &&
11853
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
4678 scsipkt->pkt_comp != NULL) {
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4679 /* scsi callback required */
11853
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
4680 if (servicing_interrupt()) {
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
4681 if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
4682 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
4683 (void *)spx->txlt_scsi_pkt, TQ_NOSLEEP) == NULL) {
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
4684 return (TRAN_BUSY);
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
4685 }
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
4686 } else if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
4687 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
4688 (void *)spx->txlt_scsi_pkt, TQ_SLEEP) == NULL) {
1781
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
4689 /* Scheduling the callback failed */
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
4690 return (TRAN_BUSY);
11853
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
4691 }
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
4692 }
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4693
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4694 return (TRAN_ACCEPT);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4695 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4696
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4697
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4698 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4699 * SATA translate command: Mode Select.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4700 * Translated into appropriate SATA command or emulated.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4701 * Saving parameters is not supported.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4702 * Changing device capacity is not supported (although theoretically
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4703 * possible by executing SET FEATURES/SET MAX ADDRESS)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4704 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4705 * Assumption is that the target driver is working correctly.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4706 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4707 * More than one SATA command may be executed to perform operations specified
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4708 * by mode select pages. The first error terminates further execution.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4709 * Operations performed successully are not backed-up in such case.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4710 *
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
4711 * 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
4712 * - 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
4713 * - 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
4714 * - acoustic management page
10131
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
4715 * - power condition page
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4716 * 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
4717 * an unexpected device reset.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4718 *
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
4719 * 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
4720 * 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
4721 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4722
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4723 static int
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4724 sata_txlt_mode_select(sata_pkt_txlate_t *spx)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4725 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4726 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4727 struct buf *bp = spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4728 struct scsi_extended_sense *sense;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4729 int len, pagelen, count, pllen;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4730 uint8_t *buf; /* mode select buffer */
6591
75b7f3a8280a 6696291 system panic'd running 'format -e c6t4d0'
pawelw
parents: 6539
diff changeset
4731 int rval, stat, reason;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4732 uint_t nointr_flag;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4733 int dmod = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4734
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4735 SATADBG2(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4736 "sata_txlt_mode_select, pc %x page code 0x%02x\n",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4737 spx->txlt_scsi_pkt->pkt_cdbp[2] >> 6,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4738 spx->txlt_scsi_pkt->pkt_cdbp[2] & 0x3f);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4739
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4740 mutex_enter(&(SATA_TXLT_CPORT_MUTEX(spx)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4741
11391
1f1cf000a9eb 6911155 kernel dump fails if panic happens in interrupt service routine
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 11351
diff changeset
4742 if (((rval = sata_txlt_generic_pkt_info(spx, &reason, 1)) !=
6591
75b7f3a8280a 6696291 system panic'd running 'format -e c6t4d0'
pawelw
parents: 6539
diff changeset
4743 TRAN_ACCEPT) || (reason == CMD_DEV_GONE)) {
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4744 mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4745 return (rval);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4746 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4747
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4748 rval = TRAN_ACCEPT;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4749
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4750 scsipkt->pkt_reason = CMD_CMPLT;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4751 scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4752 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
4753 nointr_flag = scsipkt->pkt_flags & FLAG_NOINTR;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4754
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4755 /* Reject not supported request */
1675
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
4756 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
4757 *scsipkt->pkt_scbp = STATUS_CHECK;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4758 sense = sata_arq_sense(spx);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4759 sense->es_key = KEY_ILLEGAL_REQUEST;
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
4760 sense->es_add_code = SD_SCSI_ASC_INVALID_FIELD_IN_CDB;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4761 goto done;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4762 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4763
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4764 if (scsipkt->pkt_cdbp[0] == SCMD_MODE_SELECT) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4765 pllen = scsipkt->pkt_cdbp[4];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4766 } else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4767 pllen = scsipkt->pkt_cdbp[7];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4768 pllen = (pllen << 8) | scsipkt->pkt_cdbp[7];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4769 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4770
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4771 *scsipkt->pkt_scbp = STATUS_GOOD; /* Presumed outcome */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4772
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4773 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
4774 buf = (uint8_t *)bp->b_un.b_addr;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4775 count = MIN(bp->b_bcount, pllen);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4776 scsipkt->pkt_state |= STATE_XFERRED_DATA;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4777 scsipkt->pkt_resid = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4778 pllen = count;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4779
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4780 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4781 * Check the header to skip the block descriptor(s) - we
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4782 * do not support setting device capacity.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4783 * Existing macros do not recognize long LBA dscriptor,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4784 * hence manual calculation.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4785 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4786 if (scsipkt->pkt_cdbp[0] == SCMD_MODE_SELECT) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4787 /* 6-bytes CMD, 4 bytes header */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4788 if (count <= 4)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4789 goto done; /* header only */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4790 len = buf[3] + 4;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4791 } else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4792 /* 10-bytes CMD, 8 bytes header */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4793 if (count <= 8)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4794 goto done; /* header only */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4795 len = buf[6];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4796 len = (len << 8) + buf[7] + 8;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4797 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4798 if (len >= count)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4799 goto done; /* header + descriptor(s) only */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4800
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4801 pllen -= len; /* remaining data length */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4802
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4803 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4804 * We may be executing SATA command and want to execute it
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4805 * in SYNCH mode, regardless of scsi_pkt setting.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4806 * Save scsi_pkt setting and indicate SYNCH mode
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4807 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4808 if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0 &&
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4809 scsipkt->pkt_comp != NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4810 scsipkt->pkt_flags |= FLAG_NOINTR;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4811 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4812 spx->txlt_sata_pkt->satapkt_op_mode = SATA_OPMODE_SYNCH;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4813
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4814 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4815 * len is now the offset to a first mode select page
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4816 * Process all pages
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4817 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4818 while (pllen > 0) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4819 switch ((int)buf[len]) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4820 case MODEPAGE_CACHING:
1675
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
4821 /* No support for SP (saving) */
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
4822 if (scsipkt->pkt_cdbp[1] & 0x01) {
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
4823 *scsipkt->pkt_scbp = STATUS_CHECK;
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
4824 sense = sata_arq_sense(spx);
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
4825 sense->es_key = KEY_ILLEGAL_REQUEST;
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
4826 sense->es_add_code =
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
4827 SD_SCSI_ASC_INVALID_FIELD_IN_CDB;
1675
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
4828 goto done;
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
4829 }
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4830 stat = sata_mode_select_page_8(spx,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4831 (struct mode_cache_scsi3 *)&buf[len],
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4832 pllen, &pagelen, &rval, &dmod);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4833 /*
1675
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
4834 * The pagelen value indicates the number of
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4835 * parameter bytes already processed.
1675
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
4836 * The rval is the return value from
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
4837 * sata_tran_start().
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
4838 * The stat indicates the overall status of
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
4839 * the operation(s).
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
4840 */
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
4841 if (stat != SATA_SUCCESS)
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
4842 /*
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
4843 * Page processing did not succeed -
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
4844 * all error info is already set-up,
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
4845 * just return
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
4846 */
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
4847 pllen = 0; /* this breaks the loop */
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
4848 else {
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
4849 len += pagelen;
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
4850 pllen -= pagelen;
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
4851 }
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
4852 break;
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
4853
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
4854 case MODEPAGE_INFO_EXCPT:
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
4855 stat = sata_mode_select_page_1c(spx,
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
4856 (struct mode_info_excpt_page *)&buf[len],
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
4857 pllen, &pagelen, &rval, &dmod);
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
4858 /*
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
4859 * The pagelen value indicates the number of
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
4860 * parameter bytes already processed.
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
4861 * The rval is the return value from
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4862 * sata_tran_start().
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4863 * The stat indicates the overall status of
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4864 * the operation(s).
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4865 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4866 if (stat != SATA_SUCCESS)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4867 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4868 * Page processing did not succeed -
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4869 * all error info is already set-up,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4870 * just return
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4871 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4872 pllen = 0; /* this breaks the loop */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4873 else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4874 len += pagelen;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4875 pllen -= pagelen;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4876 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4877 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4878
4836
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
4879 case MODEPAGE_ACOUSTIC_MANAG:
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
4880 stat = sata_mode_select_page_30(spx,
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
4881 (struct mode_acoustic_management *)
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
4882 &buf[len], pllen, &pagelen, &rval, &dmod);
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
4883 /*
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
4884 * The pagelen value indicates the number of
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
4885 * parameter bytes already processed.
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
4886 * The rval is the return value from
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
4887 * sata_tran_start().
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
4888 * The stat indicates the overall status of
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
4889 * the operation(s).
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
4890 */
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
4891 if (stat != SATA_SUCCESS)
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
4892 /*
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
4893 * Page processing did not succeed -
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
4894 * all error info is already set-up,
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
4895 * just return
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
4896 */
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
4897 pllen = 0; /* this breaks the loop */
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
4898 else {
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
4899 len += pagelen;
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
4900 pllen -= pagelen;
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
4901 }
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
4902
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
4903 break;
10131
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
4904 case MODEPAGE_POWER_COND:
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
4905 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
4906 (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
4907 pllen, &pagelen, &rval, &dmod);
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
4908 /*
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
4909 * 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
4910 * parameter bytes already processed.
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
4911 * 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
4912 * sata_tran_start().
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
4913 * 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
4914 * the operation(s).
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
4915 */
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
4916 if (stat != SATA_SUCCESS)
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
4917 /*
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
4918 * Page processing did not succeed -
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
4919 * 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
4920 * just return
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
4921 */
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
4922 pllen = 0; /* this breaks the loop */
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
4923 else {
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
4924 len += pagelen;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
4925 pllen -= pagelen;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
4926 }
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
4927 break;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4928 default:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4929 *scsipkt->pkt_scbp = STATUS_CHECK;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4930 sense = sata_arq_sense(spx);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4931 sense->es_key = KEY_ILLEGAL_REQUEST;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4932 sense->es_add_code =
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
4933 SD_SCSI_ASC_INVALID_FIELD_IN_PARAMS_LIST;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4934 goto done;
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 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4937 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4938 done:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4939 mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4940 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4941 * If device parameters were modified, fetch and store the new
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4942 * Identify Device data. Since port mutex could have been released
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4943 * for accessing HBA driver, we need to re-check device existence.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4944 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4945 if (dmod != 0) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4946 sata_drive_info_t new_sdinfo, *sdinfo;
5832
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
4947 int rv = 0;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
4948
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
4949 /*
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
4950 * Following statement has to be changed if this function is
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
4951 * used for devices other than SATA hard disks.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
4952 */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
4953 new_sdinfo.satadrv_type = SATA_DTYPE_ATADISK;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4954
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4955 new_sdinfo.satadrv_addr =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4956 spx->txlt_sata_pkt->satapkt_device.satadev_addr;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4957 rv = sata_fetch_device_identify_data(spx->txlt_sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4958 &new_sdinfo);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4959
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4960 mutex_enter(&(SATA_TXLT_CPORT_MUTEX(spx)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4961 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4962 * Since port mutex could have been released when
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4963 * accessing HBA driver, we need to re-check that the
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4964 * framework still holds the device info structure.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4965 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4966 sdinfo = sata_get_device_info(spx->txlt_sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4967 &spx->txlt_sata_pkt->satapkt_device);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4968 if (sdinfo != NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4969 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4970 * Device still has info structure in the
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4971 * sata framework. Copy newly fetched info
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4972 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4973 if (rv == 0) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4974 sdinfo->satadrv_id = new_sdinfo.satadrv_id;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4975 sata_save_drive_settings(sdinfo);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4976 } else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4977 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4978 * Could not fetch new data - invalidate
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4979 * sata_drive_info. That makes device
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4980 * unusable.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4981 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4982 sdinfo->satadrv_type = SATA_DTYPE_UNKNOWN;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4983 sdinfo->satadrv_state = SATA_STATE_UNKNOWN;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4984 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4985 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4986 if (rv != 0 || sdinfo == NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4987 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4988 * This changes the overall mode select completion
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4989 * reason to a failed one !!!!!
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4990 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4991 *scsipkt->pkt_scbp = STATUS_CHECK;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4992 sense = sata_arq_sense(spx);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4993 scsipkt->pkt_reason = CMD_INCOMPLETE;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4994 rval = TRAN_ACCEPT;
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 mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4997 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4998 /* Restore the scsi pkt flags */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4999 scsipkt->pkt_flags &= ~FLAG_NOINTR;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5000 scsipkt->pkt_flags |= nointr_flag;
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 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5003 "Scsi_pkt completion reason %x\n", scsipkt->pkt_reason);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5004
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5005 if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0 &&
11853
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
5006 scsipkt->pkt_comp != NULL) {
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5007 /* scsi callback required */
11853
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
5008 if (servicing_interrupt()) {
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
5009 if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
5010 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
5011 (void *)spx->txlt_scsi_pkt, TQ_NOSLEEP) == NULL) {
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
5012 return (TRAN_BUSY);
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
5013 }
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
5014 } else if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
5015 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
5016 (void *)spx->txlt_scsi_pkt, TQ_SLEEP) == NULL) {
1781
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
5017 /* Scheduling the callback failed */
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
5018 return (TRAN_BUSY);
11853
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
5019 }
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
5020 }
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5021
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5022 return (rval);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5023 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5024
11222
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5025 /*
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5026 * Translate command: ATA Pass Through
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5027 * Incomplete implementation. Only supports No-Data, PIO Data-In, and
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5028 * PIO Data-Out protocols. Also supports CK_COND bit.
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5029 *
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5030 * Mapping of the incoming CDB bytes to the outgoing satacmd bytes is
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5031 * described in Table 111 of SAT-2 (Draft 9).
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5032 */
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5033 static int
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5034 sata_txlt_ata_pass_thru(sata_pkt_txlate_t *spx)
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5035 {
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5036 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5037 sata_cmd_t *scmd = &spx->txlt_sata_pkt->satapkt_cmd;
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5038 struct buf *bp = spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp;
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5039 int extend;
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5040 uint64_t lba;
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5041 uint16_t feature, sec_count;
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5042 int t_len, synch;
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5043 int rval, reason;
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5044
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5045 mutex_enter(&(SATA_TXLT_CPORT_MUTEX(spx)));
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5046
11391
1f1cf000a9eb 6911155 kernel dump fails if panic happens in interrupt service routine
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 11351
diff changeset
5047 rval = sata_txlt_generic_pkt_info(spx, &reason, 1);
11222
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5048 if ((rval != TRAN_ACCEPT) || (reason == CMD_DEV_GONE)) {
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5049 mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx)));
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5050 return (rval);
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5051 }
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5052
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5053 /* T_DIR bit */
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5054 if (scsipkt->pkt_cdbp[2] & SATL_APT_BM_T_DIR)
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5055 scmd->satacmd_flags.sata_data_direction = SATA_DIR_READ;
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5056 else
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5057 scmd->satacmd_flags.sata_data_direction = SATA_DIR_WRITE;
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5058
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5059 /* MULTIPLE_COUNT field. If non-zero, invalid command (for now). */
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5060 if (((scsipkt->pkt_cdbp[1] >> 5) & 0x7) != 0) {
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5061 mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx)));
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5062 return (sata_txlt_ata_pass_thru_illegal_cmd(spx));
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5063 }
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5064
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5065 /* OFFLINE field. If non-zero, invalid command (for now). */
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5066 if (((scsipkt->pkt_cdbp[2] >> 6) & 0x3) != 0) {
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5067 mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx)));
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5068 return (sata_txlt_ata_pass_thru_illegal_cmd(spx));
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5069 }
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5070
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5071 /* PROTOCOL field */
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5072 switch ((scsipkt->pkt_cdbp[1] >> 1) & 0xf) {
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5073 case SATL_APT_P_HW_RESET:
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5074 case SATL_APT_P_SRST:
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5075 case SATL_APT_P_DMA:
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5076 case SATL_APT_P_DMA_QUEUED:
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5077 case SATL_APT_P_DEV_DIAG:
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5078 case SATL_APT_P_DEV_RESET:
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5079 case SATL_APT_P_UDMA_IN:
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5080 case SATL_APT_P_UDMA_OUT:
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5081 case SATL_APT_P_FPDMA:
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5082 case SATL_APT_P_RET_RESP:
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5083 /* Not yet implemented */
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5084 default:
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5085 mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx)));
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5086 return (sata_txlt_ata_pass_thru_illegal_cmd(spx));
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5087
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5088 case SATL_APT_P_NON_DATA:
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5089 scmd->satacmd_flags.sata_data_direction = SATA_DIR_NODATA_XFER;
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5090 break;
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5091
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5092 case SATL_APT_P_PIO_DATA_IN:
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5093 /* If PROTOCOL disagrees with T_DIR, invalid command */
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5094 if (scmd->satacmd_flags.sata_data_direction == SATA_DIR_WRITE) {
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5095 mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx)));
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5096 return (sata_txlt_ata_pass_thru_illegal_cmd(spx));
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5097 }
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5098
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5099 /* if there is a buffer, release its DMA resources */
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5100 if ((bp != NULL) && bp->b_un.b_addr && bp->b_bcount) {
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5101 sata_scsi_dmafree(NULL, scsipkt);
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5102 } else {
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5103 /* if there is no buffer, how do you PIO in? */
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5104 mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx)));
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5105 return (sata_txlt_ata_pass_thru_illegal_cmd(spx));
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5106 }
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5107
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5108 break;
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5109
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5110 case SATL_APT_P_PIO_DATA_OUT:
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5111 /* If PROTOCOL disagrees with T_DIR, invalid command */
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5112 if (scmd->satacmd_flags.sata_data_direction == SATA_DIR_READ) {
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5113 mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx)));
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5114 return (sata_txlt_ata_pass_thru_illegal_cmd(spx));
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5115 }
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5116
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5117 /* if there is a buffer, release its DMA resources */
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5118 if ((bp != NULL) && bp->b_un.b_addr && bp->b_bcount) {
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5119 sata_scsi_dmafree(NULL, scsipkt);
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5120 } else {
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5121 /* if there is no buffer, how do you PIO out? */
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5122 mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx)));
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5123 return (sata_txlt_ata_pass_thru_illegal_cmd(spx));
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5124 }
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5125
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5126 break;
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5127 }
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5128
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5129 /* Parse the ATA cmd fields, transfer some straight to the satacmd */
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5130 switch ((uint_t)scsipkt->pkt_cdbp[0]) {
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5131 case SPC3_CMD_ATA_COMMAND_PASS_THROUGH12:
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5132 feature = scsipkt->pkt_cdbp[3];
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5133
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5134 sec_count = scsipkt->pkt_cdbp[4];
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5135
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5136 lba = scsipkt->pkt_cdbp[8] & 0xf;
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5137 lba = (lba << 8) | scsipkt->pkt_cdbp[7];
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5138 lba = (lba << 8) | scsipkt->pkt_cdbp[6];
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5139 lba = (lba << 8) | scsipkt->pkt_cdbp[5];
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5140
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5141 scmd->satacmd_device_reg = scsipkt->pkt_cdbp[13] & 0xf0;
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5142 scmd->satacmd_cmd_reg = scsipkt->pkt_cdbp[9];
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5143
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5144 break;
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5145
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5146 case SPC3_CMD_ATA_COMMAND_PASS_THROUGH16:
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5147 if (scsipkt->pkt_cdbp[1] & SATL_APT_BM_EXTEND) {
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5148 extend = 1;
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5149
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5150 feature = scsipkt->pkt_cdbp[3];
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5151 feature = (feature << 8) | scsipkt->pkt_cdbp[4];
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5152
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5153 sec_count = scsipkt->pkt_cdbp[5];
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5154 sec_count = (sec_count << 8) | scsipkt->pkt_cdbp[6];
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5155
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5156 lba = scsipkt->pkt_cdbp[11];
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5157 lba = (lba << 8) | scsipkt->pkt_cdbp[12];
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5158 lba = (lba << 8) | scsipkt->pkt_cdbp[9];
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5159 lba = (lba << 8) | scsipkt->pkt_cdbp[10];
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5160 lba = (lba << 8) | scsipkt->pkt_cdbp[7];
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5161 lba = (lba << 8) | scsipkt->pkt_cdbp[8];
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5162
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5163 scmd->satacmd_device_reg = scsipkt->pkt_cdbp[13];
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5164 scmd->satacmd_cmd_reg = scsipkt->pkt_cdbp[14];
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5165 } else {
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5166 feature = scsipkt->pkt_cdbp[3];
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5167
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5168 sec_count = scsipkt->pkt_cdbp[5];
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5169
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5170 lba = scsipkt->pkt_cdbp[13] & 0xf;
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5171 lba = (lba << 8) | scsipkt->pkt_cdbp[12];
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5172 lba = (lba << 8) | scsipkt->pkt_cdbp[10];
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5173 lba = (lba << 8) | scsipkt->pkt_cdbp[8];
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5174
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5175 scmd->satacmd_device_reg = scsipkt->pkt_cdbp[13] &
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5176 0xf0;
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5177 scmd->satacmd_cmd_reg = scsipkt->pkt_cdbp[14];
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5178 }
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5179
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5180 break;
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5181 }
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5182
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5183 /* CK_COND bit */
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5184 if (scsipkt->pkt_cdbp[2] & SATL_APT_BM_CK_COND) {
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5185 if (extend) {
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5186 scmd->satacmd_flags.sata_copy_out_sec_count_msb = 1;
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5187 scmd->satacmd_flags.sata_copy_out_lba_low_msb = 1;
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5188 scmd->satacmd_flags.sata_copy_out_lba_mid_msb = 1;
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5189 scmd->satacmd_flags.sata_copy_out_lba_high_msb = 1;
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5190 }
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5191
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5192 scmd->satacmd_flags.sata_copy_out_sec_count_lsb = 1;
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5193 scmd->satacmd_flags.sata_copy_out_lba_low_lsb = 1;
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5194 scmd->satacmd_flags.sata_copy_out_lba_mid_lsb = 1;
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5195 scmd->satacmd_flags.sata_copy_out_lba_high_lsb = 1;
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5196 scmd->satacmd_flags.sata_copy_out_device_reg = 1;
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5197 scmd->satacmd_flags.sata_copy_out_error_reg = 1;
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5198 }
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5199
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5200 /* Transfer remaining parsed ATA cmd values to the satacmd */
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5201 if (extend) {
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5202 scmd->satacmd_addr_type = ATA_ADDR_LBA48;
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5203
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5204 scmd->satacmd_features_reg_ext = (feature >> 8) & 0xff;
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5205 scmd->satacmd_sec_count_msb = (sec_count >> 8) & 0xff;
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5206 scmd->satacmd_lba_low_msb = (lba >> 8) & 0xff;
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5207 scmd->satacmd_lba_mid_msb = (lba >> 8) & 0xff;
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5208 scmd->satacmd_lba_high_msb = lba >> 40;
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5209 } else {
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5210 scmd->satacmd_addr_type = ATA_ADDR_LBA28;
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5211
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5212 scmd->satacmd_features_reg_ext = 0;
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5213 scmd->satacmd_sec_count_msb = 0;
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5214 scmd->satacmd_lba_low_msb = 0;
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5215 scmd->satacmd_lba_mid_msb = 0;
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5216 scmd->satacmd_lba_high_msb = 0;
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5217 }
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5218
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5219 scmd->satacmd_features_reg = feature & 0xff;
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5220 scmd->satacmd_sec_count_lsb = sec_count & 0xff;
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5221 scmd->satacmd_lba_low_lsb = lba & 0xff;
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5222 scmd->satacmd_lba_mid_lsb = (lba >> 8) & 0xff;
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5223 scmd->satacmd_lba_high_lsb = (lba >> 16) & 0xff;
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5224
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5225 /* Determine transfer length */
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5226 switch (scsipkt->pkt_cdbp[2] & 0x3) { /* T_LENGTH field */
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5227 case 1:
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5228 t_len = feature;
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5229 break;
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5230 case 2:
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5231 t_len = sec_count;
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5232 break;
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5233 default:
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5234 t_len = 0;
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5235 break;
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5236 }
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5237
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5238 /* Adjust transfer length for the Byte Block bit */
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5239 if ((scsipkt->pkt_cdbp[2] >> 2) & 1)
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5240 t_len *= SATA_DISK_SECTOR_SIZE;
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5241
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5242 /* Start processing command */
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5243 if (!(spx->txlt_sata_pkt->satapkt_op_mode & SATA_OPMODE_SYNCH)) {
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5244 spx->txlt_sata_pkt->satapkt_comp = sata_txlt_apt_completion;
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5245 synch = FALSE;
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5246 } else {
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5247 synch = TRUE;
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5248 }
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5249
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5250 if (sata_hba_start(spx, &rval) != 0) {
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5251 mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx)));
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5252 return (rval);
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5253 }
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5254
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5255 mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx)));
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5256
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5257 if (synch) {
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5258 sata_txlt_apt_completion(spx->txlt_sata_pkt);
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5259 }
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5260
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5261 return (TRAN_ACCEPT);
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
5262 }
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5263
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 * Translate command: Log Sense
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5266 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5267 static int
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5268 sata_txlt_log_sense(sata_pkt_txlate_t *spx)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5269 {
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
5270 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
5271 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
5272 sata_drive_info_t *sdinfo;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
5273 struct scsi_extended_sense *sense;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
5274 int len, count, alc_len;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
5275 int pc; /* Page Control code */
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
5276 int page_code; /* Page code */
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
5277 uint8_t *buf; /* log sense buffer */
6591
75b7f3a8280a 6696291 system panic'd running 'format -e c6t4d0'
pawelw
parents: 6539
diff changeset
5278 int rval, reason;
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
5279 #define MAX_LOG_SENSE_PAGE_SIZE 512
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
5280
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5281 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
5282 "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
5283 spx->txlt_scsi_pkt->pkt_cdbp[2] >> 6,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5284 spx->txlt_scsi_pkt->pkt_cdbp[2] & 0x3f);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5285
11853
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
5286 if (servicing_interrupt()) {
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
5287 buf = kmem_zalloc(MAX_LOG_SENSE_PAGE_SIZE, KM_NOSLEEP);
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
5288 if (buf == NULL) {
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
5289 return (TRAN_BUSY);
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
5290 }
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
5291 } else {
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
5292 buf = kmem_zalloc(MAX_LOG_SENSE_PAGE_SIZE, KM_SLEEP);
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
5293 }
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
5294
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
5295 mutex_enter(&(SATA_TXLT_CPORT_MUTEX(spx)));
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
5296
11391
1f1cf000a9eb 6911155 kernel dump fails if panic happens in interrupt service routine
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 11351
diff changeset
5297 if (((rval = sata_txlt_generic_pkt_info(spx, &reason, 1)) !=
6591
75b7f3a8280a 6696291 system panic'd running 'format -e c6t4d0'
pawelw
parents: 6539
diff changeset
5298 TRAN_ACCEPT) || (reason == CMD_DEV_GONE)) {
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
5299 mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx)));
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
5300 kmem_free(buf, MAX_LOG_SENSE_PAGE_SIZE);
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
5301 return (rval);
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
5302 }
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
5303
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
5304 scsipkt->pkt_reason = CMD_CMPLT;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
5305 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
5306 STATE_SENT_CMD | STATE_GOT_STATUS;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
5307
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
5308 pc = scsipkt->pkt_cdbp[2] >> 6;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
5309 page_code = scsipkt->pkt_cdbp[2] & 0x3f;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
5310
2553
624f674f2ad8 6430966 SATA NCQ support is needed in SATA framework and hba drivers
ls24207
parents: 2539
diff changeset
5311 /* 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
5312 switch (pc) {
2553
624f674f2ad8 6430966 SATA NCQ support is needed in SATA framework and hba drivers
ls24207
parents: 2539
diff changeset
5313 case PC_CUMULATIVE_VALUES:
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
5314 break;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
5315 default:
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
5316 *scsipkt->pkt_scbp = STATUS_CHECK;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
5317 sense = sata_arq_sense(spx);
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
5318 sense->es_key = KEY_ILLEGAL_REQUEST;
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
5319 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
5320 goto done;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
5321 }
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
5322
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
5323 switch (page_code) {
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
5324 case PAGE_CODE_GET_SUPPORTED_LOG_PAGES:
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
5325 case PAGE_CODE_SELF_TEST_RESULTS:
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
5326 case PAGE_CODE_INFORMATION_EXCEPTIONS:
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
5327 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
5328 case PAGE_CODE_START_STOP_CYCLE_COUNTER:
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
5329 break;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
5330 default:
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
5331 *scsipkt->pkt_scbp = STATUS_CHECK;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
5332 sense = sata_arq_sense(spx);
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
5333 sense->es_key = KEY_ILLEGAL_REQUEST;
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
5334 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
5335 goto done;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
5336 }
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
5337
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
5338 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
5339 /*
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
5340 * 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
5341 * the devices and sets the data programatically in the
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
5342 * original specified buffer, release preallocated DMA
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
5343 * resources before storing data in the original buffer,
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
5344 * so no unwanted DMA sync would take place.
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
5345 */
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
5346 sata_id_t *sata_id;
4876
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
5347
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
5348 sata_scsi_dmafree(NULL, scsipkt);
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
5349
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
5350 len = 0;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
5351
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
5352 /* Build log parameter header */
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
5353 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
5354 buf[len++] = 0; /* reserved */
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
5355 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
5356 buf[len++] = 0; /* (LSB) */
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
5357
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
5358 sdinfo = sata_get_device_info(
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
5359 spx->txlt_sata_hba_inst,
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
5360 &spx->txlt_sata_pkt->satapkt_device);
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
5361
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
5362 /*
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
5363 * Add requested pages.
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
5364 */
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
5365 switch (page_code) {
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
5366 case PAGE_CODE_GET_SUPPORTED_LOG_PAGES:
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
5367 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
5368 break;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
5369 case PAGE_CODE_SELF_TEST_RESULTS:
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
5370 sata_id = &sdinfo->satadrv_id;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
5371 if ((! (sata_id->ai_cmdset84 &
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
5372 SATA_SMART_SELF_TEST_SUPPORTED)) ||
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
5373 (! (sata_id->ai_features87 &
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
5374 SATA_SMART_SELF_TEST_SUPPORTED))) {
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
5375 *scsipkt->pkt_scbp = STATUS_CHECK;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
5376 sense = sata_arq_sense(spx);
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
5377 sense->es_key = KEY_ILLEGAL_REQUEST;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
5378 sense->es_add_code =
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
5379 SD_SCSI_ASC_INVALID_FIELD_IN_CDB;
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
5380
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
5381 goto done;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
5382 }
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
5383 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
5384 spx->txlt_sata_hba_inst);
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
5385 break;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
5386 case PAGE_CODE_INFORMATION_EXCEPTIONS:
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
5387 sata_id = &sdinfo->satadrv_id;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
5388 if (! (sata_id->ai_cmdset82 & SATA_SMART_SUPPORTED)) {
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
5389 *scsipkt->pkt_scbp = STATUS_CHECK;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
5390 sense = sata_arq_sense(spx);
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
5391 sense->es_key = KEY_ILLEGAL_REQUEST;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
5392 sense->es_add_code =
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
5393 SD_SCSI_ASC_INVALID_FIELD_IN_CDB;
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
5394
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
5395 goto done;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
5396 }
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
5397 if (! (sata_id->ai_features85 & SATA_SMART_ENABLED)) {
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
5398 *scsipkt->pkt_scbp = STATUS_CHECK;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
5399 sense = sata_arq_sense(spx);
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
5400 sense->es_key = KEY_ABORTED_COMMAND;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
5401 sense->es_add_code =
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
5402 SCSI_ASC_ATA_DEV_FEAT_NOT_ENABLED;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
5403 sense->es_qual_code =
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
5404 SCSI_ASCQ_ATA_DEV_FEAT_NOT_ENABLED;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
5405
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
5406 goto done;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
5407 }
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
5408
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
5409 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
5410 spx->txlt_sata_hba_inst);
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
5411 break;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
5412 case PAGE_CODE_SMART_READ_DATA:
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
5413 sata_id = &sdinfo->satadrv_id;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
5414 if (! (sata_id->ai_cmdset82 & SATA_SMART_SUPPORTED)) {
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
5415 *scsipkt->pkt_scbp = STATUS_CHECK;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
5416 sense = sata_arq_sense(spx);
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
5417 sense->es_key = KEY_ILLEGAL_REQUEST;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
5418 sense->es_add_code =
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
5419 SD_SCSI_ASC_INVALID_FIELD_IN_CDB;
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
5420
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
5421 goto done;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
5422 }
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
5423 if (! (sata_id->ai_features85 & SATA_SMART_ENABLED)) {
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
5424 *scsipkt->pkt_scbp = STATUS_CHECK;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
5425 sense = sata_arq_sense(spx);
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
5426 sense->es_key = KEY_ABORTED_COMMAND;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
5427 sense->es_add_code =
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
5428 SCSI_ASC_ATA_DEV_FEAT_NOT_ENABLED;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
5429 sense->es_qual_code =
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
5430 SCSI_ASCQ_ATA_DEV_FEAT_NOT_ENABLED;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
5431
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
5432 goto done;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
5433 }
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
5434
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
5435 /* This page doesn't include a page header */
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
5436 len = sata_build_lsense_page_30(sdinfo, buf,
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
5437 spx->txlt_sata_hba_inst);
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
5438 goto no_header;
10131
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
5439 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
5440 sata_id = &sdinfo->satadrv_id;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
5441 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
5442 *scsipkt->pkt_scbp = STATUS_CHECK;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
5443 sense = sata_arq_sense(spx);
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
5444 sense->es_key = KEY_ILLEGAL_REQUEST;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
5445 sense->es_add_code =
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
5446 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
5447
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
5448 goto done;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
5449 }
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
5450 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
5451 *scsipkt->pkt_scbp = STATUS_CHECK;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
5452 sense = sata_arq_sense(spx);
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
5453 sense->es_key = KEY_ABORTED_COMMAND;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
5454 sense->es_add_code =
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
5455 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
5456 sense->es_qual_code =
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
5457 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
5458
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
5459 goto done;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
5460 }
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
5461 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
5462 goto no_header;
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
5463 default:
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
5464 /* Invalid request */
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
5465 *scsipkt->pkt_scbp = STATUS_CHECK;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
5466 sense = sata_arq_sense(spx);
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
5467 sense->es_key = KEY_ILLEGAL_REQUEST;
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
5468 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
5469 goto done;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
5470 }
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
5471
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
5472 /* set parameter log sense data length */
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
5473 buf[2] = len >> 8; /* log sense length (MSB) */
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
5474 buf[3] = len & 0xff; /* log sense length (LSB) */
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
5475
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
5476 len += SCSI_LOG_PAGE_HDR_LEN;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
5477 ASSERT(len <= MAX_LOG_SENSE_PAGE_SIZE);
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
5478
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
5479 no_header:
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
5480 /* Check allocation length */
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
5481 alc_len = scsipkt->pkt_cdbp[7];
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
5482 alc_len = (len << 8) | scsipkt->pkt_cdbp[8];
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
5483
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
5484 /*
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
5485 * We do not check for possible parameters truncation
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
5486 * (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
5487 * correctly. Just avoiding overrun.
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
5488 * 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
5489 */
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
5490 count = MIN(alc_len, len);
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
5491 count = MIN(bp->b_bcount, count);
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
5492 bcopy(buf, bp->b_un.b_addr, count);
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
5493
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
5494 scsipkt->pkt_state |= STATE_XFERRED_DATA;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
5495 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
5496 }
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
5497 *scsipkt->pkt_scbp = STATUS_GOOD;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
5498 done:
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
5499 mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx)));
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
5500 (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
5501
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
5502 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
5503 "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
5504
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
5505 if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0 &&
11853
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
5506 scsipkt->pkt_comp != NULL) {
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
5507 /* scsi callback required */
11853
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
5508 if (servicing_interrupt()) {
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
5509 if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
5510 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
5511 (void *)spx->txlt_scsi_pkt, TQ_NOSLEEP) == NULL) {
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
5512 return (TRAN_BUSY);
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
5513 }
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
5514 } else if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
5515 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
5516 (void *)spx->txlt_scsi_pkt, TQ_SLEEP) == NULL) {
1781
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
5517 /* Scheduling the callback failed */
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
5518 return (TRAN_BUSY);
11853
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
5519 }
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
5520 }
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
5521
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
5522 return (TRAN_ACCEPT);
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5523 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5524
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5525 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5526 * Translate command: Log Select
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5527 * Not implemented at this time - returns invalid command response.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5528 */
10131
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
5529 static int
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5530 sata_txlt_log_select(sata_pkt_txlate_t *spx)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5531 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5532 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5533 "sata_txlt_log_select\n", NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5534
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5535 return (sata_txlt_invalid_command(spx));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5536 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5537
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5538
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5539 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5540 * Translate command: Read (various types).
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5541 * Translated into appropriate type of ATA READ command
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
5542 * for SATA hard disks.
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5543 * Both the device capabilities and requested operation mode are
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5544 * considered.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5545 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5546 * Following scsi cdb fields are ignored:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5547 * rdprotect, dpo, fua, fua_nv, group_number.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5548 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5549 * 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
5550 * enable variable sata_func_enable), the capability of the controller and
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5551 * capability of a device are checked and if both support queueing, read
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5552 * 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
5553 * command rather than plain READ_XXX command.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5554 * 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
5555 * both the controller and device suport such functionality, the read
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5556 * 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
5557 * 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
5558 * 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
5559 * 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
5560 * 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
5561 * is 32.
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5562 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5563 * Returns TRAN_ACCEPT or code returned by sata_hba_start() and
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5564 * appropriate values in scsi_pkt fields.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5565 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5566 static int
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5567 sata_txlt_read(sata_pkt_txlate_t *spx)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5568 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5569 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5570 sata_cmd_t *scmd = &spx->txlt_sata_pkt->satapkt_cmd;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5571 sata_drive_info_t *sdinfo;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5572 sata_hba_inst_t *shi = SATA_TXLT_HBA_INST(spx);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5573 int cport = SATA_TXLT_CPORT(spx);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5574 uint16_t sec_count;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5575 uint64_t lba;
6591
75b7f3a8280a 6696291 system panic'd running 'format -e c6t4d0'
pawelw
parents: 6539
diff changeset
5576 int rval, reason;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5577 int synch;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5578
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5579 mutex_enter(&(SATA_TXLT_CPORT_MUTEX(spx)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5580
11401
1b705ea0360c 6913126 system hang possible in sata hba after CR 6911155
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 11391
diff changeset
5581 if (((rval = sata_txlt_generic_pkt_info(spx, &reason, 0)) !=
6591
75b7f3a8280a 6696291 system panic'd running 'format -e c6t4d0'
pawelw
parents: 6539
diff changeset
5582 TRAN_ACCEPT) || (reason == CMD_DEV_GONE)) {
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5583 mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5584 return (rval);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5585 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5586
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5587 sdinfo = sata_get_device_info(spx->txlt_sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5588 &spx->txlt_sata_pkt->satapkt_device);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5589
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
5590 scmd->satacmd_flags.sata_data_direction = SATA_DIR_READ;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5591 /*
3935
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
5592 * Extract LBA and sector count from scsi CDB.
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5593 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5594 switch ((uint_t)scsipkt->pkt_cdbp[0]) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5595 case SCMD_READ:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5596 /* 6-byte scsi read cmd : 0x08 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5597 lba = (scsipkt->pkt_cdbp[1] & 0x1f);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5598 lba = (lba << 8) | scsipkt->pkt_cdbp[2];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5599 lba = (lba << 8) | scsipkt->pkt_cdbp[3];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5600 sec_count = scsipkt->pkt_cdbp[4];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5601 /* sec_count 0 will be interpreted as 256 by a device */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5602 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5603 case SCMD_READ_G1:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5604 /* 10-bytes scsi read command : 0x28 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5605 lba = scsipkt->pkt_cdbp[2];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5606 lba = (lba << 8) | scsipkt->pkt_cdbp[3];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5607 lba = (lba << 8) | scsipkt->pkt_cdbp[4];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5608 lba = (lba << 8) | scsipkt->pkt_cdbp[5];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5609 sec_count = scsipkt->pkt_cdbp[7];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5610 sec_count = (sec_count << 8) | scsipkt->pkt_cdbp[8];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5611 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5612 case SCMD_READ_G5:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5613 /* 12-bytes scsi read command : 0xA8 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5614 lba = scsipkt->pkt_cdbp[2];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5615 lba = (lba << 8) | scsipkt->pkt_cdbp[3];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5616 lba = (lba << 8) | scsipkt->pkt_cdbp[4];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5617 lba = (lba << 8) | scsipkt->pkt_cdbp[5];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5618 sec_count = scsipkt->pkt_cdbp[6];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5619 sec_count = (sec_count << 8) | scsipkt->pkt_cdbp[7];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5620 sec_count = (sec_count << 8) | scsipkt->pkt_cdbp[8];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5621 sec_count = (sec_count << 8) | scsipkt->pkt_cdbp[9];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5622 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5623 case SCMD_READ_G4:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5624 /* 16-bytes scsi read command : 0x88 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5625 lba = scsipkt->pkt_cdbp[2];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5626 lba = (lba << 8) | scsipkt->pkt_cdbp[3];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5627 lba = (lba << 8) | scsipkt->pkt_cdbp[4];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5628 lba = (lba << 8) | scsipkt->pkt_cdbp[5];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5629 lba = (lba << 8) | scsipkt->pkt_cdbp[6];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5630 lba = (lba << 8) | scsipkt->pkt_cdbp[7];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5631 lba = (lba << 8) | scsipkt->pkt_cdbp[8];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5632 lba = (lba << 8) | scsipkt->pkt_cdbp[9];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5633 sec_count = scsipkt->pkt_cdbp[10];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5634 sec_count = (sec_count << 8) | scsipkt->pkt_cdbp[11];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5635 sec_count = (sec_count << 8) | scsipkt->pkt_cdbp[12];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5636 sec_count = (sec_count << 8) | scsipkt->pkt_cdbp[13];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5637 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5638 default:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5639 /* Unsupported command */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5640 mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5641 return (sata_txlt_invalid_command(spx));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5642 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5643
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5644 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5645 * Check if specified address exceeds device capacity
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5646 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5647 if ((lba >= sdinfo->satadrv_capacity) ||
2593
79c4a3cba4f1 6462265 sata: framework rejects last addressable LBA on disk as invalid one
pawelw
parents: 2553
diff changeset
5648 ((lba + sec_count) > sdinfo->satadrv_capacity)) {
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5649 /* LBA out of range */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5650 mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5651 return (sata_txlt_lba_out_of_range(spx));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5652 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5653
3935
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
5654 /*
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
5655 * 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
5656 * (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
5657 * No DMA resources were allocated.
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
5658 */
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
5659 if (spx->txlt_dma_cookie_list == NULL) {
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
5660 mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx)));
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
5661 return (sata_emul_rw_completion(spx));
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
5662 }
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
5663
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
5664 /*
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
5665 * 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
5666 * requested operation mode.
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
5667 * 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
5668 * devices supporting DMA.
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
5669 */
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5670 scmd->satacmd_addr_type = ATA_ADDR_LBA;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5671 scmd->satacmd_device_reg = SATA_ADH_LBA;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5672 scmd->satacmd_cmd_reg = SATAC_READ_DMA;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5673 if (sdinfo->satadrv_features_support & SATA_DEV_F_LBA48) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5674 scmd->satacmd_addr_type = ATA_ADDR_LBA48;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5675 scmd->satacmd_cmd_reg = SATAC_READ_DMA_EXT;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5676 scmd->satacmd_sec_count_msb = sec_count >> 8;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5677 #ifndef __lock_lint
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5678 scmd->satacmd_lba_low_msb = (lba >> 24) & 0xff;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5679 scmd->satacmd_lba_mid_msb = (lba >> 32) & 0xff;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5680 scmd->satacmd_lba_high_msb = lba >> 40;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5681 #endif
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5682 } else if (sdinfo->satadrv_features_support & SATA_DEV_F_LBA28) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5683 scmd->satacmd_addr_type = ATA_ADDR_LBA28;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5684 scmd->satacmd_device_reg = SATA_ADH_LBA | ((lba >> 24) & 0xf);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5685 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5686 scmd->satacmd_sec_count_lsb = sec_count & 0xff;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5687 scmd->satacmd_lba_low_lsb = lba & 0xff;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5688 scmd->satacmd_lba_mid_lsb = (lba >> 8) & 0xff;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5689 scmd->satacmd_lba_high_lsb = (lba >> 16) & 0xff;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5690 scmd->satacmd_features_reg = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5691 scmd->satacmd_status_reg = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5692 scmd->satacmd_error_reg = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5693
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5694 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5695 * Check if queueing commands should be used and switch
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5696 * to appropriate command if possible
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5697 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5698 if (sata_func_enable & SATA_ENABLE_QUEUING) {
1940
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
5699 boolean_t using_queuing;
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
5700
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
5701 /* Queuing supported by controller and device? */
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
5702 if ((sata_func_enable & SATA_ENABLE_NCQ) &&
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
5703 (sdinfo->satadrv_features_support &
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
5704 SATA_DEV_F_NCQ) &&
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
5705 (SATA_FEATURES(spx->txlt_sata_hba_inst) &
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
5706 SATA_CTLF_NCQ)) {
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
5707 using_queuing = B_TRUE;
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
5708
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
5709 /* NCQ supported - use FPDMA READ */
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
5710 scmd->satacmd_cmd_reg =
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
5711 SATAC_READ_FPDMA_QUEUED;
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
5712 scmd->satacmd_features_reg_ext =
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
5713 scmd->satacmd_sec_count_msb;
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
5714 scmd->satacmd_sec_count_msb = 0;
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
5715 } else if ((sdinfo->satadrv_features_support &
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
5716 SATA_DEV_F_TCQ) &&
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
5717 (SATA_FEATURES(spx->txlt_sata_hba_inst) &
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
5718 SATA_CTLF_QCMD)) {
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
5719 using_queuing = B_TRUE;
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
5720
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
5721 /* Legacy queueing */
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
5722 if (sdinfo->satadrv_features_support &
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
5723 SATA_DEV_F_LBA48) {
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5724 scmd->satacmd_cmd_reg =
1940
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
5725 SATAC_READ_DMA_QUEUED_EXT;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5726 scmd->satacmd_features_reg_ext =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5727 scmd->satacmd_sec_count_msb;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5728 scmd->satacmd_sec_count_msb = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5729 } else {
1940
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
5730 scmd->satacmd_cmd_reg =
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
5731 SATAC_READ_DMA_QUEUED;
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
5732 }
5014
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
5733 } else /* NCQ nor legacy queuing not supported */
1940
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
5734 using_queuing = B_FALSE;
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
5735
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
5736 /*
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
5737 * 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
5738 * and the secount count will contain the tag.
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
5739 */
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
5740 if (using_queuing) {
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5741 scmd->satacmd_features_reg =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5742 scmd->satacmd_sec_count_lsb;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5743 scmd->satacmd_sec_count_lsb = 0;
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
5744 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
5745
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
5746 /* Set-up maximum queue depth */
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
5747 scmd->satacmd_flags.sata_max_queue_depth =
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
5748 sdinfo->satadrv_max_queue_depth - 1;
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
5749 } else if (sdinfo->satadrv_features_enabled &
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
5750 SATA_DEV_F_E_UNTAGGED_QING) {
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
5751 /*
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
5752 * 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
5753 * may be still used.
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
5754 * Set-up the maximum untagged queue depth.
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
5755 * 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
5756 * 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
5757 * 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
5758 * 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
5759 * 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
5760 * largest value that can be passed via
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
5761 * satacmd_flags.sata_max_queue_depth.
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
5762 */
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
5763 scmd->satacmd_flags.sata_max_queue_depth =
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
5764 SATA_QDEPTH(shi) <= SATA_MAX_QUEUE_DEPTH ?
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
5765 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
5766
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
5767 } else {
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
5768 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
5769 }
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
5770 } else
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
5771 scmd->satacmd_flags.sata_max_queue_depth = 0;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5772
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5773 SATADBG3(SATA_DBG_HBA_IF, spx->txlt_sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5774 "sata_txlt_read cmd 0x%2x, lba %llx, sec count %x\n",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5775 scmd->satacmd_cmd_reg, lba, sec_count);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5776
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5777 if (!(spx->txlt_sata_pkt->satapkt_op_mode & SATA_OPMODE_SYNCH)) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5778 /* Need callback function */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5779 spx->txlt_sata_pkt->satapkt_comp = sata_txlt_rw_completion;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5780 synch = FALSE;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5781 } else
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5782 synch = TRUE;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5783
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5784 /* Transfer command to HBA */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5785 if (sata_hba_start(spx, &rval) != 0) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5786 /* Pkt not accepted for execution */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5787 mutex_exit(&SATA_CPORT_MUTEX(shi, cport));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5788 return (rval);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5789 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5790 mutex_exit(&SATA_CPORT_MUTEX(shi, cport));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5791 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5792 * If execution is non-synchronous,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5793 * a callback function will handle potential errors, translate
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5794 * the response and will do a callback to a target driver.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5795 * If it was synchronous, check execution status using the same
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5796 * framework callback.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5797 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5798 if (synch) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5799 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5800 "synchronous execution status %x\n",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5801 spx->txlt_sata_pkt->satapkt_reason);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5802 sata_txlt_rw_completion(spx->txlt_sata_pkt);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5803 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5804 return (TRAN_ACCEPT);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5805 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5806
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 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5809 * SATA translate command: Write (various types)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5810 * Translated into appropriate type of ATA WRITE command
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
5811 * for SATA hard disks.
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5812 * Both the device capabilities and requested operation mode are
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5813 * considered.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5814 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5815 * Following scsi cdb fields are ignored:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5816 * rwprotect, dpo, fua, fua_nv, group_number.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5817 *
5014
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
5818 * 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
5819 * 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
5820 * 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
5821 * 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
5822 * command rather than plain WRITE_XXX command.
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
5823 * 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
5824 * 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
5825 * 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
5826 * 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
5827 * 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
5828 * 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
5829 * 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
5830 * is 32.
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
5831 *
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5832 * Returns TRAN_ACCEPT or code returned by sata_hba_start() and
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5833 * appropriate values in scsi_pkt fields.
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 static int
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5836 sata_txlt_write(sata_pkt_txlate_t *spx)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5837 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5838 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5839 sata_cmd_t *scmd = &spx->txlt_sata_pkt->satapkt_cmd;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5840 sata_drive_info_t *sdinfo;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5841 sata_hba_inst_t *shi = SATA_TXLT_HBA_INST(spx);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5842 int cport = SATA_TXLT_CPORT(spx);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5843 uint16_t sec_count;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5844 uint64_t lba;
6591
75b7f3a8280a 6696291 system panic'd running 'format -e c6t4d0'
pawelw
parents: 6539
diff changeset
5845 int rval, reason;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5846 int synch;
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 mutex_enter(&(SATA_TXLT_CPORT_MUTEX(spx)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5849
11401
1b705ea0360c 6913126 system hang possible in sata hba after CR 6911155
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 11391
diff changeset
5850 if (((rval = sata_txlt_generic_pkt_info(spx, &reason, 0)) !=
6591
75b7f3a8280a 6696291 system panic'd running 'format -e c6t4d0'
pawelw
parents: 6539
diff changeset
5851 TRAN_ACCEPT) || (reason == CMD_DEV_GONE)) {
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5852 mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5853 return (rval);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5854 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5855
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5856 sdinfo = sata_get_device_info(spx->txlt_sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5857 &spx->txlt_sata_pkt->satapkt_device);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5858
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
5859 scmd->satacmd_flags.sata_data_direction = SATA_DIR_WRITE;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5860 /*
3935
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
5861 * Extract LBA and sector count from scsi CDB
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5862 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5863 switch ((uint_t)scsipkt->pkt_cdbp[0]) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5864 case SCMD_WRITE:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5865 /* 6-byte scsi read cmd : 0x0A */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5866 lba = (scsipkt->pkt_cdbp[1] & 0x1f);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5867 lba = (lba << 8) | scsipkt->pkt_cdbp[2];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5868 lba = (lba << 8) | scsipkt->pkt_cdbp[3];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5869 sec_count = scsipkt->pkt_cdbp[4];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5870 /* sec_count 0 will be interpreted as 256 by a device */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5871 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5872 case SCMD_WRITE_G1:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5873 /* 10-bytes scsi write command : 0x2A */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5874 lba = scsipkt->pkt_cdbp[2];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5875 lba = (lba << 8) | scsipkt->pkt_cdbp[3];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5876 lba = (lba << 8) | scsipkt->pkt_cdbp[4];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5877 lba = (lba << 8) | scsipkt->pkt_cdbp[5];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5878 sec_count = scsipkt->pkt_cdbp[7];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5879 sec_count = (sec_count << 8) | scsipkt->pkt_cdbp[8];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5880 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5881 case SCMD_WRITE_G5:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5882 /* 12-bytes scsi read command : 0xAA */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5883 lba = scsipkt->pkt_cdbp[2];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5884 lba = (lba << 8) | scsipkt->pkt_cdbp[3];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5885 lba = (lba << 8) | scsipkt->pkt_cdbp[4];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5886 lba = (lba << 8) | scsipkt->pkt_cdbp[5];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5887 sec_count = scsipkt->pkt_cdbp[6];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5888 sec_count = (sec_count << 8) | scsipkt->pkt_cdbp[7];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5889 sec_count = (sec_count << 8) | scsipkt->pkt_cdbp[8];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5890 sec_count = (sec_count << 8) | scsipkt->pkt_cdbp[9];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5891 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5892 case SCMD_WRITE_G4:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5893 /* 16-bytes scsi write command : 0x8A */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5894 lba = scsipkt->pkt_cdbp[2];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5895 lba = (lba << 8) | scsipkt->pkt_cdbp[3];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5896 lba = (lba << 8) | scsipkt->pkt_cdbp[4];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5897 lba = (lba << 8) | scsipkt->pkt_cdbp[5];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5898 lba = (lba << 8) | scsipkt->pkt_cdbp[6];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5899 lba = (lba << 8) | scsipkt->pkt_cdbp[7];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5900 lba = (lba << 8) | scsipkt->pkt_cdbp[8];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5901 lba = (lba << 8) | scsipkt->pkt_cdbp[9];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5902 sec_count = scsipkt->pkt_cdbp[10];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5903 sec_count = (sec_count << 8) | scsipkt->pkt_cdbp[11];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5904 sec_count = (sec_count << 8) | scsipkt->pkt_cdbp[12];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5905 sec_count = (sec_count << 8) | scsipkt->pkt_cdbp[13];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5906 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5907 default:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5908 /* Unsupported command */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5909 mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5910 return (sata_txlt_invalid_command(spx));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5911 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5912
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5913 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5914 * Check if specified address and length exceeds device capacity
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 if ((lba >= sdinfo->satadrv_capacity) ||
2593
79c4a3cba4f1 6462265 sata: framework rejects last addressable LBA on disk as invalid one
pawelw
parents: 2553
diff changeset
5917 ((lba + sec_count) > sdinfo->satadrv_capacity)) {
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5918 /* LBA out of range */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5919 mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5920 return (sata_txlt_lba_out_of_range(spx));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5921 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5922
3935
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
5923 /*
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
5924 * 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
5925 * (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
5926 * No DMA resources were allocated.
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
5927 */
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
5928 if (spx->txlt_dma_cookie_list == NULL) {
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
5929 mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx)));
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
5930 return (sata_emul_rw_completion(spx));
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
5931 }
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
5932
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
5933 /*
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
5934 * 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
5935 * requested operation mode.
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
5936 * 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
5937 * devices supporting DMA.
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
5938 */
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5939 scmd->satacmd_addr_type = ATA_ADDR_LBA;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5940 scmd->satacmd_device_reg = SATA_ADH_LBA;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5941 scmd->satacmd_cmd_reg = SATAC_WRITE_DMA;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5942 if (sdinfo->satadrv_features_support & SATA_DEV_F_LBA48) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5943 scmd->satacmd_addr_type = ATA_ADDR_LBA48;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5944 scmd->satacmd_cmd_reg = SATAC_WRITE_DMA_EXT;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5945 scmd->satacmd_sec_count_msb = sec_count >> 8;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5946 scmd->satacmd_lba_low_msb = (lba >> 24) & 0xff;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5947 #ifndef __lock_lint
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5948 scmd->satacmd_lba_mid_msb = (lba >> 32) & 0xff;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5949 scmd->satacmd_lba_high_msb = lba >> 40;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5950 #endif
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5951 } else if (sdinfo->satadrv_features_support & SATA_DEV_F_LBA28) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5952 scmd->satacmd_addr_type = ATA_ADDR_LBA28;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5953 scmd->satacmd_device_reg = SATA_ADH_LBA | ((lba >> 24) & 0xf);
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 scmd->satacmd_sec_count_lsb = sec_count & 0xff;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5956 scmd->satacmd_lba_low_lsb = lba & 0xff;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5957 scmd->satacmd_lba_mid_lsb = (lba >> 8) & 0xff;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5958 scmd->satacmd_lba_high_lsb = (lba >> 16) & 0xff;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5959 scmd->satacmd_features_reg = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5960 scmd->satacmd_status_reg = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5961 scmd->satacmd_error_reg = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5962
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5963 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5964 * Check if queueing commands should be used and switch
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5965 * to appropriate command if possible
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5966 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5967 if (sata_func_enable & SATA_ENABLE_QUEUING) {
1940
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
5968 boolean_t using_queuing;
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
5969
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
5970 /* Queuing supported by controller and device? */
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
5971 if ((sata_func_enable & SATA_ENABLE_NCQ) &&
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
5972 (sdinfo->satadrv_features_support &
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
5973 SATA_DEV_F_NCQ) &&
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
5974 (SATA_FEATURES(spx->txlt_sata_hba_inst) &
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
5975 SATA_CTLF_NCQ)) {
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
5976 using_queuing = B_TRUE;
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
5977
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
5978 /* NCQ supported - use FPDMA WRITE */
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
5979 scmd->satacmd_cmd_reg =
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
5980 SATAC_WRITE_FPDMA_QUEUED;
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
5981 scmd->satacmd_features_reg_ext =
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
5982 scmd->satacmd_sec_count_msb;
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
5983 scmd->satacmd_sec_count_msb = 0;
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
5984 } else if ((sdinfo->satadrv_features_support &
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
5985 SATA_DEV_F_TCQ) &&
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
5986 (SATA_FEATURES(spx->txlt_sata_hba_inst) &
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
5987 SATA_CTLF_QCMD)) {
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
5988 using_queuing = B_TRUE;
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
5989
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
5990 /* Legacy queueing */
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
5991 if (sdinfo->satadrv_features_support &
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
5992 SATA_DEV_F_LBA48) {
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5993 scmd->satacmd_cmd_reg =
1940
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
5994 SATAC_WRITE_DMA_QUEUED_EXT;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5995 scmd->satacmd_features_reg_ext =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5996 scmd->satacmd_sec_count_msb;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5997 scmd->satacmd_sec_count_msb = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5998 } else {
1940
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
5999 scmd->satacmd_cmd_reg =
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
6000 SATAC_WRITE_DMA_QUEUED;
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
6001 }
5014
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
6002 } else /* NCQ nor legacy queuing not supported */
1940
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
6003 using_queuing = B_FALSE;
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
6004
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
6005 if (using_queuing) {
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6006 scmd->satacmd_features_reg =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6007 scmd->satacmd_sec_count_lsb;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6008 scmd->satacmd_sec_count_lsb = 0;
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6009 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
6010 /* Set-up maximum queue depth */
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
6011 scmd->satacmd_flags.sata_max_queue_depth =
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
6012 sdinfo->satadrv_max_queue_depth - 1;
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
6013 } else if (sdinfo->satadrv_features_enabled &
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
6014 SATA_DEV_F_E_UNTAGGED_QING) {
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
6015 /*
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
6016 * 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
6017 * may be still used.
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
6018 * Set-up the maximum untagged queue depth.
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
6019 * 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
6020 * 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
6021 * 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
6022 * 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
6023 * 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
6024 * largest value that can be passed via
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
6025 * satacmd_flags.sata_max_queue_depth.
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
6026 */
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
6027 scmd->satacmd_flags.sata_max_queue_depth =
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
6028 SATA_QDEPTH(shi) <= SATA_MAX_QUEUE_DEPTH ?
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
6029 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
6030
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
6031 } else {
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
6032 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
6033 }
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
6034 } else
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
6035 scmd->satacmd_flags.sata_max_queue_depth = 0;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6036
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6037 SATADBG3(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6038 "sata_txlt_write cmd 0x%2x, lba %llx, sec count %x\n",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6039 scmd->satacmd_cmd_reg, lba, sec_count);
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 if (!(spx->txlt_sata_pkt->satapkt_op_mode & SATA_OPMODE_SYNCH)) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6042 /* Need callback function */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6043 spx->txlt_sata_pkt->satapkt_comp = sata_txlt_rw_completion;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6044 synch = FALSE;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6045 } else
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6046 synch = TRUE;
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 /* Transfer command to HBA */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6049 if (sata_hba_start(spx, &rval) != 0) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6050 /* Pkt not accepted for execution */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6051 mutex_exit(&SATA_CPORT_MUTEX(shi, cport));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6052 return (rval);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6053 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6054 mutex_exit(&SATA_CPORT_MUTEX(shi, cport));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6055
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6056 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6057 * If execution is non-synchronous,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6058 * a callback function will handle potential errors, translate
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6059 * the response and will do a callback to a target driver.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6060 * If it was synchronous, check execution status using the same
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6061 * framework callback.
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 if (synch) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6064 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6065 "synchronous execution status %x\n",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6066 spx->txlt_sata_pkt->satapkt_reason);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6067 sata_txlt_rw_completion(spx->txlt_sata_pkt);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6068 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6069 return (TRAN_ACCEPT);
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
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6072
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6073 /*
4014
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
6074 * 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
6075 */
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
6076 static int
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
6077 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
6078 {
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
6079 #define WB_DOWNLOAD_MICROCODE_AND_REVERT_MODE 4
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
6080 #define WB_DOWNLOAD_MICROCODE_AND_SAVE_MODE 5
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
6081
6190
beca2dfeedbd 6605485 ahci: needs to support firmware download
xz212153
parents: 5996
diff changeset
6082 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
6083 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
6190
beca2dfeedbd 6605485 ahci: needs to support firmware download
xz212153
parents: 5996
diff changeset
6084 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
6085 sata_cmd_t *scmd = &spx->txlt_sata_pkt->satapkt_cmd;
6190
beca2dfeedbd 6605485 ahci: needs to support firmware download
xz212153
parents: 5996
diff changeset
6086
4014
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
6087 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
6088 struct scsi_extended_sense *sense;
6591
75b7f3a8280a 6696291 system panic'd running 'format -e c6t4d0'
pawelw
parents: 6539
diff changeset
6089 int rval, mode, sector_count, reason;
4014
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
6090 int cport = SATA_TXLT_CPORT(spx);
6190
beca2dfeedbd 6605485 ahci: needs to support firmware download
xz212153
parents: 5996
diff changeset
6091
4014
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
6092 mode = scsipkt->pkt_cdbp[1] & 0x1f;
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
6093
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
6094 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
6095 "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
6096
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
6097 mutex_enter(&(SATA_TXLT_CPORT_MUTEX(spx)));
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
6098
11391
1f1cf000a9eb 6911155 kernel dump fails if panic happens in interrupt service routine
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 11351
diff changeset
6099 if ((rval = sata_txlt_generic_pkt_info(spx, &reason, 1)) !=
1f1cf000a9eb 6911155 kernel dump fails if panic happens in interrupt service routine
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 11351
diff changeset
6100 TRAN_ACCEPT) {
4014
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
6101 mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx)));
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
6102 return (rval);
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
6103 }
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
6104
6190
beca2dfeedbd 6605485 ahci: needs to support firmware download
xz212153
parents: 5996
diff changeset
6105 /* Use synchronous mode */
beca2dfeedbd 6605485 ahci: needs to support firmware download
xz212153
parents: 5996
diff changeset
6106 spx->txlt_sata_pkt->satapkt_op_mode
beca2dfeedbd 6605485 ahci: needs to support firmware download
xz212153
parents: 5996
diff changeset
6107 |= SATA_OPMODE_SYNCH | SATA_OPMODE_INTERRUPTS;
beca2dfeedbd 6605485 ahci: needs to support firmware download
xz212153
parents: 5996
diff changeset
6108
4014
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
6109 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
6110
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
6111 scsipkt->pkt_reason = CMD_CMPLT;
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
6112 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
6113 STATE_SENT_CMD | STATE_GOT_STATUS;
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
6114
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
6115 /*
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
6116 * The SCSI to ATA translation specification only calls
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
6117 * for WB_DOWNLOAD_MICROCODE_AND_SAVE_MODE.
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
6118 * 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
6119 * 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
6120 * 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
6121 * 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
6122 * 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
6123 * 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
6124 * 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
6125 * 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
6126 * is revised, this can be revisisted.
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
6127 */
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
6128 /* Reject not supported request */
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
6129 switch (mode) {
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
6130 case WB_DOWNLOAD_MICROCODE_AND_REVERT_MODE:
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
6131 scmd->satacmd_features_reg = SATA_DOWNLOAD_MCODE_TEMP;
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
6132 break;
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
6133 case WB_DOWNLOAD_MICROCODE_AND_SAVE_MODE:
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
6134 scmd->satacmd_features_reg = SATA_DOWNLOAD_MCODE_SAVE;
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
6135 break;
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
6136 default:
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
6137 goto bad_param;
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
6138 }
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
6139
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
6140 *scsipkt->pkt_scbp = STATUS_GOOD; /* Presumed outcome */
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
6141
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
6142 scmd->satacmd_cmd_reg = SATAC_DOWNLOAD_MICROCODE;
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
6143 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
6144 goto bad_param;
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
6145 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
6146 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
6147 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
6148 scmd->satacmd_lba_mid_lsb = 0;
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
6149 scmd->satacmd_lba_high_lsb = 0;
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
6150 scmd->satacmd_device_reg = 0;
6190
beca2dfeedbd 6605485 ahci: needs to support firmware download
xz212153
parents: 5996
diff changeset
6151 spx->txlt_sata_pkt->satapkt_comp = NULL;
4014
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
6152 scmd->satacmd_addr_type = 0;
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
6153
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
6154 /* Transfer command to HBA */
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
6155 if (sata_hba_start(spx, &rval) != 0) {
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
6156 /* Pkt not accepted for execution */
6190
beca2dfeedbd 6605485 ahci: needs to support firmware download
xz212153
parents: 5996
diff changeset
6157 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
6158 return (rval);
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
6159 }
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
6160
6190
beca2dfeedbd 6605485 ahci: needs to support firmware download
xz212153
parents: 5996
diff changeset
6161 mutex_exit(&SATA_CPORT_MUTEX(sata_hba_inst, cport));
beca2dfeedbd 6605485 ahci: needs to support firmware download
xz212153
parents: 5996
diff changeset
6162
beca2dfeedbd 6605485 ahci: needs to support firmware download
xz212153
parents: 5996
diff changeset
6163 /* 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
6164 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
6165 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
6166 if (sata_pkt->satapkt_reason == SATA_PKT_COMPLETED) {
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
6167 scsipkt->pkt_reason = CMD_CMPLT;
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
6168
6190
beca2dfeedbd 6605485 ahci: needs to support firmware download
xz212153
parents: 5996
diff changeset
6169 /* Download commmand succeed, so probe and identify device */
beca2dfeedbd 6605485 ahci: needs to support firmware download
xz212153
parents: 5996
diff changeset
6170 sata_reidentify_device(spx);
4014
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
6171 } else {
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
6172 /* Something went wrong, microcode download command failed */
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
6173 scsipkt->pkt_reason = CMD_INCOMPLETE;
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
6174 *scsipkt->pkt_scbp = STATUS_CHECK;
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
6175 sense = sata_arq_sense(spx);
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
6176 switch (sata_pkt->satapkt_reason) {
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
6177 case SATA_PKT_PORT_ERROR:
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
6178 /*
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
6179 * 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
6180 */
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
6181 sense->es_key = KEY_HARDWARE_ERROR;
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
6182 break;
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
6183
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
6184 case SATA_PKT_DEV_ERROR:
4582
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
6185 if (sata_pkt->satapkt_cmd.satacmd_status_reg &
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
6186 SATA_STATUS_ERR) {
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
6187 /*
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
6188 * determine dev error reason from error
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
6189 * reg content
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
6190 */
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
6191 sata_decode_device_error(spx, sense);
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
6192 break;
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
6193 }
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
6194 /* No extended sense key - no info available */
4014
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
6195 break;
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
6196
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
6197 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
6198 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
6199 scsipkt->pkt_statistics |=
46361481707a 6630713 x4500: Multiple (sdxx), "Error for Command", and "Error Block" errors seen in messages file.
ls24207
parents: 5832
diff changeset
6200 STAT_TIMEOUT | STAT_DEV_RESET;
4014
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
6201 /* No extended sense key ? */
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
6202 break;
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
6203
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
6204 case SATA_PKT_ABORTED:
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
6205 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
6206 scsipkt->pkt_statistics |= STAT_ABORTED;
4014
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
6207 /* No extended sense key ? */
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
6208 break;
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
6209
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
6210 case SATA_PKT_RESET:
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
6211 /* 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
6212 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
6213 scsipkt->pkt_statistics |= STAT_DEV_RESET;
4014
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
6214 break;
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
6215
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
6216 default:
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
6217 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
6218 "sata_txlt_nodata_cmd_completion: "
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
6219 "invalid packet completion reason %d",
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
6220 sata_pkt->satapkt_reason));
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
6221 scsipkt->pkt_reason = CMD_TRAN_ERR;
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
6222 break;
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
6223 }
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
6224
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
6225 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
6226 "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
6227
9106
ee8f18cdafb2 6809527 scsi_hba_pkt_comp():More consumers
srivijitha dugganapalli <Srivijitha.Dugganapalli@Sun.COM>
parents: 9058
diff changeset
6228 if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0)
4014
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
6229 /* scsi callback required */
9106
ee8f18cdafb2 6809527 scsi_hba_pkt_comp():More consumers
srivijitha dugganapalli <Srivijitha.Dugganapalli@Sun.COM>
parents: 9058
diff changeset
6230 scsi_hba_pkt_comp(scsipkt);
4014
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
6231 }
6190
beca2dfeedbd 6605485 ahci: needs to support firmware download
xz212153
parents: 5996
diff changeset
6232 return (TRAN_ACCEPT);
beca2dfeedbd 6605485 ahci: needs to support firmware download
xz212153
parents: 5996
diff changeset
6233
beca2dfeedbd 6605485 ahci: needs to support firmware download
xz212153
parents: 5996
diff changeset
6234 bad_param:
beca2dfeedbd 6605485 ahci: needs to support firmware download
xz212153
parents: 5996
diff changeset
6235 mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx)));
beca2dfeedbd 6605485 ahci: needs to support firmware download
xz212153
parents: 5996
diff changeset
6236 *scsipkt->pkt_scbp = STATUS_CHECK;
beca2dfeedbd 6605485 ahci: needs to support firmware download
xz212153
parents: 5996
diff changeset
6237 sense = sata_arq_sense(spx);
beca2dfeedbd 6605485 ahci: needs to support firmware download
xz212153
parents: 5996
diff changeset
6238 sense->es_key = KEY_ILLEGAL_REQUEST;
beca2dfeedbd 6605485 ahci: needs to support firmware download
xz212153
parents: 5996
diff changeset
6239 sense->es_add_code = SD_SCSI_ASC_INVALID_FIELD_IN_CDB;
beca2dfeedbd 6605485 ahci: needs to support firmware download
xz212153
parents: 5996
diff changeset
6240 if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0 &&
beca2dfeedbd 6605485 ahci: needs to support firmware download
xz212153
parents: 5996
diff changeset
6241 scsipkt->pkt_comp != NULL) {
beca2dfeedbd 6605485 ahci: needs to support firmware download
xz212153
parents: 5996
diff changeset
6242 /* scsi callback required */
11853
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
6243 if (servicing_interrupt()) {
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
6244 if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
6245 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
6246 (void *)spx->txlt_scsi_pkt, TQ_NOSLEEP) == NULL) {
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
6247 return (TRAN_BUSY);
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
6248 }
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
6249 } else if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
6250 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
6251 (void *)spx->txlt_scsi_pkt, TQ_SLEEP) == NULL) {
6190
beca2dfeedbd 6605485 ahci: needs to support firmware download
xz212153
parents: 5996
diff changeset
6252 /* Scheduling the callback failed */
11853
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
6253 return (TRAN_BUSY);
6190
beca2dfeedbd 6605485 ahci: needs to support firmware download
xz212153
parents: 5996
diff changeset
6254 }
beca2dfeedbd 6605485 ahci: needs to support firmware download
xz212153
parents: 5996
diff changeset
6255 }
beca2dfeedbd 6605485 ahci: needs to support firmware download
xz212153
parents: 5996
diff changeset
6256 return (rval);
beca2dfeedbd 6605485 ahci: needs to support firmware download
xz212153
parents: 5996
diff changeset
6257 }
beca2dfeedbd 6605485 ahci: needs to support firmware download
xz212153
parents: 5996
diff changeset
6258
beca2dfeedbd 6605485 ahci: needs to support firmware download
xz212153
parents: 5996
diff changeset
6259 /*
beca2dfeedbd 6605485 ahci: needs to support firmware download
xz212153
parents: 5996
diff changeset
6260 * Re-identify device after doing a firmware download.
beca2dfeedbd 6605485 ahci: needs to support firmware download
xz212153
parents: 5996
diff changeset
6261 */
beca2dfeedbd 6605485 ahci: needs to support firmware download
xz212153
parents: 5996
diff changeset
6262 static void
beca2dfeedbd 6605485 ahci: needs to support firmware download
xz212153
parents: 5996
diff changeset
6263 sata_reidentify_device(sata_pkt_txlate_t *spx)
beca2dfeedbd 6605485 ahci: needs to support firmware download
xz212153
parents: 5996
diff changeset
6264 {
beca2dfeedbd 6605485 ahci: needs to support firmware download
xz212153
parents: 5996
diff changeset
6265 #define DOWNLOAD_WAIT_TIME_SECS 60
beca2dfeedbd 6605485 ahci: needs to support firmware download
xz212153
parents: 5996
diff changeset
6266 #define DOWNLOAD_WAIT_INTERVAL_SECS 1
beca2dfeedbd 6605485 ahci: needs to support firmware download
xz212153
parents: 5996
diff changeset
6267 int rval;
beca2dfeedbd 6605485 ahci: needs to support firmware download
xz212153
parents: 5996
diff changeset
6268 int retry_cnt;
beca2dfeedbd 6605485 ahci: needs to support firmware download
xz212153
parents: 5996
diff changeset
6269 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
beca2dfeedbd 6605485 ahci: needs to support firmware download
xz212153
parents: 5996
diff changeset
6270 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
6271 sata_device_t sata_device = spx->txlt_sata_pkt->satapkt_device;
beca2dfeedbd 6605485 ahci: needs to support firmware download
xz212153
parents: 5996
diff changeset
6272 sata_drive_info_t *sdinfo;
beca2dfeedbd 6605485 ahci: needs to support firmware download
xz212153
parents: 5996
diff changeset
6273
beca2dfeedbd 6605485 ahci: needs to support firmware download
xz212153
parents: 5996
diff changeset
6274 /*
beca2dfeedbd 6605485 ahci: needs to support firmware download
xz212153
parents: 5996
diff changeset
6275 * Before returning good status, probe device.
beca2dfeedbd 6605485 ahci: needs to support firmware download
xz212153
parents: 5996
diff changeset
6276 * Device probing will get IDENTIFY DEVICE data, if possible.
beca2dfeedbd 6605485 ahci: needs to support firmware download
xz212153
parents: 5996
diff changeset
6277 * The assumption is that the new microcode is applied by the
beca2dfeedbd 6605485 ahci: needs to support firmware download
xz212153
parents: 5996
diff changeset
6278 * device. It is a caller responsibility to verify this.
beca2dfeedbd 6605485 ahci: needs to support firmware download
xz212153
parents: 5996
diff changeset
6279 */
beca2dfeedbd 6605485 ahci: needs to support firmware download
xz212153
parents: 5996
diff changeset
6280 for (retry_cnt = 0;
beca2dfeedbd 6605485 ahci: needs to support firmware download
xz212153
parents: 5996
diff changeset
6281 retry_cnt < DOWNLOAD_WAIT_TIME_SECS / DOWNLOAD_WAIT_INTERVAL_SECS;
beca2dfeedbd 6605485 ahci: needs to support firmware download
xz212153
parents: 5996
diff changeset
6282 retry_cnt++) {
beca2dfeedbd 6605485 ahci: needs to support firmware download
xz212153
parents: 5996
diff changeset
6283 rval = sata_probe_device(sata_hba_inst, &sata_device);
beca2dfeedbd 6605485 ahci: needs to support firmware download
xz212153
parents: 5996
diff changeset
6284
beca2dfeedbd 6605485 ahci: needs to support firmware download
xz212153
parents: 5996
diff changeset
6285 if (rval == SATA_SUCCESS) { /* Set default features */
beca2dfeedbd 6605485 ahci: needs to support firmware download
xz212153
parents: 5996
diff changeset
6286 sdinfo = sata_get_device_info(sata_hba_inst,
beca2dfeedbd 6605485 ahci: needs to support firmware download
xz212153
parents: 5996
diff changeset
6287 &sata_device);
beca2dfeedbd 6605485 ahci: needs to support firmware download
xz212153
parents: 5996
diff changeset
6288 if (sata_initialize_device(sata_hba_inst, sdinfo) !=
beca2dfeedbd 6605485 ahci: needs to support firmware download
xz212153
parents: 5996
diff changeset
6289 SATA_SUCCESS) {
beca2dfeedbd 6605485 ahci: needs to support firmware download
xz212153
parents: 5996
diff changeset
6290 /* 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
6291 rval = sata_initialize_device(sata_hba_inst,
6190
beca2dfeedbd 6605485 ahci: needs to support firmware download
xz212153
parents: 5996
diff changeset
6292 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
6293 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
6294 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
6295 "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
6296 " 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
6297 " 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
6298 "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
6299 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
6300 sata_device.satadev_addr.pmport);
6190
beca2dfeedbd 6605485 ahci: needs to support firmware download
xz212153
parents: 5996
diff changeset
6301 }
9106
ee8f18cdafb2 6809527 scsi_hba_pkt_comp():More consumers
srivijitha dugganapalli <Srivijitha.Dugganapalli@Sun.COM>
parents: 9058
diff changeset
6302 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
6303 scsi_hba_pkt_comp(scsipkt);
6190
beca2dfeedbd 6605485 ahci: needs to support firmware download
xz212153
parents: 5996
diff changeset
6304 return;
beca2dfeedbd 6605485 ahci: needs to support firmware download
xz212153
parents: 5996
diff changeset
6305 } else if (rval == SATA_RETRY) {
beca2dfeedbd 6605485 ahci: needs to support firmware download
xz212153
parents: 5996
diff changeset
6306 delay(drv_usectohz(1000000 *
beca2dfeedbd 6605485 ahci: needs to support firmware download
xz212153
parents: 5996
diff changeset
6307 DOWNLOAD_WAIT_INTERVAL_SECS));
beca2dfeedbd 6605485 ahci: needs to support firmware download
xz212153
parents: 5996
diff changeset
6308 continue;
beca2dfeedbd 6605485 ahci: needs to support firmware download
xz212153
parents: 5996
diff changeset
6309 } else /* failed - no reason to retry */
beca2dfeedbd 6605485 ahci: needs to support firmware download
xz212153
parents: 5996
diff changeset
6310 break;
beca2dfeedbd 6605485 ahci: needs to support firmware download
xz212153
parents: 5996
diff changeset
6311 }
beca2dfeedbd 6605485 ahci: needs to support firmware download
xz212153
parents: 5996
diff changeset
6312
beca2dfeedbd 6605485 ahci: needs to support firmware download
xz212153
parents: 5996
diff changeset
6313 /*
beca2dfeedbd 6605485 ahci: needs to support firmware download
xz212153
parents: 5996
diff changeset
6314 * Something went wrong, device probing failed.
beca2dfeedbd 6605485 ahci: needs to support firmware download
xz212153
parents: 5996
diff changeset
6315 */
beca2dfeedbd 6605485 ahci: needs to support firmware download
xz212153
parents: 5996
diff changeset
6316 SATA_LOG_D((sata_hba_inst, CE_WARN,
beca2dfeedbd 6605485 ahci: needs to support firmware download
xz212153
parents: 5996
diff changeset
6317 "Cannot probe device after downloading microcode\n"));
beca2dfeedbd 6605485 ahci: needs to support firmware download
xz212153
parents: 5996
diff changeset
6318
beca2dfeedbd 6605485 ahci: needs to support firmware download
xz212153
parents: 5996
diff changeset
6319 /* Reset device to force retrying the probe. */
beca2dfeedbd 6605485 ahci: needs to support firmware download
xz212153
parents: 5996
diff changeset
6320 (void) (*SATA_RESET_DPORT_FUNC(sata_hba_inst))
beca2dfeedbd 6605485 ahci: needs to support firmware download
xz212153
parents: 5996
diff changeset
6321 (SATA_DIP(sata_hba_inst), &sata_device);
beca2dfeedbd 6605485 ahci: needs to support firmware download
xz212153
parents: 5996
diff changeset
6322
9106
ee8f18cdafb2 6809527 scsi_hba_pkt_comp():More consumers
srivijitha dugganapalli <Srivijitha.Dugganapalli@Sun.COM>
parents: 9058
diff changeset
6323 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
6324 scsi_hba_pkt_comp(scsipkt);
6190
beca2dfeedbd 6605485 ahci: needs to support firmware download
xz212153
parents: 5996
diff changeset
6325 }
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
6326
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6327
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6328 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6329 * Translate command: Synchronize Cache.
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
6330 * Translates into Flush Cache command for SATA hard disks.
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6331 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6332 * Returns TRAN_ACCEPT or code returned by sata_hba_start() and
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6333 * appropriate values in scsi_pkt fields.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6334 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6335 static int
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6336 sata_txlt_synchronize_cache(sata_pkt_txlate_t *spx)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6337 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6338 sata_cmd_t *scmd = &spx->txlt_sata_pkt->satapkt_cmd;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6339 sata_hba_inst_t *shi = SATA_TXLT_HBA_INST(spx);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6340 int cport = SATA_TXLT_CPORT(spx);
6591
75b7f3a8280a 6696291 system panic'd running 'format -e c6t4d0'
pawelw
parents: 6539
diff changeset
6341 int rval, reason;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6342 int synch;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6343
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6344 mutex_enter(&(SATA_TXLT_CPORT_MUTEX(spx)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6345
11391
1f1cf000a9eb 6911155 kernel dump fails if panic happens in interrupt service routine
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 11351
diff changeset
6346 if (((rval = sata_txlt_generic_pkt_info(spx, &reason, 1)) !=
6591
75b7f3a8280a 6696291 system panic'd running 'format -e c6t4d0'
pawelw
parents: 6539
diff changeset
6347 TRAN_ACCEPT) || (reason == CMD_DEV_GONE)) {
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6348 mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6349 return (rval);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6350 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6351
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6352 scmd->satacmd_addr_type = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6353 scmd->satacmd_cmd_reg = SATAC_FLUSH_CACHE;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6354 scmd->satacmd_device_reg = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6355 scmd->satacmd_sec_count_lsb = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6356 scmd->satacmd_lba_low_lsb = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6357 scmd->satacmd_lba_mid_lsb = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6358 scmd->satacmd_lba_high_lsb = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6359 scmd->satacmd_features_reg = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6360 scmd->satacmd_status_reg = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6361 scmd->satacmd_error_reg = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6362
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6363 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6364 "sata_txlt_synchronize_cache\n", NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6365
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6366 if (!(spx->txlt_sata_pkt->satapkt_op_mode & SATA_OPMODE_SYNCH)) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6367 /* Need to set-up a callback function */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6368 spx->txlt_sata_pkt->satapkt_comp =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6369 sata_txlt_nodata_cmd_completion;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6370 synch = FALSE;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6371 } else
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6372 synch = TRUE;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6373
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6374 /* Transfer command to HBA */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6375 if (sata_hba_start(spx, &rval) != 0) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6376 /* Pkt not accepted for execution */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6377 mutex_exit(&SATA_CPORT_MUTEX(shi, cport));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6378 return (rval);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6379 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6380 mutex_exit(&SATA_CPORT_MUTEX(shi, cport));
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 * If execution non-synchronous, it had to be completed
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6384 * a callback function will handle potential errors, translate
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6385 * the response and will do a callback to a target driver.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6386 * If it was synchronous, check status, using the same
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6387 * framework callback.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6388 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6389 if (synch) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6390 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6391 "synchronous execution status %x\n",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6392 spx->txlt_sata_pkt->satapkt_reason);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6393 sata_txlt_nodata_cmd_completion(spx->txlt_sata_pkt);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6394 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6395 return (TRAN_ACCEPT);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6396 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6397
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
6398
1258
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 * Send pkt to SATA HBA driver
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6401 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6402 * 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
6403 * i.e. scsi_pkt is not NULL.
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 * 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
6406 * the mutex when it calls HBA driver sata_tran_start function and
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6407 * re-acquires it afterwards.
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 * If return value is 0, pkt was accepted, -1 otherwise
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6410 * rval is set to appropriate sata_scsi_start return value.
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 * 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
6413 * have called the sata_pkt callback function for this packet.
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 * 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
6416 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6417 static int
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6418 sata_hba_start(sata_pkt_txlate_t *spx, int *rval)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6419 {
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
6420 int stat;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
6421 uint8_t cport = SATA_TXLT_CPORT(spx);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
6422 uint8_t pmport = SATA_TXLT_PMPORT(spx);
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6423 sata_hba_inst_t *sata_hba_inst = spx->txlt_sata_hba_inst;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6424 sata_drive_info_t *sdinfo;
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
6425 sata_pmult_info_t *pminfo;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
6426 sata_pmport_info_t *pmportinfo = NULL;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
6427 sata_device_t *sata_device = NULL;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6428 uint8_t cmd;
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6429 struct sata_cmd_flags cmd_flags;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6430
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6431 ASSERT(spx->txlt_sata_pkt != NULL);
3116
e4293e8671d8 6488114 system panic after unplugging disks during diskomizer/dd run
yt160523
parents: 3023
diff changeset
6432
e4293e8671d8 6488114 system panic after unplugging disks during diskomizer/dd run
yt160523
parents: 3023
diff changeset
6433 ASSERT(mutex_owned(&SATA_CPORT_MUTEX(sata_hba_inst, cport)));
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6434
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6435 sdinfo = sata_get_device_info(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6436 &spx->txlt_sata_pkt->satapkt_device);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6437 ASSERT(sdinfo != NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6438
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6439 /* Clear device reset state? */
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
6440 /* qual should be XXX_DPMPORT, but add XXX_PMPORT in case */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
6441 if (sdinfo->satadrv_addr.qual == SATA_ADDR_DPMPORT ||
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
6442 sdinfo->satadrv_addr.qual == SATA_ADDR_PMPORT) {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
6443
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
6444 /*
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
6445 * Get the pmult_info of the its parent port multiplier, all
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
6446 * sub-devices share a common device reset flags on in
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
6447 * pmult_info.
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
6448 */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
6449 pminfo = SATA_PMULT_INFO(sata_hba_inst, cport);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
6450 pmportinfo = pminfo->pmult_dev_port[pmport];
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
6451 ASSERT(pminfo != NULL);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
6452 if (pminfo->pmult_event_flags & SATA_EVNT_CLEAR_DEVICE_RESET) {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
6453 spx->txlt_sata_pkt->satapkt_cmd.satacmd_flags.
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
6454 sata_clear_dev_reset = B_TRUE;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
6455 pminfo->pmult_event_flags &=
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
6456 ~SATA_EVNT_CLEAR_DEVICE_RESET;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
6457 SATADBG1(SATA_DBG_EVENTS, sata_hba_inst,
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
6458 "sata_hba_start: clearing device reset state"
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
6459 "on pmult.\n", NULL);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
6460 }
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
6461 } else {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
6462 if (sdinfo->satadrv_event_flags &
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
6463 SATA_EVNT_CLEAR_DEVICE_RESET) {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
6464 spx->txlt_sata_pkt->satapkt_cmd.satacmd_flags.
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
6465 sata_clear_dev_reset = B_TRUE;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
6466 sdinfo->satadrv_event_flags &=
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
6467 ~SATA_EVNT_CLEAR_DEVICE_RESET;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
6468 SATADBG1(SATA_DBG_EVENTS, sata_hba_inst,
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
6469 "sata_hba_start: clearing device reset state\n",
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
6470 NULL);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
6471 }
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
6472 }
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
6473
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6474 cmd = spx->txlt_sata_pkt->satapkt_cmd.satacmd_cmd_reg;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6475 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
6476 sata_device = &spx->txlt_sata_pkt->satapkt_device;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6477
3116
e4293e8671d8 6488114 system panic after unplugging disks during diskomizer/dd run
yt160523
parents: 3023
diff changeset
6478 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6479
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6480 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6481 "Sata cmd 0x%2x\n", cmd);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6482
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6483 stat = (*SATA_START_FUNC(sata_hba_inst))(SATA_DIP(sata_hba_inst),
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6484 spx->txlt_sata_pkt);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6485
3116
e4293e8671d8 6488114 system panic after unplugging disks during diskomizer/dd run
yt160523
parents: 3023
diff changeset
6486 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6487 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6488 * If sata pkt was accepted and executed in asynchronous mode, i.e.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6489 * with the sata callback, the sata_pkt could be already destroyed
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6490 * by the time we check ther return status from the hba_start()
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6491 * function, because sata_scsi_destroy_pkt() could have been already
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6492 * called (perhaps in the interrupt context). So, in such case, there
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6493 * should be no references to it. In other cases, sata_pkt still
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6494 * exists.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6495 */
7246
27944777b08c 6723493 sata: pf panic in sata_get_device_info with kmem_flags=0x2f/0x3f
pawelw
parents: 7152
diff changeset
6496 if (stat == SATA_TRAN_ACCEPTED) {
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6497 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6498 * pkt accepted for execution.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6499 * If it was executed synchronously, it is already completed
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6500 * and pkt completion_reason indicates completion status.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6501 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6502 *rval = TRAN_ACCEPT;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6503 return (0);
7246
27944777b08c 6723493 sata: pf panic in sata_get_device_info with kmem_flags=0x2f/0x3f
pawelw
parents: 7152
diff changeset
6504 }
27944777b08c 6723493 sata: pf panic in sata_get_device_info with kmem_flags=0x2f/0x3f
pawelw
parents: 7152
diff changeset
6505
27944777b08c 6723493 sata: pf panic in sata_get_device_info with kmem_flags=0x2f/0x3f
pawelw
parents: 7152
diff changeset
6506 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
6507 switch (stat) {
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6508 case SATA_TRAN_QUEUE_FULL:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6509 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6510 * Controller detected queue full condition.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6511 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6512 SATADBG1(SATA_DBG_HBA_IF, sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6513 "sata_hba_start: queue full\n", NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6514
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6515 spx->txlt_scsi_pkt->pkt_reason = CMD_INCOMPLETE;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6516 *spx->txlt_scsi_pkt->pkt_scbp = STATUS_QFULL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6517
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6518 *rval = TRAN_BUSY;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6519 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6520
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6521 case SATA_TRAN_PORT_ERROR:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6522 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6523 * Communication/link with device or general port error
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6524 * detected before pkt execution begun.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6525 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6526 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
6527 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
6528 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
6529 SATA_ADDR_DCPORT)
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6530 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
6531 "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
6532 sata_device->satadev_addr.cport);
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6533 else
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6534 sata_log(sata_hba_inst, CE_CONT,
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
6535 "SATA port %d:%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
6536 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
6537 sata_device->satadev_addr.pmport);
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6538
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6539 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6540 * Update the port/device structure.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6541 * sata_pkt should be still valid. Since port error is
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6542 * returned, sata_device content should reflect port
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6543 * state - it means, that sata address have been changed,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6544 * because original packet's sata address refered to a device
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6545 * attached to some port.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6546 */
11104
166a083c78c5 6900065 System crash when running diskomizer on disks connected to host via SIL3726
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 11066
diff changeset
6547 if (sata_device->satadev_addr.qual == SATA_ADDR_DPMPORT ||
166a083c78c5 6900065 System crash when running diskomizer on disks connected to host via SIL3726
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 11066
diff changeset
6548 sata_device->satadev_addr.qual == SATA_ADDR_PMPORT) {
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
6549 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
6550 mutex_enter(&pmportinfo->pmport_mutex);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
6551 sata_update_pmport_info(sata_hba_inst, sata_device);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
6552 mutex_exit(&pmportinfo->pmport_mutex);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
6553 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
6554 } else {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
6555 sata_update_port_info(sata_hba_inst, sata_device);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
6556 }
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
6557
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6558 spx->txlt_scsi_pkt->pkt_reason = CMD_TRAN_ERR;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6559 *rval = TRAN_FATAL_ERROR;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6560 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6561
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6562 case SATA_TRAN_CMD_UNSUPPORTED:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6563 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6564 * Command rejected by HBA as unsupported. It was HBA driver
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6565 * that rejected the command, command was not sent to
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6566 * an attached device.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6567 */
3116
e4293e8671d8 6488114 system panic after unplugging disks during diskomizer/dd run
yt160523
parents: 3023
diff changeset
6568 if ((sdinfo != NULL) &&
e4293e8671d8 6488114 system panic after unplugging disks during diskomizer/dd run
yt160523
parents: 3023
diff changeset
6569 (sdinfo->satadrv_state & SATA_DSTATE_RESET))
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6570 SATADBG1(SATA_DBG_EVENTS, sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6571 "sat_hba_start: cmd 0x%2x rejected "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6572 "with SATA_TRAN_CMD_UNSUPPORTED status\n", cmd);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6573
3116
e4293e8671d8 6488114 system panic after unplugging disks during diskomizer/dd run
yt160523
parents: 3023
diff changeset
6574 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
6575 (void) sata_txlt_invalid_command(spx);
e4293e8671d8 6488114 system panic after unplugging disks during diskomizer/dd run
yt160523
parents: 3023
diff changeset
6576 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
6577
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6578 *rval = TRAN_ACCEPT;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6579 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6580
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6581 case SATA_TRAN_BUSY:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6582 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6583 * Command rejected by HBA because other operation prevents
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6584 * accepting the packet, or device is in RESET condition.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6585 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6586 if (sdinfo != NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6587 sdinfo->satadrv_state =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6588 spx->txlt_sata_pkt->satapkt_device.satadev_state;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6589
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6590 if (sdinfo->satadrv_state & SATA_DSTATE_RESET) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6591 SATADBG1(SATA_DBG_EVENTS, sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6592 "sata_hba_start: cmd 0x%2x rejected "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6593 "because of device reset condition\n",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6594 cmd);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6595 } else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6596 SATADBG1(SATA_DBG_EVENTS, sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6597 "sata_hba_start: cmd 0x%2x rejected "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6598 "with SATA_TRAN_BUSY status\n",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6599 cmd);
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 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6602 spx->txlt_scsi_pkt->pkt_reason = CMD_INCOMPLETE;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6603 *rval = TRAN_BUSY;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6604 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6605
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6606 default:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6607 /* Unrecognized HBA response */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6608 SATA_LOG_D((sata_hba_inst, CE_WARN,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6609 "sata_hba_start: unrecognized HBA response "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6610 "to cmd : 0x%2x resp 0x%x", cmd, rval));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6611 spx->txlt_scsi_pkt->pkt_reason = CMD_TRAN_ERR;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6612 *rval = TRAN_FATAL_ERROR;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6613 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6614 }
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 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6617 * If we got here, the packet was rejected.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6618 * Check if we need to remember reset state clearing request
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6619 */
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6620 if (cmd_flags.sata_clear_dev_reset) {
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6621 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6622 * Check if device is still configured - it may have
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6623 * disapeared from the configuration
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6624 */
2960
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
6625 sdinfo = sata_get_device_info(sata_hba_inst, sata_device);
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6626 if (sdinfo != NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6627 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6628 * Restore the flag that requests clearing of
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6629 * the device reset state,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6630 * so the next sata packet may carry it to HBA.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6631 */
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
6632 if (sdinfo->satadrv_addr.qual == SATA_ADDR_PMPORT ||
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
6633 sdinfo->satadrv_addr.qual == SATA_ADDR_DPMPORT) {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
6634 pminfo->pmult_event_flags |=
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
6635 SATA_EVNT_CLEAR_DEVICE_RESET;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
6636 } else {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
6637 sdinfo->satadrv_event_flags |=
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
6638 SATA_EVNT_CLEAR_DEVICE_RESET;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
6639 }
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6640 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6641 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6642 return (-1);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6643 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6644
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6645 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6646 * Scsi response setup for invalid LBA
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 * Returns TRAN_ACCEPT and appropriate values in scsi_pkt fields.
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 static int
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6651 sata_txlt_lba_out_of_range(sata_pkt_txlate_t *spx)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6652 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6653 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6654 struct scsi_extended_sense *sense;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6655
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6656 scsipkt->pkt_reason = CMD_CMPLT;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6657 scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
4582
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
6658 STATE_SENT_CMD | STATE_GOT_STATUS;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6659 *scsipkt->pkt_scbp = STATUS_CHECK;
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 *scsipkt->pkt_scbp = STATUS_CHECK;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6662 sense = sata_arq_sense(spx);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6663 sense->es_key = KEY_ILLEGAL_REQUEST;
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
6664 sense->es_add_code = SD_SCSI_ASC_LBA_OUT_OF_RANGE;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6665
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6666 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6667 "Scsi_pkt completion reason %x\n", scsipkt->pkt_reason);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6668
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6669 if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0 &&
11853
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
6670 scsipkt->pkt_comp != NULL) {
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6671 /* scsi callback required */
11853
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
6672 if (servicing_interrupt()) {
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
6673 if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
6674 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
6675 (void *)spx->txlt_scsi_pkt, TQ_NOSLEEP) == NULL) {
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
6676 return (TRAN_BUSY);
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
6677 }
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
6678 } else if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
6679 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
6680 (void *)spx->txlt_scsi_pkt, TQ_SLEEP) == NULL) {
1781
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
6681 /* Scheduling the callback failed */
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
6682 return (TRAN_BUSY);
11853
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
6683 }
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
6684 }
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6685 return (TRAN_ACCEPT);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6686 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6687
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6688
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6689 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6690 * Analyze device status and error registers and translate them into
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6691 * appropriate scsi sense codes.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6692 * NOTE: non-packet commands only for now
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6693 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6694 static void
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6695 sata_decode_device_error(sata_pkt_txlate_t *spx,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6696 struct scsi_extended_sense *sense)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6697 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6698 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
6699
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6700 ASSERT(sense != NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6701 ASSERT(spx->txlt_sata_pkt->satapkt_cmd.satacmd_status_reg &
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6702 SATA_STATUS_ERR);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6703
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6704
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6705 if (err_reg & SATA_ERROR_ICRC) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6706 sense->es_key = KEY_ABORTED_COMMAND;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6707 sense->es_add_code = 0x08; /* Communication failure */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6708 return;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6709 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6710
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6711 if (err_reg & SATA_ERROR_UNC) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6712 sense->es_key = KEY_MEDIUM_ERROR;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6713 /* Information bytes (LBA) need to be set by a caller */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6714 return;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6715 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6716
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6717 /* ADD HERE: MC error bit handling for ATAPI CD/DVD */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6718 if (err_reg & (SATA_ERROR_MCR | SATA_ERROR_NM)) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6719 sense->es_key = KEY_UNIT_ATTENTION;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6720 sense->es_add_code = 0x3a; /* No media present */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6721 return;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6722 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6723
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6724 if (err_reg & SATA_ERROR_IDNF) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6725 if (err_reg & SATA_ERROR_ABORT) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6726 sense->es_key = KEY_ABORTED_COMMAND;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6727 } else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6728 sense->es_key = KEY_ILLEGAL_REQUEST;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6729 sense->es_add_code = 0x21; /* LBA out of range */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6730 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6731 return;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6732 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6733
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6734 if (err_reg & SATA_ERROR_ABORT) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6735 ASSERT(spx->txlt_sata_pkt != NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6736 sense->es_key = KEY_ABORTED_COMMAND;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6737 return;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6738 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6739 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6740
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6741 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6742 * Extract error LBA from sata_pkt.satapkt_cmd register fields
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6743 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6744 static void
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6745 sata_extract_error_lba(sata_pkt_txlate_t *spx, uint64_t *lba)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6746 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6747 sata_cmd_t *sata_cmd = &spx->txlt_sata_pkt->satapkt_cmd;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6748
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6749 *lba = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6750 if (sata_cmd->satacmd_addr_type == ATA_ADDR_LBA48) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6751 *lba = sata_cmd->satacmd_lba_high_msb;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6752 *lba = (*lba << 8) | sata_cmd->satacmd_lba_mid_msb;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6753 *lba = (*lba << 8) | sata_cmd->satacmd_lba_low_msb;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6754 } else if (sata_cmd->satacmd_addr_type == ATA_ADDR_LBA28) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6755 *lba = sata_cmd->satacmd_device_reg & 0xf;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6756 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6757 *lba = (*lba << 8) | sata_cmd->satacmd_lba_high_lsb;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6758 *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
6759 *lba = (*lba << 8) | sata_cmd->satacmd_lba_low_lsb;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6760 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6761
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6762 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6763 * This is fixed sense format - if LBA exceeds the info field size,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6764 * no valid info will be returned (valid bit in extended sense will
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6765 * be set to 0).
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6766 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6767 static struct scsi_extended_sense *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6768 sata_arq_sense(sata_pkt_txlate_t *spx)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6769 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6770 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6771 struct scsi_arq_status *arqs;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6772 struct scsi_extended_sense *sense;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6773
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6774 /* Fill ARQ sense data */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6775 scsipkt->pkt_state |= STATE_ARQ_DONE;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6776 arqs = (struct scsi_arq_status *)scsipkt->pkt_scbp;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6777 *(uchar_t *)&arqs->sts_status = STATUS_CHECK;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6778 *(uchar_t *)&arqs->sts_rqpkt_status = STATUS_GOOD;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6779 arqs->sts_rqpkt_reason = CMD_CMPLT;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6780 arqs->sts_rqpkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6781 STATE_XFERRED_DATA | STATE_SENT_CMD | STATE_GOT_STATUS;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6782 arqs->sts_rqpkt_resid = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6783 sense = &arqs->sts_sensedata;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6784 bzero(sense, sizeof (struct scsi_extended_sense));
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
6785 sata_fixed_sense_data_preset(sense);
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6786 return (sense);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6787 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6788
11222
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
6789 /*
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
6790 * ATA Pass Through support
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
6791 * Sets flags indicating that an invalid value was found in some
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
6792 * field in the command. It could be something illegal according to
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
6793 * the SAT-2 spec or it could be a feature that is not (yet?)
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
6794 * supported.
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
6795 */
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
6796 static int
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
6797 sata_txlt_ata_pass_thru_illegal_cmd(sata_pkt_txlate_t *spx)
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
6798 {
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
6799 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
6800 struct scsi_extended_sense *sense = sata_arq_sense(spx);
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
6801
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
6802 scsipkt->pkt_reason = CMD_CMPLT;
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
6803 *scsipkt->pkt_scbp = STATUS_CHECK;
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
6804 scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
6805 STATE_SENT_CMD | STATE_GOT_STATUS;
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
6806
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
6807 sense = sata_arq_sense(spx);
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
6808 sense->es_key = KEY_ILLEGAL_REQUEST;
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
6809 sense->es_add_code = SD_SCSI_ASC_INVALID_FIELD_IN_CDB;
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
6810
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
6811 if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0 &&
11853
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
6812 scsipkt->pkt_comp != NULL) {
11222
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
6813 /* scsi callback required */
11853
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
6814 if (servicing_interrupt()) {
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
6815 if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
6816 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
6817 (void *)spx->txlt_scsi_pkt, TQ_NOSLEEP) == NULL) {
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
6818 return (TRAN_BUSY);
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
6819 }
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
6820 } else if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
6821 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
6822 (void *)spx->txlt_scsi_pkt, TQ_SLEEP) == NULL) {
11222
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
6823 /* Scheduling the callback failed */
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
6824 return (TRAN_BUSY);
11853
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
6825 }
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
6826 }
11222
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
6827
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
6828 return (TRAN_ACCEPT);
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
6829 }
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6830
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6831 /*
3935
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
6832 * 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
6833 * 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
6834 * 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
6835 * callback cannot be scheduled.
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
6836 */
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
6837 static int
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
6838 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
6839 {
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
6840 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
6841
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
6842 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
6843 STATE_SENT_CMD | STATE_GOT_STATUS;
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
6844 scsipkt->pkt_reason = CMD_CMPLT;
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
6845 *scsipkt->pkt_scbp = STATUS_GOOD;
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
6846 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
6847 /* scsi callback required - have to schedule it */
11853
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
6848 if (servicing_interrupt()) {
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
6849 if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
6850 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
6851 (void *)spx->txlt_scsi_pkt, TQ_NOSLEEP) == NULL) {
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
6852 return (TRAN_BUSY);
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
6853 }
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
6854 } else if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
6855 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
6856 (void *)spx->txlt_scsi_pkt, TQ_SLEEP) == NULL) {
3935
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
6857 /* Scheduling the callback failed */
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
6858 return (TRAN_BUSY);
11853
2adca8ef2c23 6548768 sata framework calls taskq_dispatch with wrong argument - can cause blocking during interrupt
Phi Tran <Phi.Tran@Sun.COM>
parents: 11790
diff changeset
6859 }
3935
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
6860 }
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
6861 return (TRAN_ACCEPT);
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
6862 }
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
6863
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
6864
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
6865 /*
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6866 * Translate completion status of SATA read/write commands into scsi response.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6867 * pkt completion_reason is checked to determine the completion status.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6868 * Do scsi callback if necessary.
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 * Note: this function may be called also for synchronously executed
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6871 * commands.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6872 * This function may be used only if scsi_pkt is non-NULL.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6873 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6874 static void
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6875 sata_txlt_rw_completion(sata_pkt_t *sata_pkt)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6876 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6877 sata_pkt_txlate_t *spx =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6878 (sata_pkt_txlate_t *)sata_pkt->satapkt_framework_private;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6879 sata_cmd_t *scmd = &sata_pkt->satapkt_cmd;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6880 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6881 struct scsi_extended_sense *sense;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6882 uint64_t lba;
2539
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
6883 struct buf *bp;
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
6884 int rval;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6885 if (sata_pkt->satapkt_reason == SATA_PKT_COMPLETED) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6886 /* Normal completion */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6887 scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6888 STATE_SENT_CMD | STATE_XFERRED_DATA | STATE_GOT_STATUS;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6889 scsipkt->pkt_reason = CMD_CMPLT;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6890 *scsipkt->pkt_scbp = STATUS_GOOD;
2539
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
6891 if (spx->txlt_tmp_buf != NULL) {
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
6892 /* Temporary buffer was used */
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
6893 bp = spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp;
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
6894 if (bp->b_flags & B_READ) {
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
6895 rval = ddi_dma_sync(
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
6896 spx->txlt_buf_dma_handle, 0, 0,
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
6897 DDI_DMA_SYNC_FORCPU);
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
6898 ASSERT(rval == DDI_SUCCESS);
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
6899 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
6900 bp->b_bcount);
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
6901 }
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
6902 }
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6903 } else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6904 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6905 * Something went wrong - analyze return
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6906 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6907 scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6908 STATE_SENT_CMD | STATE_GOT_STATUS;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6909 scsipkt->pkt_reason = CMD_INCOMPLETE;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6910 *scsipkt->pkt_scbp = STATUS_CHECK;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6911 sense = sata_arq_sense(spx);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6912 ASSERT(sense != NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6913
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6914 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6915 * 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
6916 * extract from device registers the failing LBA.
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6917 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6918 if (sata_pkt->satapkt_reason == SATA_PKT_DEV_ERROR) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6919 if ((scmd->satacmd_addr_type == ATA_ADDR_LBA48) &&
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6920 (scmd->satacmd_lba_mid_msb != 0 ||
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6921 scmd->satacmd_lba_high_msb != 0)) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6922 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6923 * We have problem reporting this cmd LBA
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6924 * in fixed sense data format, because of
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6925 * the size of the scsi LBA fields.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6926 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6927 sense->es_valid = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6928 } else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6929 sata_extract_error_lba(spx, &lba);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6930 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
6931 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
6932 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
6933 sense->es_info_4 = lba & 0xFF;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6934 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6935 } else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6936 /* Invalid extended sense info */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6937 sense->es_valid = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6938 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6939
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6940 switch (sata_pkt->satapkt_reason) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6941 case SATA_PKT_PORT_ERROR:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6942 /* We may want to handle DEV GONE state as well */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6943 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6944 * We have no device data. Assume no data transfered.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6945 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6946 sense->es_key = KEY_HARDWARE_ERROR;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6947 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6948
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6949 case SATA_PKT_DEV_ERROR:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6950 if (sata_pkt->satapkt_cmd.satacmd_status_reg &
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6951 SATA_STATUS_ERR) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6952 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6953 * determine dev error reason from error
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6954 * reg content
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6955 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6956 sata_decode_device_error(spx, sense);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6957 if (sense->es_key == KEY_MEDIUM_ERROR) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6958 switch (scmd->satacmd_cmd_reg) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6959 case SATAC_READ_DMA:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6960 case SATAC_READ_DMA_EXT:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6961 case SATAC_READ_DMA_QUEUED:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6962 case SATAC_READ_DMA_QUEUED_EXT:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6963 case SATAC_READ_FPDMA_QUEUED:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6964 /* Unrecovered read error */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6965 sense->es_add_code =
5832
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
6966 SD_SCSI_ASC_UNREC_READ_ERR;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6967 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6968 case SATAC_WRITE_DMA:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6969 case SATAC_WRITE_DMA_EXT:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6970 case SATAC_WRITE_DMA_QUEUED:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6971 case SATAC_WRITE_DMA_QUEUED_EXT:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6972 case SATAC_WRITE_FPDMA_QUEUED:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6973 /* Write error */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6974 sense->es_add_code =
5832
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
6975 SD_SCSI_ASC_WRITE_ERR;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6976 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6977 default:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6978 /* Internal error */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6979 SATA_LOG_D((
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6980 spx->txlt_sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6981 CE_WARN,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6982 "sata_txlt_rw_completion :"
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6983 "internal error - invalid "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6984 "command 0x%2x",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6985 scmd->satacmd_cmd_reg));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6986 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6987 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6988 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6989 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6990 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6991 /* No extended sense key - no info available */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6992 scsipkt->pkt_reason = CMD_INCOMPLETE;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6993 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6994
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6995 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
6996 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
6997 scsipkt->pkt_statistics |=
46361481707a 6630713 x4500: Multiple (sdxx), "Error for Command", and "Error Block" errors seen in messages file.
ls24207
parents: 5832
diff changeset
6998 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
6999 sense->es_key = KEY_ABORTED_COMMAND;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7000 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7001
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7002 case SATA_PKT_ABORTED:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7003 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
7004 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
7005 sense->es_key = KEY_ABORTED_COMMAND;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7006 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7007
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7008 case SATA_PKT_RESET:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7009 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
7010 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
7011 sense->es_key = KEY_ABORTED_COMMAND;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7012 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7013
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7014 default:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7015 SATA_LOG_D((spx->txlt_sata_hba_inst, CE_WARN,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7016 "sata_txlt_rw_completion: "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7017 "invalid packet completion reason"));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7018 scsipkt->pkt_reason = CMD_TRAN_ERR;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7019 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7020 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7021 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7022 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7023 "Scsi_pkt completion reason %x\n", scsipkt->pkt_reason);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7024
9106
ee8f18cdafb2 6809527 scsi_hba_pkt_comp():More consumers
srivijitha dugganapalli <Srivijitha.Dugganapalli@Sun.COM>
parents: 9058
diff changeset
7025 if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0)
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7026 /* scsi callback required */
9106
ee8f18cdafb2 6809527 scsi_hba_pkt_comp():More consumers
srivijitha dugganapalli <Srivijitha.Dugganapalli@Sun.COM>
parents: 9058
diff changeset
7027 scsi_hba_pkt_comp(scsipkt);
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7028 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7029
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7030
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7031 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7032 * Translate completion status of non-data commands (i.e. commands returning
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7033 * no data).
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7034 * pkt completion_reason is checked to determine the completion status.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7035 * Do scsi callback if necessary (FLAG_NOINTR == 0)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7036 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7037 * Note: this function may be called also for synchronously executed
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7038 * commands.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7039 * This function may be used only if scsi_pkt is non-NULL.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7040 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7041
10131
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
7042 static void
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7043 sata_txlt_nodata_cmd_completion(sata_pkt_t *sata_pkt)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7044 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7045 sata_pkt_txlate_t *spx =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7046 (sata_pkt_txlate_t *)sata_pkt->satapkt_framework_private;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7047 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
7048
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
7049 sata_set_arq_data(sata_pkt);
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
7050
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
7051 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
7052 /* scsi callback required */
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
7053 scsi_hba_pkt_comp(scsipkt);
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
7054 }
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
7055
11222
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
7056 /*
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
7057 * Completion handler for ATA Pass Through command
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
7058 */
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
7059 static void
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
7060 sata_txlt_apt_completion(sata_pkt_t *sata_pkt)
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
7061 {
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
7062 sata_pkt_txlate_t *spx =
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
7063 (sata_pkt_txlate_t *)sata_pkt->satapkt_framework_private;
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
7064 sata_cmd_t *scmd = &sata_pkt->satapkt_cmd;
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
7065 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
7066 struct buf *bp;
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
7067 uint8_t sense_key = 0, addl_sense_code = 0, addl_sense_qual = 0;
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
7068
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
7069 if (sata_pkt->satapkt_reason == SATA_PKT_COMPLETED) {
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
7070 /* Normal completion */
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
7071 scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
7072 STATE_SENT_CMD | STATE_XFERRED_DATA | STATE_GOT_STATUS;
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
7073 scsipkt->pkt_reason = CMD_CMPLT;
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
7074 *scsipkt->pkt_scbp = STATUS_GOOD;
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
7075
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
7076 /*
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
7077 * If the command has CK_COND set
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
7078 */
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
7079 if (scsipkt->pkt_cdbp[2] & SATL_APT_BM_CK_COND) {
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
7080 *scsipkt->pkt_scbp = STATUS_CHECK;
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
7081 sata_fill_ata_return_desc(sata_pkt,
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
7082 KEY_RECOVERABLE_ERROR,
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
7083 SD_SCSI_ASC_ATP_INFO_AVAIL, 0);
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
7084 }
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
7085
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
7086 if (spx->txlt_tmp_buf != NULL) {
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
7087 /* Temporary buffer was used */
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
7088 bp = spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp;
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
7089 if (bp->b_flags & B_READ) {
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
7090 bcopy(spx->txlt_tmp_buf, bp->b_un.b_addr,
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
7091 bp->b_bcount);
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
7092 }
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
7093 }
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
7094 } else {
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
7095 scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
7096 STATE_SENT_CMD | STATE_GOT_STATUS;
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
7097 scsipkt->pkt_reason = CMD_INCOMPLETE;
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
7098 *scsipkt->pkt_scbp = STATUS_CHECK;
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
7099
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
7100 /*
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
7101 * If DF or ERR was set, the HBA should have copied out the
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
7102 * status and error registers to the satacmd structure.
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
7103 */
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
7104 if (scmd->satacmd_status_reg & SATA_STATUS_DF) {
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
7105 sense_key = KEY_HARDWARE_ERROR;
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
7106 addl_sense_code = SD_SCSI_ASC_INTERNAL_TARGET_FAILURE;
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
7107 addl_sense_qual = 0;
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
7108 } else if (scmd->satacmd_status_reg & SATA_STATUS_ERR) {
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
7109 if (scmd->satacmd_error_reg & SATA_ERROR_NM) {
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
7110 sense_key = KEY_NOT_READY;
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
7111 addl_sense_code =
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
7112 SD_SCSI_ASC_MEDIUM_NOT_PRESENT;
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
7113 addl_sense_qual = 0;
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
7114 } else if (scmd->satacmd_error_reg & SATA_ERROR_UNC) {
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
7115 sense_key = KEY_MEDIUM_ERROR;
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
7116 addl_sense_code = SD_SCSI_ASC_UNREC_READ_ERR;
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
7117 addl_sense_qual = 0;
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
7118 } else if (scmd->satacmd_error_reg & SATA_ERROR_ILI) {
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
7119 sense_key = KEY_DATA_PROTECT;
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
7120 addl_sense_code = SD_SCSI_ASC_WRITE_PROTECTED;
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
7121 addl_sense_qual = 0;
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
7122 } else if (scmd->satacmd_error_reg & SATA_ERROR_IDNF) {
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
7123 sense_key = KEY_ILLEGAL_REQUEST;
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
7124 addl_sense_code = SD_SCSI_ASC_LBA_OUT_OF_RANGE;
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
7125 addl_sense_qual = 0;
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
7126 } else if (scmd->satacmd_error_reg & SATA_ERROR_ABORT) {
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
7127 sense_key = KEY_ABORTED_COMMAND;
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
7128 addl_sense_code = SD_SCSI_ASC_NO_ADD_SENSE;
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
7129 addl_sense_qual = 0;
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
7130 } else if (scmd->satacmd_error_reg & SATA_ERROR_MC) {
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
7131 sense_key = KEY_UNIT_ATTENTION;
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
7132 addl_sense_code =
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
7133 SD_SCSI_ASC_MEDIUM_MAY_HAVE_CHANGED;
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
7134 addl_sense_qual = 0;
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
7135 } else if (scmd->satacmd_error_reg & SATA_ERROR_MCR) {
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
7136 sense_key = KEY_UNIT_ATTENTION;
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
7137 addl_sense_code = SD_SCSI_ASC_OP_MEDIUM_REM_REQ;
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
7138 addl_sense_qual = 0;
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
7139 } else if (scmd->satacmd_error_reg & SATA_ERROR_ICRC) {
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
7140 sense_key = KEY_ABORTED_COMMAND;
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
7141 addl_sense_code =
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
7142 SD_SCSI_ASC_INFO_UNIT_IUCRC_ERR;
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
7143 addl_sense_qual = 0;
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
7144 }
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
7145 }
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
7146
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
7147 sata_fill_ata_return_desc(sata_pkt, sense_key, addl_sense_code,
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
7148 addl_sense_qual);
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
7149 }
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
7150
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
7151 if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0)
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
7152 /* scsi callback required */
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
7153 scsi_hba_pkt_comp(scsipkt);
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
7154 }
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
7155
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
7156 /*
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
7157 * j
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
7158 */
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
7159 static void
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
7160 sata_fill_ata_return_desc(sata_pkt_t *sata_pkt, uint8_t sense_key,
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
7161 uint8_t addl_sense_code, uint8_t addl_sense_qual)
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
7162 {
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
7163 sata_pkt_txlate_t *spx =
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
7164 (sata_pkt_txlate_t *)sata_pkt->satapkt_framework_private;
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
7165 sata_cmd_t *scmd = &sata_pkt->satapkt_cmd;
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
7166 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
7167 struct sata_apt_sense_data *apt_sd =
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
7168 (struct sata_apt_sense_data *)scsipkt->pkt_scbp;
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
7169 struct scsi_descr_sense_hdr *sds = &(apt_sd->apt_sd_hdr);
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
7170 struct scsi_ata_status_ret_sense_descr *ata_ret_desc =
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
7171 &(apt_sd->apt_sd_sense);
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
7172 int extend = 0;
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
7173
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
7174 if ((scsipkt->pkt_cdbp[0] == SPC3_CMD_ATA_COMMAND_PASS_THROUGH16) &&
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
7175 (scsipkt->pkt_cdbp[2] & SATL_APT_BM_EXTEND))
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
7176 extend = 1;
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
7177
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
7178 scsipkt->pkt_state |= STATE_ARQ_DONE;
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
7179
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
7180 /* update the residual count */
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
7181 *(uchar_t *)&apt_sd->apt_status = STATUS_CHECK;
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
7182 *(uchar_t *)&apt_sd->apt_rqpkt_status = STATUS_GOOD;
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
7183 apt_sd->apt_rqpkt_reason = CMD_CMPLT;
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
7184 apt_sd->apt_rqpkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
7185 STATE_XFERRED_DATA | STATE_SENT_CMD | STATE_GOT_STATUS;
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
7186 apt_sd->apt_rqpkt_resid = scsipkt->pkt_scblen -
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
7187 sizeof (struct sata_apt_sense_data);
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
7188
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
7189 /*
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
7190 * Fill in the Descriptor sense header
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
7191 */
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
7192 bzero(sds, sizeof (struct scsi_descr_sense_hdr));
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
7193 sds->ds_code = CODE_FMT_DESCR_CURRENT;
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
7194 sds->ds_class = CLASS_EXTENDED_SENSE;
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
7195 sds->ds_key = sense_key & 0xf;
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
7196 sds->ds_add_code = addl_sense_code;
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
7197 sds->ds_qual_code = addl_sense_qual;
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
7198 sds->ds_addl_sense_length =
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
7199 sizeof (struct scsi_ata_status_ret_sense_descr);
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
7200
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
7201 /*
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
7202 * Fill in the ATA Return descriptor sense data
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
7203 */
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
7204 bzero(ata_ret_desc, sizeof (struct scsi_ata_status_ret_sense_descr));
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
7205 ata_ret_desc->ars_descr_type = DESCR_ATA_STATUS_RETURN;
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
7206 ata_ret_desc->ars_addl_length = 0xc;
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
7207 ata_ret_desc->ars_error = scmd->satacmd_error_reg;
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
7208 ata_ret_desc->ars_sec_count_lsb = scmd->satacmd_sec_count_lsb;
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
7209 ata_ret_desc->ars_lba_low_lsb = scmd->satacmd_lba_low_lsb;
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
7210 ata_ret_desc->ars_lba_mid_lsb = scmd->satacmd_lba_mid_lsb;
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
7211 ata_ret_desc->ars_lba_high_lsb = scmd->satacmd_lba_high_lsb;
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
7212 ata_ret_desc->ars_device = scmd->satacmd_device_reg;
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
7213 ata_ret_desc->ars_status = scmd->satacmd_status_reg;
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
7214
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
7215 if (extend == 1) {
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
7216 ata_ret_desc->ars_extend = 1;
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
7217 ata_ret_desc->ars_sec_count_msb = scmd->satacmd_sec_count_msb;
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
7218 ata_ret_desc->ars_lba_low_msb = scmd->satacmd_lba_low_msb;
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
7219 ata_ret_desc->ars_lba_mid_msb = scmd->satacmd_lba_mid_msb;
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
7220 ata_ret_desc->ars_lba_high_msb = scmd->satacmd_lba_high_msb;
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
7221 } else {
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
7222 ata_ret_desc->ars_extend = 0;
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
7223 ata_ret_desc->ars_sec_count_msb = 0;
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
7224 ata_ret_desc->ars_lba_low_msb = 0;
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
7225 ata_ret_desc->ars_lba_mid_msb = 0;
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
7226 ata_ret_desc->ars_lba_high_msb = 0;
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
7227 }
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
7228 }
5e56af24ae09 6398342 SATA Framework should support ATA PASS THROUGH command
Alan Perry <Alan.Perry@Sun.COM>
parents: 11104
diff changeset
7229
10131
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
7230 static void
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
7231 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
7232 {
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
7233 sata_pkt_txlate_t *spx =
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
7234 (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
7235 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7236 struct scsi_extended_sense *sense;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7237
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7238 scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7239 STATE_SENT_CMD | STATE_GOT_STATUS;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7240 if (sata_pkt->satapkt_reason == SATA_PKT_COMPLETED) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7241 /* Normal completion */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7242 scsipkt->pkt_reason = CMD_CMPLT;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7243 *scsipkt->pkt_scbp = STATUS_GOOD;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7244 } else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7245 /* Something went wrong */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7246 scsipkt->pkt_reason = CMD_INCOMPLETE;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7247 *scsipkt->pkt_scbp = STATUS_CHECK;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7248 sense = sata_arq_sense(spx);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7249 switch (sata_pkt->satapkt_reason) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7250 case SATA_PKT_PORT_ERROR:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7251 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7252 * We have no device data. Assume no data transfered.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7253 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7254 sense->es_key = KEY_HARDWARE_ERROR;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7255 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7256
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7257 case SATA_PKT_DEV_ERROR:
4582
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
7258 if (sata_pkt->satapkt_cmd.satacmd_status_reg &
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
7259 SATA_STATUS_ERR) {
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
7260 /*
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
7261 * determine dev error reason from error
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
7262 * reg content
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
7263 */
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
7264 sata_decode_device_error(spx, sense);
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
7265 break;
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
7266 }
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
7267 /* No extended sense key - no info available */
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7268 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7269
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7270 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
7271 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
7272 scsipkt->pkt_statistics |=
46361481707a 6630713 x4500: Multiple (sdxx), "Error for Command", and "Error Block" errors seen in messages file.
ls24207
parents: 5832
diff changeset
7273 STAT_TIMEOUT | STAT_DEV_RESET;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7274 /* No extended sense key ? */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7275 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7276
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7277 case SATA_PKT_ABORTED:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7278 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
7279 scsipkt->pkt_statistics |= STAT_ABORTED;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7280 /* No extended sense key ? */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7281 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7282
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7283 case SATA_PKT_RESET:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7284 /* pkt aborted by an explicit reset from a host */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7285 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
7286 scsipkt->pkt_statistics |= STAT_DEV_RESET;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7287 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7288
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7289 default:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7290 SATA_LOG_D((spx->txlt_sata_hba_inst, CE_WARN,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7291 "sata_txlt_nodata_cmd_completion: "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7292 "invalid packet completion reason %d",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7293 sata_pkt->satapkt_reason));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7294 scsipkt->pkt_reason = CMD_TRAN_ERR;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7295 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7296 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7297
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7298 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7299 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7300 "Scsi_pkt completion reason %x\n", scsipkt->pkt_reason);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7301 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7302
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7303
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7304 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7305 * Build Mode sense R/W recovery page
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7306 * NOT IMPLEMENTED
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7307 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7308
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7309 static int
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7310 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
7311 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7312 #ifndef __lock_lint
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7313 _NOTE(ARGUNUSED(sdinfo))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7314 _NOTE(ARGUNUSED(pcntrl))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7315 _NOTE(ARGUNUSED(buf))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7316 #endif
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7317 return (0);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7318 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7319
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7320 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7321 * Build Mode sense caching page - scsi-3 implementation.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7322 * Page length distinguishes previous format from scsi-3 format.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7323 * buf must have space for 0x12 bytes.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7324 * Only DRA (disable read ahead ) and WCE (write cache enable) are changeable.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7325 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7326 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7327 static int
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7328 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
7329 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7330 struct mode_cache_scsi3 *page = (struct mode_cache_scsi3 *)buf;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7331 sata_id_t *sata_id = &sdinfo->satadrv_id;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7332
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7333 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7334 * 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
7335 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7336 bzero(buf, PAGELENGTH_DAD_MODE_CACHE_SCSI3);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7337
1675
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
7338 /* Saved paramters not supported */
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
7339 if (pcntrl == 3)
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
7340 return (0);
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7341 if (pcntrl == 0 || pcntrl == 2) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7342 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7343 * For now treat current and default parameters as same
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7344 * That may have to change, if target driver will complain
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7345 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7346 page->mode_page.code = MODEPAGE_CACHING; /* PS = 0 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7347 page->mode_page.length = PAGELENGTH_DAD_MODE_CACHE_SCSI3;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7348
9058
a7b4d0b3fd3d 6803930 ahci task file errors on new development box
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 8317
diff changeset
7349 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
7350 !SATA_READ_AHEAD_ENABLED(*sata_id)) {
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7351 page->dra = 1; /* Read Ahead disabled */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7352 page->rcd = 1; /* Read Cache disabled */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7353 }
9058
a7b4d0b3fd3d 6803930 ahci task file errors on new development box
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 8317
diff changeset
7354 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
7355 SATA_WRITE_CACHE_ENABLED(*sata_id))
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7356 page->wce = 1; /* Write Cache enabled */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7357 } else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7358 /* Changeable parameters */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7359 page->mode_page.code = MODEPAGE_CACHING;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7360 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
7361 if (SATA_READ_AHEAD_SUPPORTED(*sata_id)) {
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7362 page->dra = 1;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7363 page->rcd = 1;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7364 }
9058
a7b4d0b3fd3d 6803930 ahci task file errors on new development box
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 8317
diff changeset
7365 if (SATA_WRITE_CACHE_SUPPORTED(*sata_id))
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7366 page->wce = 1;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7367 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7368 return (PAGELENGTH_DAD_MODE_CACHE_SCSI3 +
4582
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
7369 sizeof (struct mode_page));
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7370 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7371
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7372 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7373 * Build Mode sense exception cntrl page
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7374 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7375 static int
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7376 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
7377 {
1675
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
7378 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
7379 sata_id_t *sata_id = &sdinfo->satadrv_id;
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
7380
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
7381 /*
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
7382 * 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
7383 */
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
7384 bzero(buf, PAGELENGTH_INFO_EXCPT);
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
7385
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
7386 page->mode_page.code = MODEPAGE_INFO_EXCPT;
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
7387 page->mode_page.length = PAGELENGTH_INFO_EXCPT;
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
7388
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
7389 /* Indicate that this is page is saveable */
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
7390 page->mode_page.ps = 1;
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
7391
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
7392 /*
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
7393 * 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
7394 * 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
7395 * 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
7396 */
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
7397 if (pcntrl != 1) {
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
7398 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
7399 page->mrie = MRIE_ONLY_ON_REQUEST;
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
7400 }
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
7401 else
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
7402 page->dexcpt = 1; /* Only changeable parameter */
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
7403
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
7404 return (PAGELENGTH_INFO_EXCPT + sizeof (struct mode_page));
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7405 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7406
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7407
4836
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
7408 static int
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
7409 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
7410 {
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
7411 struct mode_acoustic_management *page =
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
7412 (struct mode_acoustic_management *)buf;
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
7413 sata_id_t *sata_id = &sdinfo->satadrv_id;
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
7414
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
7415 /*
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
7416 * 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
7417 */
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
7418 bzero(buf, PAGELENGTH_DAD_MODE_ACOUSTIC_MANAGEMENT);
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
7419
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
7420 switch (pcntrl) {
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
7421 case P_CNTRL_DEFAULT:
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
7422 /* default paramters not supported */
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
7423 return (0);
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
7424
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
7425 case P_CNTRL_CURRENT:
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
7426 case P_CNTRL_SAVED:
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
7427 /* Saved and current are supported and are identical */
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
7428 page->mode_page.code = MODEPAGE_ACOUSTIC_MANAG;
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
7429 page->mode_page.length =
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
7430 PAGELENGTH_DAD_MODE_ACOUSTIC_MANAGEMENT;
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
7431 page->mode_page.ps = 1;
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
7432
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
7433 /* Word 83 indicates if feature is supported */
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
7434 /* If feature is not supported */
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
7435 if (!(sata_id->ai_cmdset83 & SATA_ACOUSTIC_MGMT)) {
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
7436 page->acoustic_manag_enable =
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
7437 ACOUSTIC_DISABLED;
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
7438 } else {
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
7439 page->acoustic_manag_enable =
4837
fe2f53c9eb50 6556577 Need to support Advanced Acoustic Management Feature (AAM (fix lint)
ls24207
parents: 4836
diff changeset
7440 ((sata_id->ai_features86 & SATA_ACOUSTIC_MGMT)
4836
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
7441 != 0);
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
7442 /* Word 94 inidicates the value */
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
7443 #ifdef _LITTLE_ENDIAN
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
7444 page->acoustic_manag_level =
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
7445 (uchar_t)sata_id->ai_acoustic;
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
7446 page->vendor_recommended_value =
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
7447 sata_id->ai_acoustic >> 8;
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
7448 #else
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
7449 page->acoustic_manag_level =
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
7450 sata_id->ai_acoustic >> 8;
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
7451 page->vendor_recommended_value =
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
7452 (uchar_t)sata_id->ai_acoustic;
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
7453 #endif
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
7454 }
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
7455 break;
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
7456
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
7457 case P_CNTRL_CHANGEABLE:
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
7458 page->mode_page.code = MODEPAGE_ACOUSTIC_MANAG;
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
7459 page->mode_page.length =
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
7460 PAGELENGTH_DAD_MODE_ACOUSTIC_MANAGEMENT;
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
7461 page->mode_page.ps = 1;
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
7462
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
7463 /* Word 83 indicates if the feature is supported */
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
7464 if (sata_id->ai_cmdset83 & SATA_ACOUSTIC_MGMT) {
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
7465 page->acoustic_manag_enable =
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
7466 ACOUSTIC_ENABLED;
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
7467 page->acoustic_manag_level = 0xff;
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
7468 }
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
7469 break;
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
7470 }
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
7471 return (PAGELENGTH_DAD_MODE_ACOUSTIC_MANAGEMENT +
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
7472 sizeof (struct mode_page));
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
7473 }
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
7474
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
7475
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7476 /*
10131
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
7477 * Build Mode sense power condition page.
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7478 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7479 static int
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7480 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
7481 {
10131
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
7482 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
7483 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
7484
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
7485 /*
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
7486 * 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
7487 * power condition page length was 0x0a
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
7488 */
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
7489 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
7490
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
7491 if (pcntrl == P_CNTRL_DEFAULT) {
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
7492 /* default paramters not supported */
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
7493 return (0);
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
7494 }
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
7495
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
7496 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
7497 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
7498
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
7499 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
7500 page->standby = 1;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
7501 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
7502 sizeof (uchar_t) * 4);
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
7503 }
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
7504
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
7505 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
7506 }
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7507
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7508 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7509 * Process mode select caching page 8 (scsi3 format only).
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7510 * 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
7511 * 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
7512 * supported, the command will be terminated with STATUS_CHECK.
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7513 * This function fails only if the SET FEATURE command sent to
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7514 * the device fails. The page format is not varified, assuming that the
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7515 * target driver operates correctly - if parameters length is too short,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7516 * we just drop the page.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7517 * 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
7518 * setting have to be changed.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7519 * SET FEATURE command is executed synchronously, i.e. we wait here until
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7520 * it is completed, regardless of the scsi pkt directives.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7521 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7522 * 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
7523 * changing DRA will change RCD.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7524 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7525 * More than one SATA command may be executed to perform operations specified
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7526 * by mode select pages. The first error terminates further execution.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7527 * Operations performed successully are not backed-up in such case.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7528 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7529 * Return SATA_SUCCESS if operation succeeded, SATA_FAILURE otherwise.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7530 * 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
7531 * 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
7532 * Upon return, if operation required sending command to the device, the rval
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7533 * 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
7534 * did not require device access, rval should be set to TRAN_ACCEPT.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7535 * The pagelen should be set to the length of the page.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7536 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7537 * This function has to be called with a port mutex held.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7538 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7539 * Returns SATA_SUCCESS if operation was successful, SATA_FAILURE otherwise.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7540 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7541 int
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7542 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
7543 int parmlen, int *pagelen, int *rval, int *dmod)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7544 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7545 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7546 sata_drive_info_t *sdinfo;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7547 sata_cmd_t *scmd = &spx->txlt_sata_pkt->satapkt_cmd;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7548 sata_id_t *sata_id;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7549 struct scsi_extended_sense *sense;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7550 int wce, dra; /* Current settings */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7551
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7552 sdinfo = sata_get_device_info(spx->txlt_sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7553 &spx->txlt_sata_pkt->satapkt_device);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7554 sata_id = &sdinfo->satadrv_id;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7555 *dmod = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7556
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7557 /* 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
7558 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
7559 sizeof (struct mode_page)) > parmlen) {
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7560 *scsipkt->pkt_scbp = STATUS_CHECK;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7561 sense = sata_arq_sense(spx);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7562 sense->es_key = KEY_ILLEGAL_REQUEST;
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
7563 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
7564 *pagelen = parmlen;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7565 *rval = TRAN_ACCEPT;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7566 return (SATA_FAILURE);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7567 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7568
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7569 *pagelen = PAGELENGTH_DAD_MODE_CACHE_SCSI3 + sizeof (struct mode_page);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7570
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7571 /* 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
7572 if (SATA_READ_AHEAD_ENABLED(*sata_id))
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7573 dra = 0; /* 0 == not disabled */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7574 else
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7575 dra = 1;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7576 /* 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
7577 if (SATA_WRITE_CACHE_ENABLED(*sata_id))
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7578 wce = 1;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7579 else
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7580 wce = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7581
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7582 if (page->dra == dra && page->wce == wce && page->rcd == dra) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7583 /* nothing to do */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7584 *rval = TRAN_ACCEPT;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7585 return (SATA_SUCCESS);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7586 }
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
7587
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7588 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7589 * Need to flip some setting
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7590 * Set-up Internal SET FEATURES command(s)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7591 */
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
7592 scmd->satacmd_flags.sata_data_direction = SATA_DIR_NODATA_XFER;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7593 scmd->satacmd_addr_type = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7594 scmd->satacmd_device_reg = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7595 scmd->satacmd_status_reg = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7596 scmd->satacmd_error_reg = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7597 scmd->satacmd_cmd_reg = SATAC_SET_FEATURES;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7598 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
7599 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
7600 /* 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
7601 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
7602 /* 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
7603 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
7604 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
7605 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
7606 /* 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
7607 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
7608 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
7609
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
7610 /* 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
7611 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
7612 /*
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
7613 * 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
7614 */
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
7615 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
7616
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
7617 *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
7618
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
7619 /* 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
7620 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
7621 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
7622 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
7623 }
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
7624 } 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
7625 *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
7626 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
7627 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
7628 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
7629 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
7630 *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
7631 *rval = TRAN_ACCEPT;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7632 return (SATA_FAILURE);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7633 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7634 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7635
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7636 /* 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
7637 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
7638 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
7639 /* 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
7640 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
7641 /* 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
7642 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
7643 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
7644 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
7645 /* 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
7646 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
7647 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
7648
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
7649 /* 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
7650 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
7651 /*
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
7652 * 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
7653 */
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
7654 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
7655
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
7656 *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
7657
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
7658 /* 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
7659 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
7660 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
7661 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
7662 }
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
7663 } 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
7664 *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
7665 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
7666 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
7667 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
7668 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
7669 *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
7670 *rval = TRAN_ACCEPT;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7671 return (SATA_FAILURE);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7672 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7673 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7674 return (SATA_SUCCESS);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7675
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7676 failure:
1675
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
7677 sata_xlate_errors(spx);
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
7678
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
7679 return (SATA_FAILURE);
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
7680 }
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
7681
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
7682 /*
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
7683 * Process mode select informational exceptions control page 0x1c
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
7684 *
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
7685 * The only changeable bit is dexcpt (disable exceptions).
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
7686 * MRIE (method of reporting informational exceptions) must be
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
7687 * "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
7688 * 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
7689 * 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
7690 * (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
7691 * 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
7692 * 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
7693 * 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
7694 * 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
7695 *
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
7696 * 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
7697 * 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
7698 * 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
7699 * 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
7700 * 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
7701 * 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
7702 * 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
7703 *
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
7704 * 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
7705 *
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
7706 * 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
7707 *
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
7708 * Cannot be called in the interrupt context.
1675
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
7709 */
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
7710 static int
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
7711 sata_mode_select_page_1c(
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
7712 sata_pkt_txlate_t *spx,
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
7713 struct mode_info_excpt_page *page,
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
7714 int parmlen,
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
7715 int *pagelen,
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
7716 int *rval,
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
7717 int *dmod)
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
7718 {
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
7719 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
7720 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
7721 sata_drive_info_t *sdinfo;
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
7722 sata_id_t *sata_id;
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
7723 struct scsi_extended_sense *sense;
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
7724
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
7725 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
7726 &spx->txlt_sata_pkt->satapkt_device);
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
7727 sata_id = &sdinfo->satadrv_id;
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
7728
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
7729 *dmod = 0;
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
7730
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
7731 /* 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
7732 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
7733 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
7734 *scsipkt->pkt_scbp = STATUS_CHECK;
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
7735 sense = sata_arq_sense(spx);
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
7736 sense->es_key = KEY_ILLEGAL_REQUEST;
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
7737 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
7738 *pagelen = parmlen;
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
7739 *rval = TRAN_ACCEPT;
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
7740 return (SATA_FAILURE);
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
7741 }
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
7742
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
7743 *pagelen = PAGELENGTH_INFO_EXCPT + sizeof (struct mode_page);
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
7744
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
7745 if (! (sata_id->ai_cmdset82 & SATA_SMART_SUPPORTED)) {
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
7746 *scsipkt->pkt_scbp = STATUS_CHECK;
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
7747 sense = sata_arq_sense(spx);
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
7748 sense->es_key = KEY_ILLEGAL_REQUEST;
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
7749 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
7750 *pagelen = parmlen;
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
7751 *rval = TRAN_ACCEPT;
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
7752 return (SATA_FAILURE);
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
7753 }
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
7754
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
7755 /* 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
7756 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
7757 /* nothing to do */
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
7758 *rval = TRAN_ACCEPT;
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
7759 return (SATA_SUCCESS);
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
7760 }
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
7761
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
7762 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
7763
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
7764 /* Build SMART_ENABLE or SMART_DISABLE command */
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
7765 scmd->satacmd_addr_type = 0; /* N/A */
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
7766 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
7767 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
7768 scmd->satacmd_features_reg = page->dexcpt ?
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
7769 SATA_SMART_DISABLE_OPS : SATA_SMART_ENABLE_OPS;
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
7770 scmd->satacmd_device_reg = 0; /* Always device 0 */
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
7771 scmd->satacmd_cmd_reg = SATAC_SMART;
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
7772
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
7773 /* Transfer command to HBA */
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
7774 if (sata_hba_start(spx, rval) != 0)
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
7775 /*
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
7776 * Pkt not accepted for execution.
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
7777 */
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
7778 return (SATA_FAILURE);
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
7779
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
7780 *dmod = 1; /* At least may have been modified */
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
7781
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
7782 /* Now process return */
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
7783 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
7784 return (SATA_SUCCESS);
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
7785
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
7786 /* Packet did not complete successfully */
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
7787 sata_xlate_errors(spx);
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
7788
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7789 return (SATA_FAILURE);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7790 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7791
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
7792 /*
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
7793 * 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
7794 *
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
7795 *
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
7796 * 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
7797 *
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
7798 * 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
7799 *
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
7800 * 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
7801 */
4836
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
7802 int
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
7803 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
7804 mode_acoustic_management *page, int parmlen, int *pagelen,
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
7805 int *rval, int *dmod)
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
7806 {
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
7807 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
7808 sata_drive_info_t *sdinfo;
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
7809 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
7810 sata_id_t *sata_id;
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
7811 struct scsi_extended_sense *sense;
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
7812
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
7813 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
7814 &spx->txlt_sata_pkt->satapkt_device);
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
7815 sata_id = &sdinfo->satadrv_id;
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
7816 *dmod = 0;
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
7817
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
7818 /* 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
7819 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
7820 sizeof (struct mode_page)) > parmlen) ||
4836
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
7821 (! (sata_id->ai_cmdset83 & SATA_ACOUSTIC_MGMT))) {
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
7822 *scsipkt->pkt_scbp = STATUS_CHECK;
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
7823 sense = sata_arq_sense(spx);
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
7824 sense->es_key = KEY_ILLEGAL_REQUEST;
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
7825 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
7826 *pagelen = parmlen;
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
7827 *rval = TRAN_ACCEPT;
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
7828 return (SATA_FAILURE);
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
7829 }
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
7830
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
7831 *pagelen = PAGELENGTH_DAD_MODE_ACOUSTIC_MANAGEMENT +
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
7832 sizeof (struct mode_page);
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
7833
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
7834 /*
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
7835 * We can enable and disable acoustice management and
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
7836 * set the acoustic management level.
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
7837 */
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
7838
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
7839 /*
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
7840 * Set-up Internal SET FEATURES command(s)
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
7841 */
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
7842 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
7843 scmd->satacmd_addr_type = 0;
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
7844 scmd->satacmd_device_reg = 0;
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
7845 scmd->satacmd_status_reg = 0;
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
7846 scmd->satacmd_error_reg = 0;
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
7847 scmd->satacmd_cmd_reg = SATAC_SET_FEATURES;
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
7848 if (page->acoustic_manag_enable) {
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
7849 scmd->satacmd_features_reg = SATAC_SF_ENABLE_ACOUSTIC;
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
7850 scmd->satacmd_sec_count_lsb = page->acoustic_manag_level;
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
7851 } else { /* disabling acoustic management */
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
7852 scmd->satacmd_features_reg = SATAC_SF_DISABLE_ACOUSTIC;
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
7853 }
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
7854
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
7855 /* Transfer command to HBA */
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
7856 if (sata_hba_start(spx, rval) != 0)
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
7857 /*
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
7858 * Pkt not accepted for execution.
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
7859 */
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
7860 return (SATA_FAILURE);
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
7861
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
7862 /* Now process return */
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
7863 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
7864 sata_xlate_errors(spx);
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
7865 return (SATA_FAILURE);
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
7866 }
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
7867
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
7868 *dmod = 1;
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
7869
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
7870 return (SATA_SUCCESS);
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
7871 }
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
7872
10131
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
7873 /*
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
7874 * 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
7875 *
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
7876 * 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
7877 *
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
7878 * 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
7879 *
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
7880 * 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
7881 */
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
7882 int
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
7883 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
7884 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
7885 int *rval, int *dmod)
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
7886 {
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
7887 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
7888 sata_drive_info_t *sdinfo;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
7889 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
7890 sata_id_t *sata_id;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
7891 struct scsi_extended_sense *sense;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
7892 uint8_t ata_count;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
7893 int i, len;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
7894
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
7895 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
7896 &spx->txlt_sata_pkt->satapkt_device);
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
7897 sata_id = &sdinfo->satadrv_id;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
7898 *dmod = 0;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
7899
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
7900 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
7901 len += sizeof (struct mode_page);
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
7902
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
7903 /* 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
7904 if ((len < parmlen) || (page->idle == 1) ||
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
7905 (!(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
7906 *scsipkt->pkt_scbp = STATUS_CHECK;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
7907 sense = sata_arq_sense(spx);
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
7908 sense->es_key = KEY_ILLEGAL_REQUEST;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
7909 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
7910 *pagelen = parmlen;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
7911 *rval = TRAN_ACCEPT;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
7912 return (SATA_FAILURE);
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
7913 }
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
7914
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
7915 *pagelen = len;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
7916
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
7917 /*
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
7918 * Set-up Internal STANDBY command(s)
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
7919 */
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
7920 if (page->standby == 0)
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
7921 goto out;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
7922
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
7923 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
7924
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
7925 scmd->satacmd_addr_type = 0;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
7926 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
7927 scmd->satacmd_lba_low_lsb = 0;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
7928 scmd->satacmd_lba_mid_lsb = 0;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
7929 scmd->satacmd_lba_high_lsb = 0;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
7930 scmd->satacmd_features_reg = 0;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
7931 scmd->satacmd_device_reg = 0;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
7932 scmd->satacmd_status_reg = 0;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
7933 scmd->satacmd_cmd_reg = SATAC_STANDBY;
10427
7d60ed90f743 6873542 forced core dump fails
Ada <Ada.Feng@Sun.COM>
parents: 10391
diff changeset
7934 scmd->satacmd_flags.sata_special_regs = B_TRUE;
10131
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
7935 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
7936
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
7937 /* Transfer command to HBA */
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
7938 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
7939 return (SATA_FAILURE);
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
7940 } else {
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
7941 if ((scmd->satacmd_error_reg != 0) ||
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
7942 (spx->txlt_sata_pkt->satapkt_reason !=
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
7943 SATA_PKT_COMPLETED)) {
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
7944 sata_xlate_errors(spx);
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
7945 return (SATA_FAILURE);
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
7946 }
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
7947 }
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
7948
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
7949 for (i = 0; i < 4; i++) {
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
7950 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
7951 }
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
7952 out:
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
7953 *dmod = 1;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
7954 return (SATA_SUCCESS);
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
7955 }
4836
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
7956
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
7957 /*
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
7958 * 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
7959 * SCSI LOG SENSE page 0 (supported log pages)
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
7960 *
10131
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
7961 * 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
7962 * (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
7963 * 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
7964 *
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
7965 * 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
7966 * in which to create the page information.
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
7967 *
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
7968 * 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
7969 */
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
7970 static int
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
7971 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
7972 {
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
7973 struct log_parameter *lpp = (struct log_parameter *)buf;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
7974 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
7975 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
7976 sata_id_t *sata_id = &sdinfo->satadrv_id;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
7977
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
7978 lpp->param_code[0] = 0;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
7979 lpp->param_code[1] = 0;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
7980 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
7981 *page_ptr++ = PAGE_CODE_GET_SUPPORTED_LOG_PAGES;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
7982
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
7983 if (sata_id->ai_cmdset82 & SATA_SMART_SUPPORTED) {
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
7984 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
7985 *page_ptr++ = PAGE_CODE_SELF_TEST_RESULTS;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
7986 ++num_pages_supported;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
7987 }
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
7988 *page_ptr++ = PAGE_CODE_INFORMATION_EXCEPTIONS;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
7989 ++num_pages_supported;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
7990 *page_ptr++ = PAGE_CODE_SMART_READ_DATA;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
7991 ++num_pages_supported;
10131
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
7992 *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
7993 ++num_pages_supported;
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
7994 }
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
7995
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
7996 lpp->param_len = num_pages_supported;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
7997
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
7998 return ((&lpp->param_values[0] - (uint8_t *)lpp) +
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
7999 num_pages_supported);
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8000 }
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8001
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8002 /*
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8003 * 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
8004 * SCSI LOG SENSE page 0x10 (self-test results)
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8005 *
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8006 * 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
8007 * 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
8008 *
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8009 * 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
8010 *
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
8011 * 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
8012 * 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
8013 * 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
8014 * 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
8015 * - 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
8016 * 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
8017 * 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
8018 * 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
8019 * 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
8020 *
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
8021 * 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
8022 * 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
8023 */
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8024 static int
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8025 sata_build_lsense_page_10(
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8026 sata_drive_info_t *sdinfo,
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8027 uint8_t *buf,
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8028 sata_hba_inst_t *sata_hba_inst)
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8029 {
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8030 struct log_parameter *lpp = (struct log_parameter *)buf;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8031 int rval;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8032
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8033 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
8034 struct smart_ext_selftest_log *ext_selftest_log;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8035
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8036 ext_selftest_log = kmem_zalloc(
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8037 sizeof (struct smart_ext_selftest_log), KM_SLEEP);
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8038
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8039 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
8040 ext_selftest_log, 0);
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8041 if (rval == 0) {
1940
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
8042 int index, start_index;
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8043 struct smart_ext_selftest_log_entry *entry;
1940
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
8044 static const struct smart_ext_selftest_log_entry empty =
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
8045 {0};
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8046 uint16_t block_num;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8047 int count;
1940
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
8048 boolean_t only_one_block = B_FALSE;
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8049
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8050 index = ext_selftest_log->
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8051 smart_ext_selftest_log_index[0];
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8052 index |= ext_selftest_log->
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8053 smart_ext_selftest_log_index[1] << 8;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8054 if (index == 0)
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8055 goto out;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8056
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8057 --index; /* Correct for 0 origin */
1940
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
8058 start_index = index; /* remember where we started */
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8059 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
8060 if (block_num != 0) {
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8061 rval = sata_ext_smart_selftest_read_log(
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8062 sata_hba_inst, sdinfo, ext_selftest_log,
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8063 block_num);
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8064 if (rval != 0)
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8065 goto out;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8066 }
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8067 index %= ENTRIES_PER_EXT_SELFTEST_LOG_BLK;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8068 entry =
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8069 &ext_selftest_log->
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8070 smart_ext_selftest_log_entries[index];
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8071
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8072 for (count = 1;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8073 count <= SCSI_ENTRIES_IN_LOG_SENSE_SELFTEST_RESULTS;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8074 ++count) {
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8075 uint8_t status;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8076 uint8_t code;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8077 uint8_t sense_key;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8078 uint8_t add_sense_code;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8079 uint8_t add_sense_code_qual;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8080
1940
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
8081 /* If this is an unused entry, we are done */
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
8082 if (bcmp(entry, &empty, sizeof (empty)) == 0) {
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
8083 /* Broken firmware on some disks */
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
8084 if (index + 1 ==
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
8085 ENTRIES_PER_EXT_SELFTEST_LOG_BLK) {
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
8086 --entry;
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
8087 --index;
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
8088 if (bcmp(entry, &empty,
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
8089 sizeof (empty)) == 0)
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
8090 goto out;
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
8091 } else
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
8092 goto out;
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
8093 }
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
8094
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
8095 if (only_one_block &&
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
8096 start_index == index)
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
8097 goto out;
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
8098
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8099 lpp->param_code[0] = 0;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8100 lpp->param_code[1] = count;
1940
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
8101 lpp->param_ctrl_flags =
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
8102 LOG_CTRL_LP | LOG_CTRL_LBIN;
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8103 lpp->param_len =
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8104 SCSI_LOG_SENSE_SELFTEST_PARAM_LEN;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8105
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8106 status = entry->smart_ext_selftest_log_status;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8107 status >>= 4;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8108 switch (status) {
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8109 case 0:
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8110 default:
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8111 sense_key = KEY_NO_SENSE;
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8112 add_sense_code =
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8113 SD_SCSI_ASC_NO_ADD_SENSE;
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8114 add_sense_code_qual = 0;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8115 break;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8116 case 1:
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8117 sense_key = KEY_ABORTED_COMMAND;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8118 add_sense_code =
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8119 DIAGNOSTIC_FAILURE_ON_COMPONENT;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8120 add_sense_code_qual = SCSI_COMPONENT_81;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8121 break;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8122 case 2:
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8123 sense_key = KEY_ABORTED_COMMAND;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8124 add_sense_code =
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8125 DIAGNOSTIC_FAILURE_ON_COMPONENT;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8126 add_sense_code_qual = SCSI_COMPONENT_82;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8127 break;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8128 case 3:
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8129 sense_key = KEY_ABORTED_COMMAND;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8130 add_sense_code =
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8131 DIAGNOSTIC_FAILURE_ON_COMPONENT;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8132 add_sense_code_qual = SCSI_COMPONENT_83;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8133 break;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8134 case 4:
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8135 sense_key = KEY_HARDWARE_ERROR;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8136 add_sense_code =
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8137 DIAGNOSTIC_FAILURE_ON_COMPONENT;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8138 add_sense_code_qual = SCSI_COMPONENT_84;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8139 break;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8140 case 5:
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8141 sense_key = KEY_HARDWARE_ERROR;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8142 add_sense_code =
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8143 DIAGNOSTIC_FAILURE_ON_COMPONENT;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8144 add_sense_code_qual = SCSI_COMPONENT_85;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8145 break;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8146 case 6:
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8147 sense_key = KEY_HARDWARE_ERROR;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8148 add_sense_code =
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8149 DIAGNOSTIC_FAILURE_ON_COMPONENT;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8150 add_sense_code_qual = SCSI_COMPONENT_86;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8151 break;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8152 case 7:
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8153 sense_key = KEY_MEDIUM_ERROR;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8154 add_sense_code =
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8155 DIAGNOSTIC_FAILURE_ON_COMPONENT;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8156 add_sense_code_qual = SCSI_COMPONENT_87;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8157 break;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8158 case 8:
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8159 sense_key = KEY_HARDWARE_ERROR;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8160 add_sense_code =
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8161 DIAGNOSTIC_FAILURE_ON_COMPONENT;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8162 add_sense_code_qual = SCSI_COMPONENT_88;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8163 break;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8164 }
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8165 code = 0; /* unspecified */
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8166 status |= (code << 4);
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8167 lpp->param_values[0] = status;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8168 lpp->param_values[1] = 0; /* unspecified */
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8169 lpp->param_values[2] = entry->
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8170 smart_ext_selftest_log_timestamp[1];
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8171 lpp->param_values[3] = entry->
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8172 smart_ext_selftest_log_timestamp[0];
1940
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
8173 if (status != 0) {
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
8174 lpp->param_values[4] = 0;
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
8175 lpp->param_values[5] = 0;
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
8176 lpp->param_values[6] = entry->
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
8177 smart_ext_selftest_log_failing_lba
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
8178 [5];
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
8179 lpp->param_values[7] = entry->
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
8180 smart_ext_selftest_log_failing_lba
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
8181 [4];
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
8182 lpp->param_values[8] = entry->
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
8183 smart_ext_selftest_log_failing_lba
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
8184 [3];
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
8185 lpp->param_values[9] = entry->
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
8186 smart_ext_selftest_log_failing_lba
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
8187 [2];
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
8188 lpp->param_values[10] = entry->
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
8189 smart_ext_selftest_log_failing_lba
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
8190 [1];
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
8191 lpp->param_values[11] = entry->
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
8192 smart_ext_selftest_log_failing_lba
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
8193 [0];
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
8194 } else { /* No bad block address */
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
8195 lpp->param_values[4] = 0xff;
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
8196 lpp->param_values[5] = 0xff;
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
8197 lpp->param_values[6] = 0xff;
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
8198 lpp->param_values[7] = 0xff;
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
8199 lpp->param_values[8] = 0xff;
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
8200 lpp->param_values[9] = 0xff;
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
8201 lpp->param_values[10] = 0xff;
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
8202 lpp->param_values[11] = 0xff;
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
8203 }
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
8204
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8205 lpp->param_values[12] = sense_key;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8206 lpp->param_values[13] = add_sense_code;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8207 lpp->param_values[14] = add_sense_code_qual;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8208 lpp->param_values[15] = 0; /* undefined */
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8209
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8210 lpp = (struct log_parameter *)
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8211 (((uint8_t *)lpp) +
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8212 SCSI_LOG_PARAM_HDR_LEN +
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8213 SCSI_LOG_SENSE_SELFTEST_PARAM_LEN);
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8214
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8215 --index; /* Back up to previous entry */
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8216 if (index < 0) {
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8217 if (block_num > 0) {
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8218 --block_num;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8219 } else {
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8220 struct read_log_ext_directory
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8221 logdir;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8222
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8223 rval =
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8224 sata_read_log_ext_directory(
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8225 sata_hba_inst, sdinfo,
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8226 &logdir);
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8227 if (rval == -1)
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8228 goto out;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8229 if ((logdir.read_log_ext_vers
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8230 [0] == 0) &&
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8231 (logdir.read_log_ext_vers
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8232 [1] == 0))
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8233 goto out;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8234 block_num =
1940
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
8235 logdir.read_log_ext_nblks
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8236 [EXT_SMART_SELFTEST_LOG_PAGE
1940
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
8237 - 1][0];
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8238 block_num |= logdir.
1940
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
8239 read_log_ext_nblks
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8240 [EXT_SMART_SELFTEST_LOG_PAGE
1940
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
8241 - 1][1] << 8;
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8242 --block_num;
1940
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
8243 only_one_block =
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
8244 (block_num == 0);
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8245 }
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8246 rval = sata_ext_smart_selftest_read_log(
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8247 sata_hba_inst, sdinfo,
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8248 ext_selftest_log, block_num);
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8249 if (rval != 0)
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8250 goto out;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8251
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8252 index =
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8253 ENTRIES_PER_EXT_SELFTEST_LOG_BLK -
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8254 1;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8255 }
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8256 index %= ENTRIES_PER_EXT_SELFTEST_LOG_BLK;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8257 entry = &ext_selftest_log->
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8258 smart_ext_selftest_log_entries[index];
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8259 }
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8260 }
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8261 out:
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8262 kmem_free(ext_selftest_log,
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8263 sizeof (struct smart_ext_selftest_log));
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8264 } else {
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8265 struct smart_selftest_log *selftest_log;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8266
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8267 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
8268 KM_SLEEP);
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8269
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8270 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
8271 selftest_log);
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8272
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8273 if (rval == 0) {
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8274 int index;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8275 int count;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8276 struct smart_selftest_log_entry *entry;
1940
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
8277 static const struct smart_selftest_log_entry empty =
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
8278 { 0 };
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8279
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8280 index = selftest_log->smart_selftest_log_index;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8281 if (index == 0)
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8282 goto done;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8283 --index; /* Correct for 0 origin */
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8284 entry = &selftest_log->
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8285 smart_selftest_log_entries[index];
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8286 for (count = 1;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8287 count <= SCSI_ENTRIES_IN_LOG_SENSE_SELFTEST_RESULTS;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8288 ++count) {
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8289 uint8_t status;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8290 uint8_t code;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8291 uint8_t sense_key;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8292 uint8_t add_sense_code;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8293 uint8_t add_sense_code_qual;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8294
1940
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
8295 if (bcmp(entry, &empty, sizeof (empty)) == 0)
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
8296 goto done;
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
8297
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8298 lpp->param_code[0] = 0;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8299 lpp->param_code[1] = count;
1940
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
8300 lpp->param_ctrl_flags =
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
8301 LOG_CTRL_LP | LOG_CTRL_LBIN;
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8302 lpp->param_len =
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8303 SCSI_LOG_SENSE_SELFTEST_PARAM_LEN;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8304
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8305 status = entry->smart_selftest_log_status;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8306 status >>= 4;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8307 switch (status) {
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8308 case 0:
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8309 default:
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8310 sense_key = KEY_NO_SENSE;
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8311 add_sense_code =
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8312 SD_SCSI_ASC_NO_ADD_SENSE;
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8313 break;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8314 case 1:
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8315 sense_key = KEY_ABORTED_COMMAND;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8316 add_sense_code =
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8317 DIAGNOSTIC_FAILURE_ON_COMPONENT;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8318 add_sense_code_qual = SCSI_COMPONENT_81;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8319 break;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8320 case 2:
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8321 sense_key = KEY_ABORTED_COMMAND;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8322 add_sense_code =
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8323 DIAGNOSTIC_FAILURE_ON_COMPONENT;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8324 add_sense_code_qual = SCSI_COMPONENT_82;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8325 break;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8326 case 3:
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8327 sense_key = KEY_ABORTED_COMMAND;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8328 add_sense_code =
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8329 DIAGNOSTIC_FAILURE_ON_COMPONENT;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8330 add_sense_code_qual = SCSI_COMPONENT_83;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8331 break;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8332 case 4:
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8333 sense_key = KEY_HARDWARE_ERROR;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8334 add_sense_code =
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8335 DIAGNOSTIC_FAILURE_ON_COMPONENT;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8336 add_sense_code_qual = SCSI_COMPONENT_84;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8337 break;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8338 case 5:
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8339 sense_key = KEY_HARDWARE_ERROR;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8340 add_sense_code =
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8341 DIAGNOSTIC_FAILURE_ON_COMPONENT;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8342 add_sense_code_qual = SCSI_COMPONENT_85;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8343 break;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8344 case 6:
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8345 sense_key = KEY_HARDWARE_ERROR;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8346 add_sense_code =
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8347 DIAGNOSTIC_FAILURE_ON_COMPONENT;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8348 add_sense_code_qual = SCSI_COMPONENT_86;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8349 break;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8350 case 7:
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8351 sense_key = KEY_MEDIUM_ERROR;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8352 add_sense_code =
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8353 DIAGNOSTIC_FAILURE_ON_COMPONENT;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8354 add_sense_code_qual = SCSI_COMPONENT_87;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8355 break;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8356 case 8:
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8357 sense_key = KEY_HARDWARE_ERROR;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8358 add_sense_code =
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8359 DIAGNOSTIC_FAILURE_ON_COMPONENT;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8360 add_sense_code_qual = SCSI_COMPONENT_88;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8361 break;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8362 }
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8363 code = 0; /* unspecified */
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8364 status |= (code << 4);
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8365 lpp->param_values[0] = status;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8366 lpp->param_values[1] = 0; /* unspecified */
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8367 lpp->param_values[2] = entry->
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8368 smart_selftest_log_timestamp[1];
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8369 lpp->param_values[3] = entry->
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8370 smart_selftest_log_timestamp[0];
1940
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
8371 if (status != 0) {
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
8372 lpp->param_values[4] = 0;
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
8373 lpp->param_values[5] = 0;
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
8374 lpp->param_values[6] = 0;
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
8375 lpp->param_values[7] = 0;
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
8376 lpp->param_values[8] = entry->
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
8377 smart_selftest_log_failing_lba[3];
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
8378 lpp->param_values[9] = entry->
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
8379 smart_selftest_log_failing_lba[2];
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
8380 lpp->param_values[10] = entry->
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
8381 smart_selftest_log_failing_lba[1];
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
8382 lpp->param_values[11] = entry->
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
8383 smart_selftest_log_failing_lba[0];
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
8384 } else { /* No block address */
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
8385 lpp->param_values[4] = 0xff;
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
8386 lpp->param_values[5] = 0xff;
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
8387 lpp->param_values[6] = 0xff;
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
8388 lpp->param_values[7] = 0xff;
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
8389 lpp->param_values[8] = 0xff;
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
8390 lpp->param_values[9] = 0xff;
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
8391 lpp->param_values[10] = 0xff;
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
8392 lpp->param_values[11] = 0xff;
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
8393 }
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8394 lpp->param_values[12] = sense_key;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8395 lpp->param_values[13] = add_sense_code;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8396 lpp->param_values[14] = add_sense_code_qual;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8397 lpp->param_values[15] = 0; /* undefined */
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8398
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8399 lpp = (struct log_parameter *)
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8400 (((uint8_t *)lpp) +
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8401 SCSI_LOG_PARAM_HDR_LEN +
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8402 SCSI_LOG_SENSE_SELFTEST_PARAM_LEN);
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8403 --index; /* back up to previous entry */
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8404 if (index < 0) {
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8405 index =
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8406 NUM_SMART_SELFTEST_LOG_ENTRIES - 1;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8407 }
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8408 entry = &selftest_log->
4582
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
8409 smart_selftest_log_entries[index];
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8410 }
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8411 }
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8412 done:
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8413 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
8414 }
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8415
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8416 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
8417 SCSI_ENTRIES_IN_LOG_SENSE_SELFTEST_RESULTS);
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8418 }
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8419
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8420 /*
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8421 * 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
8422 * SCSI LOG SENSE page 0x2f (informational exceptions)
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8423 *
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8424 * 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
8425 * 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
8426 *
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8427 * 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
8428 *
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
8429 * 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
8430 * 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
8431 */
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8432 static int
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8433 sata_build_lsense_page_2f(
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8434 sata_drive_info_t *sdinfo,
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8435 uint8_t *buf,
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8436 sata_hba_inst_t *sata_hba_inst)
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8437 {
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8438 struct log_parameter *lpp = (struct log_parameter *)buf;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8439 int rval;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8440 uint8_t *smart_data;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8441 uint8_t temp;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8442 sata_id_t *sata_id;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8443 #define SMART_NO_TEMP 0xff
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8444
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8445 lpp->param_code[0] = 0;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8446 lpp->param_code[1] = 0;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8447 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
8448
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8449 /* 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
8450 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
8451 switch (rval) {
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8452 case 1:
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8453 lpp->param_values[0] = SCSI_PREDICTED_FAILURE;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8454 lpp->param_values[1] = SCSI_GENERAL_HD_FAILURE;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8455 break;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8456 case 0:
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8457 case -1: /* failed to get data */
1940
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
8458 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
8459 lpp->param_values[1] = 0;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8460 break;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8461 #if defined(SATA_DEBUG)
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8462 default:
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8463 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
8464 /* NOTREACHED */
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8465 #endif
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8466 }
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8467
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8468 sata_id = &sdinfo->satadrv_id;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8469 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
8470 temp = SMART_NO_TEMP;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8471 else {
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8472 /* Now get the temperature */
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8473 smart_data = kmem_zalloc(512, KM_SLEEP);
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8474 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
8475 SCT_STATUS_LOG_PAGE, 1);
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8476 if (rval == -1)
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8477 temp = SMART_NO_TEMP;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8478 else {
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8479 temp = smart_data[200];
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8480 if (temp & 0x80) {
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8481 if (temp & 0x7f)
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8482 temp = 0;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8483 else
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8484 temp = SMART_NO_TEMP;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8485 }
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8486 }
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8487 kmem_free(smart_data, 512);
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8488 }
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8489
1940
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
8490 lpp->param_values[2] = temp; /* most recent temperature */
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
8491 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
8492
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8493 lpp->param_len = SCSI_INFO_EXCEPTIONS_PARAM_LEN;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8494
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8495
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8496 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
8497 }
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8498
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8499 /*
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8500 * 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
8501 * 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
8502 *
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8503 * 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
8504 * 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
8505 *
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8506 * 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
8507 */
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8508 static int
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8509 sata_build_lsense_page_30(
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8510 sata_drive_info_t *sdinfo,
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8511 uint8_t *buf,
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8512 sata_hba_inst_t *sata_hba_inst)
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8513 {
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8514 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
8515 int rval;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8516
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8517 /* Now do the SMART READ DATA */
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8518 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
8519 if (rval == -1)
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8520 return (0);
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8521
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8522 return (sizeof (struct smart_data));
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8523 }
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8524
10131
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
8525 /*
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
8526 * sata_build_lsense_page_0e() is used to create the
10391
12b08c516444 6838603 Under heavy I/O load, all Seagate Dragonfly drives in an x4x40 go offline at the same time
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 10318
diff changeset
8527 * SCSI LOG SENSE page 0e (start-stop cycle counter page)
10131
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
8528 *
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
8529 * Date of Manufacture (0x0001)
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
8530 * YEAR = "0000"
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
8531 * WEEK = "00"
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
8532 * Accounting Date (0x0002)
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
8533 * 6 ASCII space character(20h)
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
8534 * Specified cycle count over device lifetime
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
8535 * 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
8536 * Accumulated start-stop cycles
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
8537 * VALUE - WORST - the accumulated cycles;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
8538 *
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
8539 * 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
8540 *
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
8541 * 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
8542 * 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
8543 *
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
8544 * 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
8545 */
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
8546 static int
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
8547 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
8548 sata_pkt_txlate_t *spx)
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
8549 {
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
8550 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
8551 int i, rval, index;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
8552 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
8553 uint32_t max_count, cycles;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
8554
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
8555 /* Now do the SMART READ DATA */
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
8556 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
8557 (struct smart_data *)smart_data);
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
8558 if (rval == -1)
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
8559 return (0);
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
8560 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
8561 index = (i * 12) + 2;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
8562 id = smart_data[index];
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
8563 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
8564 continue;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
8565 else {
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
8566 thresh = smart_data[index + 2];
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
8567 value = smart_data[index + 3];
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
8568 worst = smart_data[index + 4];
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
8569 break;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
8570 }
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
8571 }
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
8572 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
8573 return (0);
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
8574 max_count = value - thresh;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
8575 cycles = value - worst;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
8576
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
8577 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
8578 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
8579 log_page->code = 0x0e;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
8580 log_page->page_len_low = 0x24;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
8581
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
8582 log_page->manufactor_date_low = 0x1;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
8583 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
8584 log_page->param_len_1 = 0x06;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
8585 for (i = 0; i < 4; i++) {
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
8586 log_page->year_manu[i] = 0x30;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
8587 if (i < 2)
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
8588 log_page->week_manu[i] = 0x30;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
8589 }
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
8590
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
8591 log_page->account_date_low = 0x02;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
8592 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
8593 log_page->param_len_2 = 0x06;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
8594 for (i = 0; i < 4; i++) {
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
8595 log_page->year_account[i] = 0x20;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
8596 if (i < 2)
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
8597 log_page->week_account[i] = 0x20;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
8598 }
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
8599
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
8600 log_page->lifetime_code_low = 0x03;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
8601 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
8602 log_page->param_len_3 = 0x04;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
8603 /* 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
8604 log_page->cycle_code_low = 0x04;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
8605 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
8606 log_page->param_len_4 = 0x04;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
8607 /* 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
8608
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
8609 for (i = 0; i < 4; i++) {
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
8610 log_page->cycle_lifetime[i] =
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
8611 (max_count >> (8 * (3 - i))) & 0xff;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
8612 log_page->cycle_accumulated[i] =
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
8613 (cycles >> (8 * (3 - i))) & 0xff;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
8614 }
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
8615
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
8616 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
8617 }
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
8618
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
8619 /*
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
8620 * 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
8621 */
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
8622 static void
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
8623 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
8624 {
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
8625 scmd->satacmd_cmd_reg = SATAC_RDVER;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
8626 scmd->satacmd_addr_type = ATA_ADDR_LBA28;
10427
7d60ed90f743 6873542 forced core dump fails
Ada <Ada.Feng@Sun.COM>
parents: 10391
diff changeset
8627 scmd->satacmd_flags.sata_special_regs = B_TRUE;
10131
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
8628
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
8629 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
8630 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
8631 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
8632 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
8633 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
8634 scmd->satacmd_features_reg = 0;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
8635 scmd->satacmd_status_reg = 0;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
8636 scmd->satacmd_error_reg = 0;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
8637 }
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
8638
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
8639 /*
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
8640 * 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
8641 * 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
8642 * 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
8643 */
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
8644 static void
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
8645 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
8646 {
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
8647 scmd->satacmd_addr_type = 0;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
8648 scmd->satacmd_cmd_reg = cmd;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
8649 scmd->satacmd_device_reg = 0;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
8650 scmd->satacmd_sec_count_lsb = 0;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
8651 scmd->satacmd_lba_low_lsb = 0;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
8652 scmd->satacmd_lba_mid_lsb = 0;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
8653 scmd->satacmd_lba_high_lsb = 0;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
8654 scmd->satacmd_features_reg = 0;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
8655 scmd->satacmd_status_reg = 0;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
8656 scmd->satacmd_error_reg = 0;
10427
7d60ed90f743 6873542 forced core dump fails
Ada <Ada.Feng@Sun.COM>
parents: 10391
diff changeset
8657 scmd->satacmd_flags.sata_special_regs = B_TRUE;
10131
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
8658 }
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
8659
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
8660 /*
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
8661 * 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
8662 * timer format from SCSI to ATA.
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
8663 */
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
8664 static uint8_t
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
8665 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
8666 {
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
8667 uint32_t i = 0, count = 0;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
8668 uint8_t ata_count;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
8669
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
8670 for (i = 0; i < 4; i++) {
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
8671 count = count << 8 | timer[i];
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
8672 }
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
8673
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
8674 if (count == 0)
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
8675 return (0);
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
8676
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
8677 if (count >= 1 && count <= 12000)
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
8678 ata_count = (count -1) / 50 + 1;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
8679 else if (count > 12000 && count <= 12600)
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
8680 ata_count = 0xfc;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
8681 else if (count > 12601 && count <= 12750)
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
8682 ata_count = 0xff;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
8683 else if (count > 12750 && count <= 17999)
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
8684 ata_count = 0xf1;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
8685 else if (count > 18000 && count <= 198000)
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
8686 ata_count = count / 18000 + 240;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
8687 else
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
8688 ata_count = 0xfd;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
8689 return (ata_count);
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
8690 }
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
8691
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8692 /* ************************** ATAPI-SPECIFIC FUNCTIONS ********************** */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8693
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8694 /*
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8695 * Start command for ATAPI device.
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8696 * 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
8697 * Now CD/DVD, tape and ATAPI disk devices are supported.
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8698 * Most commands are packet without any translation into Packet Command.
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8699 * 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
8700 *
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8701 * Returns TRAN_ACCEPT if command is accepted for execution (or completed
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8702 * execution).
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8703 * 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
8704 * (see return values for sata_hba_start()).
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8705 *
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8706 * Note:
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8707 * Inquiry cdb format differs between transport version 2 and 3.
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8708 * 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
8709 * to the specification (ignored MSB of the allocation length). Therefore,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8710 * the transport version is not checked, but Inquiry allocation length is
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8711 * 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
8712 * target driver is greater than 255 bytes.
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8713 */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8714 static int
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8715 sata_txlt_atapi(sata_pkt_txlate_t *spx)
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8716 {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8717 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8718 sata_cmd_t *scmd = &spx->txlt_sata_pkt->satapkt_cmd;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8719 struct buf *bp = spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8720 sata_hba_inst_t *sata_hba = SATA_TXLT_HBA_INST(spx);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8721 sata_drive_info_t *sdinfo = sata_get_device_info(sata_hba,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8722 &spx->txlt_sata_pkt->satapkt_device);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8723 int cport = SATA_TXLT_CPORT(spx);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8724 int cdblen;
6591
75b7f3a8280a 6696291 system panic'd running 'format -e c6t4d0'
pawelw
parents: 6539
diff changeset
8725 int rval, reason;
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8726 int synch;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8727 union scsi_cdb *cdbp = (union scsi_cdb *)scsipkt->pkt_cdbp;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8728
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8729 mutex_enter(&(SATA_TXLT_CPORT_MUTEX(spx)));
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8730
11401
1b705ea0360c 6913126 system hang possible in sata hba after CR 6911155
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 11391
diff changeset
8731 if (((rval = sata_txlt_generic_pkt_info(spx, &reason, 0)) !=
6591
75b7f3a8280a 6696291 system panic'd running 'format -e c6t4d0'
pawelw
parents: 6539
diff changeset
8732 TRAN_ACCEPT) || (reason == CMD_DEV_GONE)) {
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8733 mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx)));
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8734 return (rval);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8735 }
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8736
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8737 /*
8010
95c42a8a213e 6703522 ahci driver needs to support SATA tape
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 7954
diff changeset
8738 * 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
8739 * 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
8740 * 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
8741 * 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
8742 *
95c42a8a213e 6703522 ahci driver needs to support SATA tape
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 7954
diff changeset
8743 * 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
8744 * 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
8745 * 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
8746 * 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
8747 *
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8748 */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8749
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8750 /* Check the size of cdb */
11598
e9303ae80b5d 6893171 Errors with USCSI preventing users from accessing cdda2wav
andrew.rutz@sun.com
parents: 11401
diff changeset
8751
e9303ae80b5d 6893171 Errors with USCSI preventing users from accessing cdda2wav
andrew.rutz@sun.com
parents: 11401
diff changeset
8752 switch (GETGROUP(cdbp)) {
e9303ae80b5d 6893171 Errors with USCSI preventing users from accessing cdda2wav
andrew.rutz@sun.com
parents: 11401
diff changeset
8753 case CDB_GROUPID_3: /* Reserved, per SPC-4 */
e9303ae80b5d 6893171 Errors with USCSI preventing users from accessing cdda2wav
andrew.rutz@sun.com
parents: 11401
diff changeset
8754 /*
e9303ae80b5d 6893171 Errors with USCSI preventing users from accessing cdda2wav
andrew.rutz@sun.com
parents: 11401
diff changeset
8755 * opcodes 0x7e and 0x7f identify variable-length CDBs and
e9303ae80b5d 6893171 Errors with USCSI preventing users from accessing cdda2wav
andrew.rutz@sun.com
parents: 11401
diff changeset
8756 * therefore require special handling. Return failure, for now.
e9303ae80b5d 6893171 Errors with USCSI preventing users from accessing cdda2wav
andrew.rutz@sun.com
parents: 11401
diff changeset
8757 */
e9303ae80b5d 6893171 Errors with USCSI preventing users from accessing cdda2wav
andrew.rutz@sun.com
parents: 11401
diff changeset
8758 mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx)));
e9303ae80b5d 6893171 Errors with USCSI preventing users from accessing cdda2wav
andrew.rutz@sun.com
parents: 11401
diff changeset
8759 return (TRAN_BADPKT);
e9303ae80b5d 6893171 Errors with USCSI preventing users from accessing cdda2wav
andrew.rutz@sun.com
parents: 11401
diff changeset
8760
e9303ae80b5d 6893171 Errors with USCSI preventing users from accessing cdda2wav
andrew.rutz@sun.com
parents: 11401
diff changeset
8761 case CDB_GROUPID_6: /* Vendor-specific, per SPC-4 */
e9303ae80b5d 6893171 Errors with USCSI preventing users from accessing cdda2wav
andrew.rutz@sun.com
parents: 11401
diff changeset
8762 case CDB_GROUPID_7: /* Vendor-specific, per SPC-4 */
e9303ae80b5d 6893171 Errors with USCSI preventing users from accessing cdda2wav
andrew.rutz@sun.com
parents: 11401
diff changeset
8763 /* obtain length from the scsi_pkt */
e9303ae80b5d 6893171 Errors with USCSI preventing users from accessing cdda2wav
andrew.rutz@sun.com
parents: 11401
diff changeset
8764 cdblen = scsipkt->pkt_cdblen;
e9303ae80b5d 6893171 Errors with USCSI preventing users from accessing cdda2wav
andrew.rutz@sun.com
parents: 11401
diff changeset
8765 break;
e9303ae80b5d 6893171 Errors with USCSI preventing users from accessing cdda2wav
andrew.rutz@sun.com
parents: 11401
diff changeset
8766
e9303ae80b5d 6893171 Errors with USCSI preventing users from accessing cdda2wav
andrew.rutz@sun.com
parents: 11401
diff changeset
8767 default:
e9303ae80b5d 6893171 Errors with USCSI preventing users from accessing cdda2wav
andrew.rutz@sun.com
parents: 11401
diff changeset
8768 /* CDB's length is statically known, per SPC-4 */
e9303ae80b5d 6893171 Errors with USCSI preventing users from accessing cdda2wav
andrew.rutz@sun.com
parents: 11401
diff changeset
8769 cdblen = scsi_cdb_size[GETGROUP(cdbp)];
e9303ae80b5d 6893171 Errors with USCSI preventing users from accessing cdda2wav
andrew.rutz@sun.com
parents: 11401
diff changeset
8770 break;
e9303ae80b5d 6893171 Errors with USCSI preventing users from accessing cdda2wav
andrew.rutz@sun.com
parents: 11401
diff changeset
8771 }
e9303ae80b5d 6893171 Errors with USCSI preventing users from accessing cdda2wav
andrew.rutz@sun.com
parents: 11401
diff changeset
8772
e9303ae80b5d 6893171 Errors with USCSI preventing users from accessing cdda2wav
andrew.rutz@sun.com
parents: 11401
diff changeset
8773 if (cdblen <= 0 || cdblen > sdinfo->satadrv_atapi_cdb_len) {
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8774 sata_log(NULL, CE_WARN,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8775 "sata: invalid ATAPI cdb length %d",
11598
e9303ae80b5d 6893171 Errors with USCSI preventing users from accessing cdda2wav
andrew.rutz@sun.com
parents: 11401
diff changeset
8776 cdblen);
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8777 mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx)));
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8778 return (TRAN_BADPKT);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8779 }
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8780
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8781 SATAATAPITRACE(spx, cdblen);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8782
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8783 /*
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8784 * For non-read/write commands we need to
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8785 * map buffer
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8786 */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8787 switch ((uint_t)scsipkt->pkt_cdbp[0]) {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8788 case SCMD_READ:
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8789 case SCMD_READ_G1:
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8790 case SCMD_READ_G5:
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8791 case SCMD_READ_G4:
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8792 case SCMD_WRITE:
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8793 case SCMD_WRITE_G1:
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8794 case SCMD_WRITE_G5:
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8795 case SCMD_WRITE_G4:
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8796 break;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8797 default:
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8798 if (bp != NULL) {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8799 if (bp->b_flags & (B_PHYS | B_PAGEIO))
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8800 bp_mapin(bp);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8801 }
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8802 break;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8803 }
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8804 /*
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8805 * scmd->satacmd_flags.sata_data_direction default -
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8806 * SATA_DIR_NODATA_XFER - is set by
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8807 * sata_txlt_generic_pkt_info().
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8808 */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8809 if (scmd->satacmd_bp) {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8810 if (scmd->satacmd_bp->b_flags & B_READ) {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8811 scmd->satacmd_flags.sata_data_direction = SATA_DIR_READ;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8812 } else {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8813 scmd->satacmd_flags.sata_data_direction =
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8814 SATA_DIR_WRITE;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8815 }
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8816 }
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8817
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8818 /*
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8819 * Set up ATAPI packet command.
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8820 */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8821
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8822 sata_atapi_packet_cmd_setup(scmd, sdinfo);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8823
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8824 /* Copy cdb into sata_cmd */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8825 scmd->satacmd_acdb_len = sdinfo->satadrv_atapi_cdb_len;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8826 bzero(scmd->satacmd_acdb, SATA_ATAPI_MAX_CDB_LEN);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8827 bcopy(cdbp, scmd->satacmd_acdb, cdblen);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8828
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8829 /* See note in the command header */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8830 if (scmd->satacmd_acdb[0] == SCMD_INQUIRY) {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8831 if (scmd->satacmd_acdb[3] != 0)
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8832 scmd->satacmd_acdb[4] = 255;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8833 }
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8834
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8835 #ifdef SATA_DEBUG
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8836 if (sata_debug_flags & SATA_DBG_ATAPI) {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8837 uint8_t *p = scmd->satacmd_acdb;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8838 char buf[3 * SATA_ATAPI_MAX_CDB_LEN];
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8839
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8840 (void) snprintf(buf, SATA_ATAPI_MAX_CDB_LEN,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8841 "%02x %02x %02x %02x %02x %02x %02x %02x "
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8842 "%2x %02x %02x %02x %02x %02x %02x %02x",
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8843 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
8844 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
8845 buf[(3 * SATA_ATAPI_MAX_CDB_LEN) - 1] = '\0';
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8846 cmn_err(CE_NOTE, "ATAPI cdb: %s\n", buf);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8847 }
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8848 #endif
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8849
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8850 /*
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8851 * Preset request sense data to NO SENSE.
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8852 * 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
8853 * 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
8854 * but it could be returned as is.
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8855 */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8856 bzero(scmd->satacmd_rqsense, SATA_ATAPI_RQSENSE_LEN);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8857 sata_fixed_sense_data_preset(
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8858 (struct scsi_extended_sense *)scmd->satacmd_rqsense);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8859
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8860 if (!(spx->txlt_sata_pkt->satapkt_op_mode & SATA_OPMODE_SYNCH)) {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8861 /* Need callback function */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8862 spx->txlt_sata_pkt->satapkt_comp = sata_txlt_atapi_completion;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8863 synch = FALSE;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8864 } else
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8865 synch = TRUE;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8866
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8867 /* Transfer command to HBA */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8868 if (sata_hba_start(spx, &rval) != 0) {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8869 /* Pkt not accepted for execution */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8870 mutex_exit(&SATA_CPORT_MUTEX(sata_hba, cport));
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8871 return (rval);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8872 }
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8873 mutex_exit(&SATA_CPORT_MUTEX(sata_hba, cport));
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8874 /*
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8875 * If execution is non-synchronous,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8876 * a callback function will handle potential errors, translate
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8877 * the response and will do a callback to a target driver.
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8878 * If it was synchronous, use the same framework callback to check
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8879 * an execution status.
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8880 */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8881 if (synch) {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8882 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8883 "synchronous execution status %x\n",
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8884 spx->txlt_sata_pkt->satapkt_reason);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8885 sata_txlt_atapi_completion(spx->txlt_sata_pkt);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8886 }
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8887 return (TRAN_ACCEPT);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8888 }
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8889
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8890
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8891 /*
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8892 * ATAPI Packet command completion.
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8893 *
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8894 * Failure of the command passed via Packet command are considered device
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8895 * 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
8896 * Sense command delivered via error retrieval sata packet) and copy it
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8897 * 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
8898 */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8899 static void
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8900 sata_txlt_atapi_completion(sata_pkt_t *sata_pkt)
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8901 {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8902 sata_pkt_txlate_t *spx =
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8903 (sata_pkt_txlate_t *)sata_pkt->satapkt_framework_private;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8904 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8905 struct scsi_extended_sense *sense;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8906 struct buf *bp;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8907 int rval;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8908
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8909 #ifdef SATA_DEBUG
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8910 uint8_t *rqsp = sata_pkt->satapkt_cmd.satacmd_rqsense;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8911 #endif
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8912
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8913 scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8914 STATE_SENT_CMD | STATE_GOT_STATUS;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8915
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8916 if (sata_pkt->satapkt_reason == SATA_PKT_COMPLETED) {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8917 /* Normal completion */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8918 if (sata_pkt->satapkt_cmd.satacmd_bp != NULL)
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8919 scsipkt->pkt_state |= STATE_XFERRED_DATA;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8920 scsipkt->pkt_reason = CMD_CMPLT;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8921 *scsipkt->pkt_scbp = STATUS_GOOD;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8922 if (spx->txlt_tmp_buf != NULL) {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8923 /* Temporary buffer was used */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8924 bp = spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8925 if (bp->b_flags & B_READ) {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8926 rval = ddi_dma_sync(
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8927 spx->txlt_buf_dma_handle, 0, 0,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8928 DDI_DMA_SYNC_FORCPU);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8929 ASSERT(rval == DDI_SUCCESS);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8930 bcopy(spx->txlt_tmp_buf, bp->b_un.b_addr,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8931 bp->b_bcount);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8932 }
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8933 }
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8934 } else {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8935 /*
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8936 * Something went wrong - analyze return
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8937 */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8938 *scsipkt->pkt_scbp = STATUS_CHECK;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8939 sense = sata_arq_sense(spx);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8940
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8941 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
8942 /*
95c42a8a213e 6703522 ahci driver needs to support SATA tape
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 7954
diff changeset
8943 * 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
8944 * 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
8945 * 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
8946 *
95c42a8a213e 6703522 ahci driver needs to support SATA tape
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 7954
diff changeset
8947 * 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
8948 * is used.
95c42a8a213e 6703522 ahci driver needs to support SATA tape
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 7954
diff changeset
8949 */
95c42a8a213e 6703522 ahci driver needs to support SATA tape
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 7954
diff changeset
8950 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
8951
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8952 /*
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8953 * We may not have ARQ data if there was a double
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8954 * error. But sense data in sata packet was pre-set
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8955 * with NO SENSE so it is valid even if HBA could
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8956 * not retrieve a real sense data.
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8957 * Just copy this sense data into scsi pkt sense area.
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8958 */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8959 bcopy(sata_pkt->satapkt_cmd.satacmd_rqsense, sense,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8960 SATA_ATAPI_MIN_RQSENSE_LEN);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8961 #ifdef SATA_DEBUG
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8962 if (sata_debug_flags & SATA_DBG_SCSI_IF) {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8963 sata_log(spx->txlt_sata_hba_inst, CE_WARN,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8964 "sata_txlt_atapi_completion: %02x\n"
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8965 "RQSENSE: %02x %02x %02x %02x %02x %02x "
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8966 " %02x %02x %02x %02x %02x %02x "
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8967 " %02x %02x %02x %02x %02x %02x\n",
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8968 scsipkt->pkt_reason,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8969 rqsp[0], rqsp[1], rqsp[2], rqsp[3],
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8970 rqsp[4], rqsp[5], rqsp[6], rqsp[7],
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8971 rqsp[8], rqsp[9], rqsp[10], rqsp[11],
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8972 rqsp[12], rqsp[13], rqsp[14], rqsp[15],
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8973 rqsp[16], rqsp[17]);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8974 }
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8975 #endif
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8976 } else {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8977 switch (sata_pkt->satapkt_reason) {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8978 case SATA_PKT_PORT_ERROR:
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8979 /*
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8980 * We have no device data.
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8981 */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8982 scsipkt->pkt_reason = CMD_INCOMPLETE;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8983 scsipkt->pkt_state &= ~(STATE_GOT_BUS |
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8984 STATE_GOT_TARGET | STATE_SENT_CMD |
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8985 STATE_GOT_STATUS);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8986 sense->es_key = KEY_HARDWARE_ERROR;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8987 break;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8988
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8989 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
8990 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
8991 scsipkt->pkt_statistics |=
46361481707a 6630713 x4500: Multiple (sdxx), "Error for Command", and "Error Block" errors seen in messages file.
ls24207
parents: 5832
diff changeset
8992 STAT_TIMEOUT | STAT_DEV_RESET;
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8993 /*
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8994 * Need to check if HARDWARE_ERROR/
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8995 * TIMEOUT_ON_LOGICAL_UNIT 4/3E/2 would be more
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8996 * appropriate.
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8997 */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8998 break;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
8999
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9000 case SATA_PKT_ABORTED:
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9001 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
9002 scsipkt->pkt_statistics |= STAT_ABORTED;
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9003 /* Should we set key COMMAND_ABPRTED? */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9004 break;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9005
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9006 case SATA_PKT_RESET:
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9007 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
9008 scsipkt->pkt_statistics |= STAT_DEV_RESET;
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9009 /*
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9010 * May be we should set Unit Attention /
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9011 * Reset. Perhaps the same should be
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9012 * returned for disks....
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9013 */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9014 sense->es_key = KEY_UNIT_ATTENTION;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9015 sense->es_add_code = SD_SCSI_ASC_RESET;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9016 break;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9017
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9018 default:
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9019 SATA_LOG_D((spx->txlt_sata_hba_inst, CE_WARN,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9020 "sata_txlt_atapi_completion: "
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9021 "invalid packet completion reason"));
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9022 scsipkt->pkt_reason = CMD_TRAN_ERR;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9023 scsipkt->pkt_state &= ~(STATE_GOT_BUS |
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9024 STATE_GOT_TARGET | STATE_SENT_CMD |
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9025 STATE_GOT_STATUS);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9026 break;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9027 }
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9028 }
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9029 }
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9030
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9031 SATAATAPITRACE(spx, 0);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9032
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9033 if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0 &&
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9034 scsipkt->pkt_comp != NULL) {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9035 /* scsi callback required */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9036 (*scsipkt->pkt_comp)(scsipkt);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9037 }
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9038 }
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9039
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9040 /*
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9041 * 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
9042 * recovery.
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9043 *
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9044 * 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
9045 * returns SATA_FAILURE otherwise.
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9046 */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9047
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9048 static int
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9049 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
9050 {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9051 sata_pkt_t *spkt = spx->txlt_sata_pkt;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9052 sata_cmd_t *scmd;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9053 struct buf *bp;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9054
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9055 /*
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9056 * Allocate dma-able buffer error data.
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9057 * Buffer allocation will take care of buffer alignment and other DMA
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9058 * attributes.
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9059 */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9060 bp = sata_alloc_local_buffer(spx, SATA_ATAPI_MIN_RQSENSE_LEN);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9061 if (bp == NULL) {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9062 SATADBG1(SATA_DBG_ATAPI, spx->txlt_sata_hba_inst,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9063 "sata_get_err_retrieval_pkt: "
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9064 "cannot allocate buffer for error data", NULL);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9065 return (SATA_FAILURE);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9066 }
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9067 bp_mapin(bp); /* make data buffer accessible */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9068
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9069 /* Operation modes are up to the caller */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9070 spkt->satapkt_op_mode = SATA_OPMODE_SYNCH | SATA_OPMODE_INTERRUPTS;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9071
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9072 /* Synchronous mode, no callback - may be changed by the caller */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9073 spkt->satapkt_comp = NULL;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9074 spkt->satapkt_time = sata_default_pkt_time;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9075
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9076 scmd = &spkt->satapkt_cmd;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9077 scmd->satacmd_flags.sata_data_direction = SATA_DIR_READ;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9078 scmd->satacmd_flags.sata_ignore_dev_reset = B_TRUE;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9079
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9080 sata_atapi_packet_cmd_setup(scmd, sdinfo);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9081
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9082 /*
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9083 * Set-up acdb. Request Sense CDB (packet command content) is
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9084 * not in DMA-able buffer. Its handling is HBA-specific (how
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9085 * it is transfered into packet FIS).
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9086 */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9087 scmd->satacmd_acdb_len = sdinfo->satadrv_atapi_cdb_len;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9088 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
9089 /* Following zeroing of pad bytes may not be necessary */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9090 bzero(&scmd->satacmd_acdb[SATA_ATAPI_RQSENSE_CDB_LEN],
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9091 sdinfo->satadrv_atapi_cdb_len - SATA_ATAPI_RQSENSE_CDB_LEN);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9092
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9093 /*
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9094 * 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
9095 * before accessing it. Handle is in usual place in translate struct.
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9096 */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9097 scmd->satacmd_err_ret_buf_handle = &spx->txlt_buf_dma_handle;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9098
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9099 /*
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9100 * Preset request sense data to NO SENSE.
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9101 * Here it is redundant, only for a symetry with scsi-originated
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9102 * packets. It should not be used for anything but debugging.
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9103 */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9104 bzero(scmd->satacmd_rqsense, SATA_ATAPI_RQSENSE_LEN);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9105 sata_fixed_sense_data_preset(
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9106 (struct scsi_extended_sense *)scmd->satacmd_rqsense);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9107
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9108 ASSERT(scmd->satacmd_num_dma_cookies != 0);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9109 ASSERT(scmd->satacmd_dma_cookie_list != NULL);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9110
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9111 return (SATA_SUCCESS);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9112 }
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9113
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9114 /*
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9115 * Set-up ATAPI packet command.
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9116 * 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
9117 * calling this function.
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9118 *
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9119 * Returns void
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9120 */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9121
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9122 static void
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9123 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
9124 {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9125 scmd->satacmd_addr_type = 0; /* N/A */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9126 scmd->satacmd_sec_count_lsb = 0; /* no tag */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9127 scmd->satacmd_lba_low_lsb = 0; /* N/A */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9128 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
9129 scmd->satacmd_lba_high_lsb =
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9130 (uint8_t)(SATA_ATAPI_MAX_BYTES_PER_DRQ >> 8);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9131 scmd->satacmd_cmd_reg = SATAC_PACKET; /* Command */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9132
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9133 /*
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9134 * We want all data to be transfered via DMA.
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9135 * 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
9136 * selected - some drives are sensitive about it.
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9137 * Hopefully it wil work for all drives....
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9138 */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9139 if (sdinfo->satadrv_settings & SATA_DEV_DMA)
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9140 scmd->satacmd_features_reg = SATA_ATAPI_F_DMA;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9141
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9142 /*
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9143 * Features register requires special care for devices that use
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9144 * Serial ATA bridge - they need an explicit specification of
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9145 * the data transfer direction for Packet DMA commands.
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9146 * Setting this bit is harmless if DMA is not used.
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9147 *
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9148 * Many drives do not implement word 80, specifying what ATA/ATAPI
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9149 * spec they follow.
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9150 * We are arbitrarily following the latest SerialATA 2.6 spec,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9151 * which uses ATA/ATAPI 6 specification for Identify Data, unless
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9152 * ATA/ATAPI-7 support is explicitly indicated.
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9153 */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9154 if (sdinfo->satadrv_id.ai_majorversion != 0 &&
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9155 sdinfo->satadrv_id.ai_majorversion != 0xffff &&
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9156 (sdinfo->satadrv_id.ai_majorversion & SATA_MAJVER_7) != 0) {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9157 /*
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9158 * Specification of major version is valid and version 7
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9159 * is supported. It does automatically imply that all
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9160 * spec features are supported. For now, we assume that
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9161 * DMADIR setting is valid. ATA/ATAPI7 spec is incomplete.
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9162 */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9163 if ((sdinfo->satadrv_id.ai_dirdma &
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9164 SATA_ATAPI_ID_DMADIR_REQ) != 0) {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9165 if (scmd->satacmd_flags.sata_data_direction ==
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9166 SATA_DIR_READ)
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9167 scmd->satacmd_features_reg |=
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9168 SATA_ATAPI_F_DATA_DIR_READ;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9169 }
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9170 }
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9171 }
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9172
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9173
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9174 #ifdef SATA_DEBUG
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9175
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9176 /* Display 18 bytes of Inquiry data */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9177 static void
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9178 sata_show_inqry_data(uint8_t *buf)
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9179 {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9180 struct scsi_inquiry *inq = (struct scsi_inquiry *)buf;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9181 uint8_t *p;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9182
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9183 cmn_err(CE_NOTE, "Inquiry data:");
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9184 cmn_err(CE_NOTE, "device type %x", inq->inq_dtype);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9185 cmn_err(CE_NOTE, "removable media %x", inq->inq_rmb);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9186 cmn_err(CE_NOTE, "version %x", inq->inq_ansi);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9187 cmn_err(CE_NOTE, "ATAPI transport version %d",
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9188 SATA_ATAPI_TRANS_VERSION(inq));
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9189 cmn_err(CE_NOTE, "response data format %d, aenc %d",
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9190 inq->inq_rdf, inq->inq_aenc);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9191 cmn_err(CE_NOTE, " additional length %d", inq->inq_len);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9192 cmn_err(CE_NOTE, "tpgs %d", inq->inq_tpgs);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9193 p = (uint8_t *)inq->inq_vid;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9194 cmn_err(CE_NOTE, "vendor id (binary): %02x %02x %02x %02x "
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9195 "%02x %02x %02x %02x",
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9196 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
9197 p = (uint8_t *)inq->inq_vid;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9198 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
9199 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
9200
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9201 p = (uint8_t *)inq->inq_pid;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9202 cmn_err(CE_NOTE, "product id (binary): %02x %02x %02x %02x "
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9203 "%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
9204 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
9205 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
9206 p = (uint8_t *)inq->inq_pid;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9207 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
9208 "%c %c %c %c %c %c %c %c",
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9209 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
9210 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
9211
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9212 p = (uint8_t *)inq->inq_revision;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9213 cmn_err(CE_NOTE, "revision (binary): %02x %02x %02x %02x",
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9214 p[0], p[1], p[2], p[3]);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9215 p = (uint8_t *)inq->inq_revision;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9216 cmn_err(CE_NOTE, "revision: %c %c %c %c",
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9217 p[0], p[1], p[2], p[3]);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9218
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9219 }
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9220
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9221
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9222 static void
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9223 sata_save_atapi_trace(sata_pkt_txlate_t *spx, int count)
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9224 {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9225 struct scsi_pkt *scsi_pkt = spx->txlt_scsi_pkt;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9226
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9227 if (scsi_pkt == NULL)
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9228 return;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9229 if (count != 0) {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9230 /* saving cdb */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9231 bzero(sata_atapi_trace[sata_atapi_trace_index].acdb,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9232 SATA_ATAPI_MAX_CDB_LEN);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9233 bcopy(scsi_pkt->pkt_cdbp,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9234 sata_atapi_trace[sata_atapi_trace_index].acdb, count);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9235 } else {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9236 bcopy(&((struct scsi_arq_status *)scsi_pkt->pkt_scbp)->
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9237 sts_sensedata,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9238 sata_atapi_trace[sata_atapi_trace_index].arqs,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9239 SATA_ATAPI_MIN_RQSENSE_LEN);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9240 sata_atapi_trace[sata_atapi_trace_index].scsi_pkt_reason =
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9241 scsi_pkt->pkt_reason;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9242 sata_atapi_trace[sata_atapi_trace_index].sata_pkt_reason =
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9243 spx->txlt_sata_pkt->satapkt_reason;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9244
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9245 if (++sata_atapi_trace_index >= 64)
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9246 sata_atapi_trace_index = 0;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9247 }
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9248 }
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9249
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9250 #endif
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9251
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9252 /*
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9253 * Fetch inquiry data from ATAPI device
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9254 * Returns SATA_SUCCESS if operation was successfull, SATA_FAILURE otherwise.
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9255 *
5014
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
9256 * Note:
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
9257 * 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
9258 * where the caller expects to see the inquiry data.
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9259 *
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9260 */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9261
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9262 static int
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9263 sata_get_atapi_inquiry_data(sata_hba_inst_t *sata_hba,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9264 sata_address_t *saddr, struct scsi_inquiry *inq)
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9265 {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9266 sata_pkt_txlate_t *spx;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9267 sata_pkt_t *spkt;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9268 struct buf *bp;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9269 sata_drive_info_t *sdinfo;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9270 sata_cmd_t *scmd;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9271 int rval;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9272 uint8_t *rqsp;
5014
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
9273 #ifdef SATA_DEBUG
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
9274 char msg_buf[MAXPATHLEN];
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
9275 #endif
4862
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 ASSERT(sata_hba != NULL);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9278
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9279 spx = kmem_zalloc(sizeof (sata_pkt_txlate_t), KM_SLEEP);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9280 spx->txlt_sata_hba_inst = sata_hba;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9281 spx->txlt_scsi_pkt = NULL; /* No scsi pkt involved */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9282 spkt = sata_pkt_alloc(spx, NULL);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9283 if (spkt == NULL) {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9284 kmem_free(spx, sizeof (sata_pkt_txlate_t));
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9285 return (SATA_FAILURE);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9286 }
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9287 /* address is needed now */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9288 spkt->satapkt_device.satadev_addr = *saddr;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9289
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9290 /* scsi_inquiry size buffer */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9291 bp = sata_alloc_local_buffer(spx, sizeof (struct scsi_inquiry));
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9292 if (bp == NULL) {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9293 sata_pkt_free(spx);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9294 kmem_free(spx, sizeof (sata_pkt_txlate_t));
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9295 SATA_LOG_D((sata_hba, CE_WARN,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9296 "sata_get_atapi_inquiry_data: "
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9297 "cannot allocate data buffer"));
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9298 return (SATA_FAILURE);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9299 }
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9300 bp_mapin(bp); /* make data buffer accessible */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9301
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9302 scmd = &spkt->satapkt_cmd;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9303 ASSERT(scmd->satacmd_num_dma_cookies != 0);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9304 ASSERT(scmd->satacmd_dma_cookie_list != NULL);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9305
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9306 /* Use synchronous mode */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9307 spkt->satapkt_op_mode = SATA_OPMODE_SYNCH | SATA_OPMODE_INTERRUPTS;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9308 spkt->satapkt_comp = NULL;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9309 spkt->satapkt_time = sata_default_pkt_time;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9310
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9311 /* Issue inquiry command - 6 bytes cdb, data transfer, read */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9312
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9313 scmd->satacmd_flags.sata_data_direction = SATA_DIR_READ;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9314 scmd->satacmd_flags.sata_ignore_dev_reset = B_TRUE;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9315
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9316 mutex_enter(&(SATA_TXLT_CPORT_MUTEX(spx)));
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9317 sdinfo = sata_get_device_info(sata_hba,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9318 &spx->txlt_sata_pkt->satapkt_device);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9319 if (sdinfo == NULL) {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9320 /* we have to be carefull about the disapearing device */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9321 mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx)));
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9322 rval = SATA_FAILURE;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9323 goto cleanup;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9324 }
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9325 sata_atapi_packet_cmd_setup(scmd, sdinfo);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9326
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9327 /*
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9328 * 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
9329 */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9330 scmd->satacmd_acdb_len = sdinfo->satadrv_atapi_cdb_len;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9331 bzero(scmd->satacmd_acdb, SATA_ATAPI_MAX_CDB_LEN);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9332 scmd->satacmd_acdb[0] = 0x12; /* Inquiry */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9333 scmd->satacmd_acdb[1] = 0x00;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9334 scmd->satacmd_acdb[2] = 0x00;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9335 scmd->satacmd_acdb[3] = 0x00;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9336 scmd->satacmd_acdb[4] = sizeof (struct scsi_inquiry);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9337 scmd->satacmd_acdb[5] = 0x00;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9338
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9339 sata_fixed_sense_data_preset(
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9340 (struct scsi_extended_sense *)scmd->satacmd_rqsense);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9341
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9342 /* Transfer command to HBA */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9343 if (sata_hba_start(spx, &rval) != 0) {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9344 /* Pkt not accepted for execution */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9345 SATADBG1(SATA_DBG_ATAPI, sata_hba,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9346 "sata_get_atapi_inquiry_data: "
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9347 "Packet not accepted for execution - ret: %02x", rval);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9348 mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx)));
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9349 rval = SATA_FAILURE;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9350 goto cleanup;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9351 }
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9352 mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx)));
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9353
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9354 if (spkt->satapkt_reason == SATA_PKT_COMPLETED) {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9355 SATADBG1(SATA_DBG_ATAPI, sata_hba,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9356 "sata_get_atapi_inquiry_data: "
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9357 "Packet completed successfully - ret: %02x", rval);
7152
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
9358 if (spx->txlt_buf_dma_handle != NULL) {
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
9359 /*
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
9360 * Sync buffer. Handle is in usual place in translate
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
9361 * struct.
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
9362 */
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
9363 rval = ddi_dma_sync(spx->txlt_buf_dma_handle, 0, 0,
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
9364 DDI_DMA_SYNC_FORCPU);
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
9365 ASSERT(rval == DDI_SUCCESS);
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
9366 }
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
9367 /*
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9368 * Normal completion - copy data into caller's buffer
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 bcopy(bp->b_un.b_addr, (uint8_t *)inq,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9371 sizeof (struct scsi_inquiry));
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9372 #ifdef SATA_DEBUG
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9373 if (sata_debug_flags & SATA_DBG_ATAPI) {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9374 sata_show_inqry_data((uint8_t *)inq);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9375 }
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9376 #endif
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9377 rval = SATA_SUCCESS;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9378 } else {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9379 /*
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9380 * Something went wrong - analyze return - check rqsense data
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9381 */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9382 rval = SATA_FAILURE;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9383 if (spkt->satapkt_reason == SATA_PKT_DEV_ERROR) {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9384 /*
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9385 * ARQ data hopefull show something other than NO SENSE
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9386 */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9387 rqsp = scmd->satacmd_rqsense;
5014
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
9388 #ifdef SATA_DEBUG
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
9389 if (sata_debug_flags & SATA_DBG_ATAPI) {
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
9390 msg_buf[0] = '\0';
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
9391 (void) snprintf(msg_buf, MAXPATHLEN,
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
9392 "ATAPI packet completion reason: %02x\n"
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
9393 "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
9394 " %02x %02x %02x %02x %02x %02x\n"
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
9395 " %02x %02x %02x %02x %02x %02x",
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
9396 spkt->satapkt_reason,
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
9397 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
9398 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
9399 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
9400 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
9401 rqsp[16], rqsp[17]);
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
9402 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
9403 "%s", msg_buf);
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
9404 }
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
9405 #endif
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9406 } else {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9407 switch (spkt->satapkt_reason) {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9408 case SATA_PKT_PORT_ERROR:
5014
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
9409 SATADBG1(SATA_DBG_ATAPI, sata_hba,
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9410 "sata_get_atapi_inquiry_data: "
5014
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
9411 "packet reason: port error", NULL);
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9412 break;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9413
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9414 case SATA_PKT_TIMEOUT:
5014
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
9415 SATADBG1(SATA_DBG_ATAPI, sata_hba,
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9416 "sata_get_atapi_inquiry_data: "
5014
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
9417 "packet reason: timeout", NULL);
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9418 break;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9419
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9420 case SATA_PKT_ABORTED:
5014
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
9421 SATADBG1(SATA_DBG_ATAPI, sata_hba,
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9422 "sata_get_atapi_inquiry_data: "
5014
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
9423 "packet reason: aborted", NULL);
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9424 break;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9425
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9426 case SATA_PKT_RESET:
5014
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
9427 SATADBG1(SATA_DBG_ATAPI, sata_hba,
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9428 "sata_get_atapi_inquiry_data: "
5014
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
9429 "packet reason: reset\n", NULL);
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9430 break;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9431 default:
5014
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
9432 SATADBG1(SATA_DBG_ATAPI, sata_hba,
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9433 "sata_get_atapi_inquiry_data: "
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9434 "invalid packet reason: %02x\n",
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9435 spkt->satapkt_reason);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9436 break;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9437 }
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9438 }
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9439 }
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9440 cleanup:
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9441 sata_free_local_buffer(spx);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9442 sata_pkt_free(spx);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9443 kmem_free(spx, sizeof (sata_pkt_txlate_t));
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9444 return (rval);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9445 }
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9446
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9447
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9448
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9449
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9450
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9451 #if 0
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9452 #ifdef SATA_DEBUG
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9453
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9454 /*
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9455 * Test ATAPI packet command.
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9456 * Single threaded test: send packet command in synch mode, process completion
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9457 *
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9458 */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9459 static void
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9460 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
9461 {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9462 sata_pkt_txlate_t *spx;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9463 sata_pkt_t *spkt;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9464 struct buf *bp;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9465 sata_device_t sata_device;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9466 sata_drive_info_t *sdinfo;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9467 sata_cmd_t *scmd;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9468 int rval;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9469 uint8_t *rqsp;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9470
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9471 ASSERT(sata_hba_inst != NULL);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9472 sata_device.satadev_addr.cport = cport;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9473 sata_device.satadev_addr.pmport = 0;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9474 sata_device.satadev_addr.qual = SATA_ADDR_DCPORT;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9475 sata_device.satadev_rev = SATA_DEVICE_REV;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9476 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9477 sdinfo = sata_get_device_info(sata_hba_inst, &sata_device);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9478 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9479 if (sdinfo == NULL) {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9480 sata_log(sata_hba_inst, CE_WARN,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9481 "sata_test_atapi_packet_command: "
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9482 "no device info for cport %d",
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9483 sata_device.satadev_addr.cport);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9484 return;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9485 }
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9486
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9487 spx = kmem_zalloc(sizeof (sata_pkt_txlate_t), KM_SLEEP);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9488 spx->txlt_sata_hba_inst = sata_hba_inst;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9489 spx->txlt_scsi_pkt = NULL; /* No scsi pkt involved */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9490 spkt = sata_pkt_alloc(spx, NULL);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9491 if (spkt == NULL) {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9492 kmem_free(spx, sizeof (sata_pkt_txlate_t));
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9493 return;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9494 }
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9495 /* address is needed now */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9496 spkt->satapkt_device.satadev_addr = sata_device.satadev_addr;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9497
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9498 /* 1024k buffer */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9499 bp = sata_alloc_local_buffer(spx, 1024);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9500 if (bp == NULL) {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9501 sata_pkt_free(spx);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9502 kmem_free(spx, sizeof (sata_pkt_txlate_t));
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9503 sata_log(sata_hba_inst, CE_WARN,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9504 "sata_test_atapi_packet_command: "
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9505 "cannot allocate data buffer");
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9506 return;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9507 }
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9508 bp_mapin(bp); /* make data buffer accessible */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9509
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9510 scmd = &spkt->satapkt_cmd;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9511 ASSERT(scmd->satacmd_num_dma_cookies != 0);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9512 ASSERT(scmd->satacmd_dma_cookie_list != NULL);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9513
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9514 /* Use synchronous mode */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9515 spkt->satapkt_op_mode = SATA_OPMODE_SYNCH | SATA_OPMODE_INTERRUPTS;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9516
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9517 /* Synchronous mode, no callback - may be changed by the caller */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9518 spkt->satapkt_comp = NULL;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9519 spkt->satapkt_time = sata_default_pkt_time;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9520
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9521 /* Issue inquiry command - 6 bytes cdb, data transfer, read */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9522
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9523 scmd->satacmd_flags.sata_data_direction = SATA_DIR_READ;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9524 scmd->satacmd_flags.sata_ignore_dev_reset = B_TRUE;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9525
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9526 sata_atapi_packet_cmd_setup(scmd, sdinfo);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9527
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9528 /* Set-up acdb. */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9529 scmd->satacmd_acdb_len = sdinfo->satadrv_atapi_cdb_len;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9530 bzero(scmd->satacmd_acdb, SATA_ATAPI_MAX_CDB_LEN);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9531 scmd->satacmd_acdb[0] = 0x12; /* Inquiry */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9532 scmd->satacmd_acdb[1] = 0x00;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9533 scmd->satacmd_acdb[2] = 0x00;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9534 scmd->satacmd_acdb[3] = 0x00;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9535 scmd->satacmd_acdb[4] = sizeof (struct scsi_inquiry);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9536 scmd->satacmd_acdb[5] = 0x00;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9537
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9538 sata_fixed_sense_data_preset(
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9539 (struct scsi_extended_sense *)scmd->satacmd_rqsense);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9540
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9541 /* Transfer command to HBA */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9542 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9543 if (sata_hba_start(spx, &rval) != 0) {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9544 /* Pkt not accepted for execution */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9545 sata_log(sata_hba_inst, CE_WARN,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9546 "sata_test_atapi_packet_command: "
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9547 "Packet not accepted for execution - ret: %02x", rval);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9548 mutex_exit(
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9549 &SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9550 goto cleanup;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9551 }
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9552 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9553
7152
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
9554 if (spx->txlt_buf_dma_handle != NULL) {
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
9555 /*
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
9556 * Sync buffer. Handle is in usual place in translate struct.
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
9557 */
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
9558 rval = ddi_dma_sync(spx->txlt_buf_dma_handle, 0, 0,
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
9559 DDI_DMA_SYNC_FORCPU);
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
9560 ASSERT(rval == DDI_SUCCESS);
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
9561 }
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9562 if (spkt->satapkt_reason == SATA_PKT_COMPLETED) {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9563 sata_log(sata_hba_inst, CE_WARN,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9564 "sata_test_atapi_packet_command: "
5014
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
9565 "Packet completed successfully");
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9566 /*
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9567 * Normal completion - show inquiry data
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9568 */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9569 sata_show_inqry_data((uint8_t *)bp->b_un.b_addr);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9570 } else {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9571 /*
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9572 * Something went wrong - analyze return - check rqsense data
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9573 */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9574 if (spkt->satapkt_reason == SATA_PKT_DEV_ERROR) {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9575 /*
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9576 * ARQ data hopefull show something other than NO SENSE
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9577 */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9578 rqsp = scmd->satacmd_rqsense;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9579 sata_log(spx->txlt_sata_hba_inst, CE_WARN,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9580 "ATAPI packet completion reason: %02x\n"
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9581 "RQSENSE: %02x %02x %02x %02x %02x %02x "
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9582 " %02x %02x %02x %02x %02x %02x "
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9583 " %02x %02x %02x %02x %02x %02x\n",
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9584 spkt->satapkt_reason,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9585 rqsp[0], rqsp[1], rqsp[2], rqsp[3],
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9586 rqsp[4], rqsp[5], rqsp[6], rqsp[7],
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9587 rqsp[8], rqsp[9], rqsp[10], rqsp[11],
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9588 rqsp[12], rqsp[13], rqsp[14], rqsp[15],
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9589 rqsp[16], rqsp[17]);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9590 } else {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9591 switch (spkt->satapkt_reason) {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9592 case SATA_PKT_PORT_ERROR:
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9593 sata_log(sata_hba_inst, CE_WARN,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9594 "sata_test_atapi_packet_command: "
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9595 "packet reason: port error\n");
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9596 break;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9597
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9598 case SATA_PKT_TIMEOUT:
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9599 sata_log(sata_hba_inst, CE_WARN,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9600 "sata_test_atapi_packet_command: "
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9601 "packet reason: timeout\n");
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9602 break;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9603
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9604 case SATA_PKT_ABORTED:
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9605 sata_log(sata_hba_inst, CE_WARN,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9606 "sata_test_atapi_packet_command: "
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9607 "packet reason: aborted\n");
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9608 break;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9609
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9610 case SATA_PKT_RESET:
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9611 sata_log(sata_hba_inst, CE_WARN,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9612 "sata_test_atapi_packet_command: "
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9613 "packet reason: reset\n");
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9614 break;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9615 default:
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9616 sata_log(sata_hba_inst, CE_WARN,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9617 "sata_test_atapi_packet_command: "
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9618 "invalid packet reason: %02x\n",
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9619 spkt->satapkt_reason);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9620 break;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9621 }
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9622 }
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9623 }
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9624 cleanup:
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9625 sata_free_local_buffer(spx);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9626 sata_pkt_free(spx);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9627 kmem_free(spx, sizeof (sata_pkt_txlate_t));
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9628 }
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9629
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9630 #endif /* SATA_DEBUG */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9631 #endif /* 1 */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9632
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9633
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9634 /* ************************** LOCAL HELPER FUNCTIONS *********************** */
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9635
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9636 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9637 * Validate sata_tran info
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9638 * SATA_FAILURE returns if structure is inconsistent or structure revision
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9639 * does not match one used by the framework.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9640 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9641 * Returns SATA_SUCCESS if sata_hba_tran has matching revision and contains
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9642 * required function pointers.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9643 * Returns SATA_FAILURE otherwise.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9644 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9645 static int
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9646 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
9647 {
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9648 /*
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9649 * SATA_TRAN_HBA_REV is the current (highest) revision number
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9650 * of the SATA interface.
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9651 */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9652 if (sata_tran->sata_tran_hba_rev > SATA_TRAN_HBA_REV) {
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9653 sata_log(NULL, CE_WARN,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9654 "sata: invalid sata_hba_tran version %d for driver %s",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9655 sata_tran->sata_tran_hba_rev, ddi_driver_name(dip));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9656 return (SATA_FAILURE);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9657 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9658
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9659 if (dip != sata_tran->sata_tran_hba_dip) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9660 SATA_LOG_D((NULL, CE_WARN,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9661 "sata: inconsistent sata_tran_hba_dip "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9662 "%p / %p", sata_tran->sata_tran_hba_dip, dip));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9663 return (SATA_FAILURE);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9664 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9665
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9666 if (sata_tran->sata_tran_probe_port == NULL ||
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9667 sata_tran->sata_tran_start == NULL ||
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9668 sata_tran->sata_tran_abort == NULL ||
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9669 sata_tran->sata_tran_reset_dport == NULL ||
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9670 sata_tran->sata_tran_hotplug_ops == NULL ||
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9671 sata_tran->sata_tran_hotplug_ops->sata_tran_port_activate == NULL ||
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9672 sata_tran->sata_tran_hotplug_ops->sata_tran_port_deactivate ==
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
9673 NULL) {
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9674 SATA_LOG_D((NULL, CE_WARN, "sata: sata_hba_tran missing "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9675 "required functions"));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9676 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9677 return (SATA_SUCCESS);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9678 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9679
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9680 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9681 * Remove HBA instance from sata_hba_list.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9682 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9683 static void
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9684 sata_remove_hba_instance(dev_info_t *dip)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9685 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9686 sata_hba_inst_t *sata_hba_inst;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9687
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9688 mutex_enter(&sata_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9689 for (sata_hba_inst = sata_hba_list;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9690 sata_hba_inst != (struct sata_hba_inst *)NULL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9691 sata_hba_inst = sata_hba_inst->satahba_next) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9692 if (sata_hba_inst->satahba_dip == dip)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9693 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9694 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9695
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9696 if (sata_hba_inst == (struct sata_hba_inst *)NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9697 #ifdef SATA_DEBUG
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9698 cmn_err(CE_WARN, "sata_remove_hba_instance: "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9699 "unknown HBA instance\n");
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9700 #endif
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9701 ASSERT(FALSE);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9702 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9703 if (sata_hba_inst == sata_hba_list) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9704 sata_hba_list = sata_hba_inst->satahba_next;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9705 if (sata_hba_list) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9706 sata_hba_list->satahba_prev =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9707 (struct sata_hba_inst *)NULL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9708 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9709 if (sata_hba_inst == sata_hba_list_tail) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9710 sata_hba_list_tail = NULL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9711 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9712 } else if (sata_hba_inst == sata_hba_list_tail) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9713 sata_hba_list_tail = sata_hba_inst->satahba_prev;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9714 if (sata_hba_list_tail) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9715 sata_hba_list_tail->satahba_next =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9716 (struct sata_hba_inst *)NULL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9717 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9718 } else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9719 sata_hba_inst->satahba_prev->satahba_next =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9720 sata_hba_inst->satahba_next;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9721 sata_hba_inst->satahba_next->satahba_prev =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9722 sata_hba_inst->satahba_prev;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9723 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9724 mutex_exit(&sata_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9725 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9726
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9727 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9728 * 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
9729 * 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
9730 * 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
9731 *
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9732 * 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
9733 * 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
9734 * 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
9735 * 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
9736 * (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
9737 *
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
9738 * 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
9739 * when there is no device attached.
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9740 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9741
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9742 static void
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9743 sata_probe_ports(sata_hba_inst_t *sata_hba_inst)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9744 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9745 dev_info_t *dip = SATA_DIP(sata_hba_inst);
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
9746 int ncport;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9747 sata_cport_info_t *cportinfo;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9748 sata_drive_info_t *drive;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9749 sata_device_t sata_device;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9750 int rval;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9751 dev_t minor_number;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9752 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
9753 clock_t start_time, cur_time;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9754
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9755 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9756 * Probe controller ports first, to find port status and
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9757 * any port multiplier attached.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9758 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9759 for (ncport = 0; ncport < SATA_NUM_CPORTS(sata_hba_inst); ncport++) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9760 /* allocate cport structure */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9761 cportinfo = kmem_zalloc(sizeof (sata_cport_info_t), KM_SLEEP);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9762 ASSERT(cportinfo != NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9763 mutex_init(&cportinfo->cport_mutex, NULL, MUTEX_DRIVER, NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9764
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9765 mutex_enter(&cportinfo->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9766
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9767 cportinfo->cport_addr.cport = ncport;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9768 cportinfo->cport_addr.pmport = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9769 cportinfo->cport_addr.qual = SATA_ADDR_CPORT;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9770 cportinfo->cport_state &= ~SATA_PORT_STATE_CLEAR_MASK;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9771 cportinfo->cport_state |= SATA_STATE_PROBING;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9772 SATA_CPORT_INFO(sata_hba_inst, ncport) = cportinfo;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9773
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9774 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9775 * Regardless if a port is usable or not, create
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9776 * an attachment point
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9777 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9778 mutex_exit(&cportinfo->cport_mutex);
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
9779 minor_number = SATA_MAKE_AP_MINOR(ddi_get_instance(dip),
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
9780 ncport, 0, SATA_ADDR_CPORT);
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9781 (void) sprintf(name, "%d", ncport);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9782 if (ddi_create_minor_node(dip, name, S_IFCHR,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9783 minor_number, DDI_NT_SATA_ATTACHMENT_POINT, 0) !=
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9784 DDI_SUCCESS) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9785 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
9786 "cannot create SATA attachment point for port %d",
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9787 ncport);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9788 }
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 /* 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
9791 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
9792 reprobe_cport:
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9793 sata_device.satadev_addr.cport = ncport;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9794 sata_device.satadev_addr.pmport = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9795 sata_device.satadev_addr.qual = SATA_ADDR_CPORT;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9796 sata_device.satadev_rev = SATA_DEVICE_REV;
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 rval = (*SATA_PROBE_PORT_FUNC(sata_hba_inst))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9799 (dip, &sata_device);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9800
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9801 mutex_enter(&cportinfo->cport_mutex);
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
9802 cportinfo->cport_scr = sata_device.satadev_scr;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9803 if (rval != SATA_SUCCESS) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9804 /* Something went wrong? Fail the port */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9805 cportinfo->cport_state = SATA_PSTATE_FAILED;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9806 mutex_exit(&cportinfo->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9807 continue;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9808 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9809 cportinfo->cport_state &= ~SATA_STATE_PROBING;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9810 cportinfo->cport_state |= SATA_STATE_PROBED;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9811 cportinfo->cport_dev_type = sata_device.satadev_type;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9812
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9813 cportinfo->cport_state |= SATA_STATE_READY;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9814 if (cportinfo->cport_dev_type == SATA_DTYPE_NONE) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9815 mutex_exit(&cportinfo->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9816 continue;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9817 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9818 if (cportinfo->cport_dev_type != SATA_DTYPE_PMULT) {
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 * There is some device attached.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9821 * Allocate device info structure
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9822 */
2960
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
9823 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
9824 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
9825 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
9826 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
9827 KM_SLEEP);
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
9828 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
9829 }
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
9830 drive = SATA_CPORTINFO_DRV_INFO(cportinfo);
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9831 drive->satadrv_addr = cportinfo->cport_addr;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9832 drive->satadrv_addr.qual = SATA_ADDR_DCPORT;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9833 drive->satadrv_type = cportinfo->cport_dev_type;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9834 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
9835
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
9836 mutex_exit(&cportinfo->cport_mutex);
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
9837 if (sata_add_device(dip, 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
9838 SATA_SUCCESS) {
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
9839 /*
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
9840 * 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
9841 * 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
9842 */
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
9843 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
9844 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
9845 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
9846 /* 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
9847 delay(drv_usectohz(
6539
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
9848 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
9849 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
9850 }
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
9851 }
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
9852 } else { /* SATA_DTYPE_PMULT */
2960
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
9853 mutex_exit(&cportinfo->cport_mutex);
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9854
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
9855 /* Allocate sata_pmult_info and sata_pmport_info */
10663
4d59e1faf654 6881565 sata hba interfaces need to keep backward compatibility
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10427
diff changeset
9856 if (sata_alloc_pmult(sata_hba_inst, &sata_device) !=
4d59e1faf654 6881565 sata hba interfaces need to keep backward compatibility
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10427
diff changeset
9857 SATA_SUCCESS)
4d59e1faf654 6881565 sata hba interfaces need to keep backward compatibility
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10427
diff changeset
9858 continue;
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
9859
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
9860 /* Log the information of the port multiplier */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
9861 sata_show_pmult_info(sata_hba_inst, &sata_device);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
9862
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
9863 /* Probe its pmports */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
9864 sata_probe_pmports(sata_hba_inst, ncport);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
9865 }
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
9866 }
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
9867 }
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
9868
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
9869 /*
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
9870 * Probe all device ports behind a port multiplier.
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
9871 *
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
9872 * PMult-related structure should be allocated before by sata_alloc_pmult().
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
9873 *
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
9874 * NOTE1: Only called from sata_probe_ports()
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
9875 * NOTE2: No mutex should be hold.
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
9876 */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
9877 static void
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
9878 sata_probe_pmports(sata_hba_inst_t *sata_hba_inst, uint8_t ncport)
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
9879 {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
9880 dev_info_t *dip = SATA_DIP(sata_hba_inst);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
9881 sata_pmult_info_t *pmultinfo = NULL;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
9882 sata_pmport_info_t *pmportinfo = NULL;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
9883 sata_drive_info_t *drive = NULL;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
9884 sata_device_t sata_device;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
9885
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
9886 clock_t start_time, cur_time;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
9887 int npmport;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
9888 int rval;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
9889
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
9890 pmultinfo = SATA_PMULT_INFO(sata_hba_inst, ncport);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
9891
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
9892 /* Probe Port Multiplier ports */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
9893 for (npmport = 0; npmport < pmultinfo->pmult_num_dev_ports; npmport++) {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
9894 pmportinfo = pmultinfo->pmult_dev_port[npmport];
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
9895 start_time = ddi_get_lbolt();
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
9896 reprobe_pmport:
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
9897 sata_device.satadev_addr.cport = ncport;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
9898 sata_device.satadev_addr.pmport = npmport;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
9899 sata_device.satadev_addr.qual = SATA_ADDR_PMPORT;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
9900 sata_device.satadev_rev = SATA_DEVICE_REV;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
9901
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
9902 /* Let HBA driver probe it. */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
9903 rval = (*SATA_PROBE_PORT_FUNC(sata_hba_inst))
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
9904 (dip, &sata_device);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
9905 mutex_enter(&pmportinfo->pmport_mutex);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
9906
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
9907 pmportinfo->pmport_scr = sata_device.satadev_scr;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
9908
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
9909 if (rval != SATA_SUCCESS) {
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9910 pmportinfo->pmport_state =
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
9911 SATA_PSTATE_FAILED;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
9912 mutex_exit(&pmportinfo->pmport_mutex);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
9913 continue;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
9914 }
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
9915 pmportinfo->pmport_state &= ~SATA_STATE_PROBING;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
9916 pmportinfo->pmport_state |= SATA_STATE_PROBED;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
9917 pmportinfo->pmport_dev_type = sata_device.satadev_type;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
9918
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
9919 pmportinfo->pmport_state |= SATA_STATE_READY;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
9920 if (pmportinfo->pmport_dev_type ==
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
9921 SATA_DTYPE_NONE) {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
9922 SATADBG2(SATA_DBG_PMULT, sata_hba_inst,
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
9923 "no device found at port %d:%d", ncport, npmport);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
9924 mutex_exit(&pmportinfo->pmport_mutex);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
9925 continue;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
9926 }
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
9927 /* Port multipliers cannot be chained */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
9928 ASSERT(pmportinfo->pmport_dev_type != SATA_DTYPE_PMULT);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
9929 /*
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
9930 * There is something attached to Port
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
9931 * Multiplier device port
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
9932 * Allocate device info structure
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
9933 */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
9934 if (pmportinfo->pmport_sata_drive == NULL) {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
9935 mutex_exit(&pmportinfo->pmport_mutex);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
9936 pmportinfo->pmport_sata_drive =
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
9937 kmem_zalloc(sizeof (sata_drive_info_t), KM_SLEEP);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
9938 mutex_enter(&pmportinfo->pmport_mutex);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
9939 }
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
9940 drive = pmportinfo->pmport_sata_drive;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
9941 drive->satadrv_addr.cport = pmportinfo->pmport_addr.cport;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
9942 drive->satadrv_addr.pmport = npmport;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
9943 drive->satadrv_addr.qual = SATA_ADDR_DPMPORT;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
9944 drive->satadrv_type = pmportinfo-> pmport_dev_type;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
9945 drive->satadrv_state = SATA_STATE_UNKNOWN;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
9946
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
9947 mutex_exit(&pmportinfo->pmport_mutex);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
9948 rval = sata_add_device(dip, sata_hba_inst, &sata_device);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
9949
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
9950 if (rval != SATA_SUCCESS) {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
9951 /*
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
9952 * Plugged device was not correctly identified.
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
9953 * Retry, within the SATA_DEV_IDENTIFY_TIMEOUT
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
9954 */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
9955 cur_time = ddi_get_lbolt();
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
9956 if ((cur_time - start_time) < drv_usectohz(
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
9957 SATA_DEV_IDENTIFY_TIMEOUT)) {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
9958 /* sleep for a while */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
9959 delay(drv_usectohz(SATA_DEV_RETRY_DLY));
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
9960 goto reprobe_pmport;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
9961 }
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9962 }
2960
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
9963 }
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
9964 }
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
9965
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
9966 /*
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
9967 * Add SATA device for specified HBA instance & port (SCSI target
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9968 * 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
9969 * 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
9970 * 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
9971 * but may be removed if it cannot be put online.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9972 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9973 * This function cannot be called from an interrupt context.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9974 *
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
9975 * Create target nodes for disk, CD/DVD, Tape and ATAPI disk devices
2960
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
9976 *
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
9977 * 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
9978 * 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
9979 *
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
9980 */
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
9981 static int
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
9982 sata_add_device(dev_info_t *pdip, sata_hba_inst_t *sata_hba_inst,
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
9983 sata_device_t *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
9984 {
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9985 sata_cport_info_t *cportinfo;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9986 sata_pmult_info_t *pminfo;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9987 sata_pmport_info_t *pmportinfo;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9988 dev_info_t *cdip; /* child dip */
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
9989 sata_address_t *saddr = &sata_device->satadev_addr;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
9990 uint8_t cport, pmport;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9991 int rval;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9992
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
9993 cport = saddr->cport;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
9994 pmport = saddr->pmport;
2960
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
9995 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
9996 ASSERT(cportinfo->cport_dev_type != SATA_DTYPE_NONE);
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
9997
2960
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
9998 /*
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
9999 * 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
10000 * 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
10001 * 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
10002 * 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
10003 * 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
10004 * 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
10005 */
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10006 sata_device->satadev_rev = SATA_DEVICE_REV;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10007 switch (saddr->qual) {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10008 case SATA_ADDR_CPORT:
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10009 /*
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10010 * Add a non-port-multiplier device at controller port.
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10011 */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10012 saddr->qual = SATA_ADDR_DCPORT;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10013
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10014 rval = sata_probe_device(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
10015 if (rval != SATA_SUCCESS ||
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10016 sata_device->satadev_type == SATA_DTYPE_UNKNOWN)
2960
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
10017 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
10018
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10019 mutex_enter(&cportinfo->cport_mutex);
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
10020 sata_show_drive_info(sata_hba_inst,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
10021 SATA_CPORTINFO_DRV_INFO(cportinfo));
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
10022
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10023 if ((sata_device->satadev_type & SATA_VALID_DEV_TYPE) == 0) {
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10024 /*
2960
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
10025 * 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
10026 * 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
10027 * Degrade this device to unknown.
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10028 */
2960
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
10029 cportinfo->cport_dev_type = SATA_DTYPE_UNKNOWN;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10030 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
10031 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
10032 }
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10033 cportinfo->cport_dev_type = sata_device->satadev_type;
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
10034 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
10035 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
10036
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
10037 /*
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
10038 * 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
10039 * 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
10040 * 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
10041 */
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
10042 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
10043 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
10044 /* 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
10045 rval = sata_initialize_device(sata_hba_inst,
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10046 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
10047
7954
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
10048 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
10049 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
10050 "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
10051 "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
10052 " Device may not operate as expected.",
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10053 cport);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10054 }
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10055
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10056 cdip = sata_create_target_node(pdip, sata_hba_inst, saddr);
2960
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
10057 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
10058 /*
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
10059 * 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
10060 * 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
10061 */
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
10062 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
10063 }
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10064
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10065 mutex_enter(&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
10066 (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
10067 satadrv_state = SATA_STATE_READY;
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10068 mutex_exit(&cportinfo->cport_mutex);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10069
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10070 break;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10071
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10072 case SATA_ADDR_PMPORT:
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10073 saddr->qual = SATA_ADDR_DPMPORT;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10074
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10075 mutex_enter(&cportinfo->cport_mutex);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10076 /* It must be a Port Multiplier at the controller port */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10077 ASSERT(cportinfo->cport_dev_type == SATA_DTYPE_PMULT);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10078
2960
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
10079 pminfo = SATA_CPORTINFO_PMULT_INFO(cportinfo);
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10080 pmportinfo = pminfo->pmult_dev_port[saddr->pmport];
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10081 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
10082
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10083 rval = sata_probe_device(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
10084 if (rval != SATA_SUCCESS ||
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10085 sata_device->satadev_type == SATA_DTYPE_UNKNOWN) {
2960
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
10086 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
10087 }
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10088
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10089 mutex_enter(&pmportinfo->pmport_mutex);
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
10090 sata_show_drive_info(sata_hba_inst,
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10091 SATA_PMPORTINFO_DRV_INFO(pmportinfo));
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10092
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10093 if ((sata_device->satadev_type & SATA_VALID_DEV_TYPE) == 0) {
2960
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
10094 /*
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
10095 * 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
10096 * 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
10097 */
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
10098 pmportinfo->pmport_dev_type = SATA_DTYPE_UNKNOWN;
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10099 mutex_exit(&pmportinfo->pmport_mutex);
2960
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
10100 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
10101 }
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10102 pmportinfo->pmport_dev_type = sata_device->satadev_type;
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
10103 pmportinfo->pmport_tgtnode_clean = B_TRUE;
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10104 mutex_exit(&pmportinfo->pmport_mutex);
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
10105
2960
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
10106 /*
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
10107 * 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
10108 * 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
10109 * 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
10110 */
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
10111 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
10112 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
10113 /* 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
10114 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
10115 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
10116
7954
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
10117 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
10118 sata_log(sata_hba_inst, CE_WARN,
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10119 "SATA device at port %d:%d - "
7954
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
10120 "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
10121 " Device may not operate as expected.",
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10122 cport, pmport);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10123 }
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10124
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10125 cdip = sata_create_target_node(pdip, sata_hba_inst, saddr);
2960
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
10126 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
10127 /*
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
10128 * 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
10129 * 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
10130 */
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
10131 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
10132 }
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10133 mutex_enter(&pmportinfo->pmport_mutex);
2960
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
10134 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
10135 SATA_STATE_READY;
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10136 mutex_exit(&pmportinfo->pmport_mutex);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10137
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10138 break;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10139
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10140 default:
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10141 return (SATA_FAILURE);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10142 }
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10143
2960
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
10144 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
10145 }
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10146
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10147 /*
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10148 * Clean up target node at specific address.
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10149 *
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10150 * NOTE: No Mutex should be hold.
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10151 */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10152 static int
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10153 sata_offline_device(sata_hba_inst_t *sata_hba_inst,
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10154 sata_device_t *sata_device, sata_drive_info_t *sdinfo)
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10155 {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10156 uint8_t cport, pmport, qual;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10157 dev_info_t *tdip;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10158
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10159 cport = sata_device->satadev_addr.cport;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10160 pmport = sata_device->satadev_addr.pmport;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10161 qual = sata_device->satadev_addr.qual;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10162
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10163 if (qual == SATA_ADDR_DCPORT) {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10164 SATA_LOG_D((sata_hba_inst, CE_WARN,
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10165 "sata_hba_ioctl: disconnect device at port %d", cport));
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10166 } else {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10167 SATA_LOG_D((sata_hba_inst, CE_WARN,
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10168 "sata_hba_ioctl: disconnect device at port %d:%d",
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10169 cport, pmport));
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10170 }
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10171
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10172 /* We are addressing attached device, not a port */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10173 sata_device->satadev_addr.qual =
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10174 sdinfo->satadrv_addr.qual;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10175 tdip = sata_get_scsi_target_dip(SATA_DIP(sata_hba_inst),
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10176 &sata_device->satadev_addr);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10177 if (tdip != NULL && ndi_devi_offline(tdip,
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10178 NDI_DEVI_REMOVE) != NDI_SUCCESS) {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10179 /*
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10180 * Problem :
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10181 * The target node remained attached.
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10182 * This happens when the device file was open
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10183 * or a node was waiting for resources.
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10184 * Cannot do anything about it.
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10185 */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10186 if (qual == SATA_ADDR_DCPORT) {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10187 SATA_LOG_D((sata_hba_inst, CE_WARN,
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10188 "sata_hba_ioctl: disconnect: could "
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10189 "not unconfigure device before "
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10190 "disconnecting the SATA port %d",
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10191 cport));
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10192 } else {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10193 SATA_LOG_D((sata_hba_inst, CE_WARN,
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10194 "sata_hba_ioctl: disconnect: could "
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10195 "not unconfigure device before "
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10196 "disconnecting the SATA port %d:%d",
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10197 cport, pmport));
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10198 }
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10199 /*
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10200 * Set DEVICE REMOVED state in the target
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10201 * node. It will prevent access to the device
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10202 * even when a new device is attached, until
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10203 * the old target node is released, removed and
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10204 * recreated for a new device.
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10205 */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10206 sata_set_device_removed(tdip);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10207
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10208 /*
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10209 * Instruct event daemon to try the target
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10210 * node cleanup later.
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10211 */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10212 sata_set_target_node_cleanup(
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10213 sata_hba_inst, &sata_device->satadev_addr);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10214 }
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10215
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10216
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10217 return (SATA_SUCCESS);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10218 }
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10219
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
10220
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10221 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10222 * Create scsi target node for attached device, create node properties and
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10223 * attach the node.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10224 * The node could be removed if the device onlining fails.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10225 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10226 * 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
10227 * returned otherwise.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10228 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10229
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10230 static dev_info_t *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10231 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
10232 sata_address_t *sata_addr)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10233 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10234 dev_info_t *cdip = NULL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10235 int rval;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10236 char *nname = NULL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10237 char **compatible = NULL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10238 int ncompatible;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10239 struct scsi_inquiry inq;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10240 sata_device_t sata_device;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10241 sata_drive_info_t *sdinfo;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10242 int target;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10243 int i;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10244
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10245 sata_device.satadev_rev = SATA_DEVICE_REV;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10246 sata_device.satadev_addr = *sata_addr;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10247
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10248 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst, sata_addr->cport)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10249
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10250 sdinfo = sata_get_device_info(sata_hba_inst, &sata_device);
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 target = SATA_TO_SCSI_TARGET(sata_addr->cport,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10253 sata_addr->pmport, sata_addr->qual);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10254
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10255 if (sdinfo == NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10256 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10257 sata_addr->cport)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10258 SATA_LOG_D((sata_hba_inst, CE_WARN,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10259 "sata_create_target_node: no sdinfo for target %x",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10260 target));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10261 return (NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10262 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10263
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10264 /*
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
10265 * create or get scsi inquiry data, expected by
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10266 * scsi_hba_nodename_compatible_get()
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
10267 * SATA hard disks get Identify Data translated into Inguiry Data.
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
10268 * ATAPI devices respond directly to Inquiry request.
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
10269 */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
10270 if (sdinfo->satadrv_type == SATA_DTYPE_ATADISK) {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
10271 sata_identdev_to_inquiry(sata_hba_inst, sdinfo,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
10272 (uint8_t *)&inq);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
10273 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
10274 sata_addr->cport)));
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
10275 } else { /* Assume supported ATAPI device */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
10276 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
10277 sata_addr->cport)));
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
10278 if (sata_get_atapi_inquiry_data(sata_hba_inst, sata_addr,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
10279 &inq) == SATA_FAILURE)
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
10280 return (NULL);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
10281 /*
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
10282 * Save supported ATAPI transport version
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
10283 */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
10284 sdinfo->satadrv_atapi_trans_ver =
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
10285 SATA_ATAPI_TRANS_VERSION(&inq);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
10286 }
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10287
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10288 /* determine the node name and compatible */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10289 scsi_hba_nodename_compatible_get(&inq, NULL,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10290 inq.inq_dtype, NULL, &nname, &compatible, &ncompatible);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10291
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10292 #ifdef SATA_DEBUG
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10293 if (sata_debug_flags & SATA_DBG_NODES) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10294 if (nname == NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10295 cmn_err(CE_NOTE, "sata_create_target_node: "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10296 "cannot determine nodename for target %d\n",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10297 target);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10298 } else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10299 cmn_err(CE_WARN, "sata_create_target_node: "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10300 "target %d nodename: %s\n", target, nname);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10301 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10302 if (compatible == NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10303 cmn_err(CE_WARN,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10304 "sata_create_target_node: no compatible name\n");
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10305 } else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10306 for (i = 0; i < ncompatible; i++) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10307 cmn_err(CE_WARN, "sata_create_target_node: "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10308 "compatible name: %s\n", compatible[i]);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10309 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10310 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10311 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10312 #endif
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10313
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10314 /* if nodename can't be determined, log error and exit */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10315 if (nname == NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10316 SATA_LOG_D((sata_hba_inst, CE_WARN,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10317 "sata_create_target_node: cannot determine nodename "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10318 "for target %d\n", target));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10319 scsi_hba_nodename_compatible_free(nname, compatible);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10320 return (NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10321 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10322 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10323 * Create scsi target node
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10324 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10325 ndi_devi_alloc_sleep(dip, nname, (pnode_t)DEVI_SID_NODEID, &cdip);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10326 rval = ndi_prop_update_string(DDI_DEV_T_NONE, cdip,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10327 "device-type", "scsi");
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10328
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10329 if (rval != DDI_PROP_SUCCESS) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10330 SATA_LOG_D((sata_hba_inst, CE_WARN, "sata_create_target_node: "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10331 "updating device_type prop failed %d", rval));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10332 goto fail;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10333 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10334
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10335 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10336 * Create target node properties: target & lun
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10337 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10338 rval = ndi_prop_update_int(DDI_DEV_T_NONE, cdip, "target", target);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10339 if (rval != DDI_PROP_SUCCESS) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10340 SATA_LOG_D((sata_hba_inst, CE_WARN, "sata_create_target_node: "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10341 "updating target prop failed %d", rval));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10342 goto fail;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10343 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10344 rval = ndi_prop_update_int(DDI_DEV_T_NONE, cdip, "lun", 0);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10345 if (rval != DDI_PROP_SUCCESS) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10346 SATA_LOG_D((sata_hba_inst, CE_WARN, "sata_create_target_node: "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10347 "updating target prop failed %d", rval));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10348 goto fail;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10349 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10350
8317
249d7b80428e 6767262 ahci driver should support Dell PowerVault RD1000 backup device
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 8168
diff changeset
10351 if (sdinfo->satadrv_type & SATA_DTYPE_ATAPI) {
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
10352 /*
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
10353 * Add "variant" property
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
10354 */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
10355 rval = ndi_prop_update_string(DDI_DEV_T_NONE, cdip,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
10356 "variant", "atapi");
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
10357 if (rval != DDI_PROP_SUCCESS) {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
10358 SATA_LOG_D((sata_hba_inst, CE_WARN,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
10359 "sata_create_target_node: variant atapi "
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
10360 "property could not be created: %d", rval));
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
10361 goto fail;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
10362 }
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
10363 }
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10364 /* decorate the node with compatible */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10365 if (ndi_prop_update_string_array(DDI_DEV_T_NONE, cdip, "compatible",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10366 compatible, ncompatible) != DDI_PROP_SUCCESS) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10367 SATA_LOG_D((sata_hba_inst, CE_WARN,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10368 "sata_create_target_node: FAIL compatible props cdip 0x%p",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10369 (void *)cdip));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10370 goto fail;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10371 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10372
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
10373
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10374 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10375 * Now, try to attach the driver. If probing of the device fails,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10376 * the target node may be removed
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10377 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10378 rval = ndi_devi_online(cdip, NDI_ONLINE_ATTACH);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10379
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10380 scsi_hba_nodename_compatible_free(nname, compatible);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10381
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10382 if (rval == NDI_SUCCESS)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10383 return (cdip);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10384
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10385 /* target node was removed - are we sure? */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10386 return (NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10387
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10388 fail:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10389 scsi_hba_nodename_compatible_free(nname, compatible);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10390 ddi_prop_remove_all(cdip);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10391 rval = ndi_devi_free(cdip);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10392 if (rval != NDI_SUCCESS) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10393 SATA_LOG_D((sata_hba_inst, CE_WARN, "sata_create_target_node: "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10394 "node removal failed %d", rval));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10395 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10396 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
10397 "cannot create target node for SATA device at port %d",
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10398 sata_addr->cport);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10399 return (NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10400 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10401
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10402 /*
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10403 * Remove a target node.
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10404 */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10405 static void
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10406 sata_remove_target_node(sata_hba_inst_t *sata_hba_inst,
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10407 sata_address_t *sata_addr)
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10408 {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10409 dev_info_t *tdip;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10410 uint8_t cport = sata_addr->cport;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10411 uint8_t pmport = sata_addr->pmport;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10412 uint8_t qual = sata_addr->qual;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10413
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10414 /* Note the sata daemon uses the address of the port/pmport */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10415 ASSERT(qual == SATA_ADDR_CPORT || qual == SATA_ADDR_PMPORT);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10416
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10417 /* Remove target node */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10418 tdip = sata_get_target_dip(SATA_DIP(sata_hba_inst), cport, pmport);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10419 if (tdip != NULL) {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10420 /*
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10421 * Target node exists. Unconfigure device
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10422 * then remove the target node (one ndi
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10423 * operation).
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10424 */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10425 if (ndi_devi_offline(tdip, NDI_DEVI_REMOVE) != NDI_SUCCESS) {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10426 /*
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10427 * PROBLEM - no device, but target node remained. This
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10428 * happens when the file was open or node was waiting
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10429 * for resources.
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10430 */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10431 SATA_LOG_D((sata_hba_inst, CE_WARN,
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10432 "sata_remove_target_node: "
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10433 "Failed to remove target node for "
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10434 "detached SATA device."));
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10435 /*
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10436 * Set target node state to DEVI_DEVICE_REMOVED. But
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10437 * re-check first that the node still exists.
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10438 */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10439 tdip = sata_get_target_dip(SATA_DIP(sata_hba_inst),
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10440 cport, pmport);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10441 if (tdip != NULL) {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10442 sata_set_device_removed(tdip);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10443 /*
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10444 * Instruct event daemon to retry the cleanup
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10445 * later.
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10446 */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10447 sata_set_target_node_cleanup(sata_hba_inst,
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10448 sata_addr);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10449 }
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10450 }
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10451
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10452 if (qual == SATA_ADDR_CPORT)
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10453 sata_log(sata_hba_inst, CE_WARN,
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10454 "SATA device detached at port %d", cport);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10455 else
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10456 sata_log(sata_hba_inst, CE_WARN,
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10457 "SATA device detached at port %d:%d",
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10458 cport, pmport);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10459 }
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10460 #ifdef SATA_DEBUG
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10461 else {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10462 if (qual == SATA_ADDR_CPORT)
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10463 sata_log(sata_hba_inst, CE_WARN,
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10464 "target node not found at port %d", cport);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10465 else
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10466 sata_log(sata_hba_inst, CE_WARN,
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10467 "target node not found at port %d:%d",
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10468 cport, pmport);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10469 }
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10470 #endif
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10471 }
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10472
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10473
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10474 /*
2734
1a2f23099c2a 6428449 sata disks have read cache disabled after being hot-plugged
pawelw
parents: 2593
diff changeset
10475 * Re-probe sata port, check for a device and attach info
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10476 * structures when necessary. Identify Device data is fetched, if possible.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10477 * Assumption: sata address is already validated.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10478 * SATA_SUCCESS is returned if port is re-probed sucessfully, regardless of
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10479 * 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
10480 *
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
10481 * 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
10482 * 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
10483 * 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
10484 * 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
10485 *
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10486 * 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
10487 *
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
10488 * 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
10489 *
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10490 * Note: Port multiplier is supported.
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10491 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10492 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
10493 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
10494 int flag)
1258
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 sata_cport_info_t *cportinfo;
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10497 sata_pmult_info_t *pmultinfo;
6539
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
10498 sata_drive_info_t *sdinfo, *osdinfo;
1781
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
10499 boolean_t init_device = B_FALSE;
2734
1a2f23099c2a 6428449 sata disks have read cache disabled after being hot-plugged
pawelw
parents: 2593
diff changeset
10500 int prev_device_type = SATA_DTYPE_NONE;
1a2f23099c2a 6428449 sata disks have read cache disabled after being hot-plugged
pawelw
parents: 2593
diff changeset
10501 int prev_device_settings = 0;
6539
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
10502 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
10503 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
10504 int retry = B_FALSE;
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10505 uint8_t cport = sata_device->satadev_addr.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
10506 int rval_probe, rval_init;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10507
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10508 /*
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10509 * If target is pmport, sata_reprobe_pmport() will handle it.
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10510 */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10511 if (sata_device->satadev_addr.qual == SATA_ADDR_PMPORT ||
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10512 sata_device->satadev_addr.qual == SATA_ADDR_DPMPORT)
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10513 return (sata_reprobe_pmport(sata_hba_inst, sata_device, flag));
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10514
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10515 /* We only care about host sata cport for now */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10516 cportinfo = SATA_CPORT_INFO(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10517 sata_device->satadev_addr.cport);
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10518
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10519 /*
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10520 * If a port multiplier was previously attached (we have no idea it
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10521 * still there or not), sata_reprobe_pmult() will handle it.
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10522 */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10523 if (cportinfo->cport_dev_type == SATA_DTYPE_PMULT)
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10524 return (sata_reprobe_pmult(sata_hba_inst, sata_device, flag));
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10525
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10526 /* Store sata_drive_info when a non-pmult device was attached. */
6539
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
10527 osdinfo = SATA_CPORTINFO_DRV_INFO(cportinfo);
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
10528 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
10529 /*
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
10530 * 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
10531 * 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
10532 */
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
10533 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
10534 prev_device_settings = osdinfo->satadrv_settings;
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
10535 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
10536 }
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
10537 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
10538 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
10539 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
10540 }
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
10541 retry_probe:
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
10542
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10543 /* probe port */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10544 mutex_enter(&cportinfo->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10545 cportinfo->cport_state &= ~SATA_PORT_STATE_CLEAR_MASK;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10546 cportinfo->cport_state |= SATA_STATE_PROBING;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10547 mutex_exit(&cportinfo->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10548
7954
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
10549 rval_probe = (*SATA_PROBE_PORT_FUNC(sata_hba_inst))
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10550 (SATA_DIP(sata_hba_inst), sata_device);
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 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
10553 if (rval_probe != SATA_SUCCESS) {
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10554 cportinfo->cport_state = SATA_PSTATE_FAILED;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10555 mutex_exit(&cportinfo->cport_mutex);
3935
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
10556 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
10557 "SATA port %d probing failed",
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
10558 cportinfo->cport_addr.cport));
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10559 return (SATA_FAILURE);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10560 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10561
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10562 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10563 * update sata port state and set device type
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 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
10566 cportinfo->cport_state &= ~SATA_STATE_PROBING;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10567
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10568 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10569 * Sanity check - Port is active? Is the link active?
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10570 * Is there any device attached?
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10571 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10572 if ((cportinfo->cport_state &
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10573 (SATA_PSTATE_SHUTDOWN | SATA_PSTATE_FAILED)) ||
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10574 (cportinfo->cport_scr.sstatus & SATA_PORT_DEVLINK_UP_MASK) !=
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10575 SATA_PORT_DEVLINK_UP) {
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 * Port in non-usable state or no link active/no device.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10578 * Free info structure if necessary (direct attached drive
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10579 * only, for now!
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10580 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10581 sdinfo = SATA_CPORTINFO_DRV_INFO(cportinfo);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10582 SATA_CPORTINFO_DRV_INFO(cportinfo) = NULL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10583 /* Add here differentiation for device attached or not */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10584 cportinfo->cport_dev_type = SATA_DTYPE_NONE;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10585 mutex_exit(&cportinfo->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10586 if (sdinfo != NULL)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10587 kmem_free(sdinfo, sizeof (sata_drive_info_t));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10588 return (SATA_SUCCESS);
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
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10591 cportinfo->cport_state |= SATA_STATE_READY;
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10592 cportinfo->cport_state |= SATA_STATE_PROBED;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10593
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10594 cportinfo->cport_dev_type = sata_device->satadev_type;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10595 sdinfo = SATA_CPORTINFO_DRV_INFO(cportinfo);
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 * If we are re-probing the port, there may be
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10599 * sata_drive_info structure attached
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 if (sata_device->satadev_type == SATA_DTYPE_NONE) {
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10602
1258
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 * 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
10605 * if necessary.
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10606 */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10607 /* Device change: Drive -> None */
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10608 SATA_CPORTINFO_DRV_INFO(cportinfo) = NULL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10609 cportinfo->cport_dev_type = SATA_DTYPE_NONE;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10610 if (sdinfo != NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10611 kmem_free(sdinfo, sizeof (sata_drive_info_t));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10612 sata_log(sata_hba_inst, CE_WARN,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10613 "SATA device detached "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10614 "from port %d", cportinfo->cport_addr.cport);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10615 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10616 mutex_exit(&cportinfo->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10617 return (SATA_SUCCESS);
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10618
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10619 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10620
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10621 if (sata_device->satadev_type != SATA_DTYPE_PMULT) {
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10622
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10623 /* Device (may) change: Drive -> Drive */
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10624 if (sdinfo == NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10625 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10626 * There is some device attached, but there is
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10627 * no sata_drive_info structure - allocate one
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10628 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10629 mutex_exit(&cportinfo->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10630 sdinfo = kmem_zalloc(
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10631 sizeof (sata_drive_info_t), KM_SLEEP);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10632 mutex_enter(&cportinfo->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10633 /*
2734
1a2f23099c2a 6428449 sata disks have read cache disabled after being hot-plugged
pawelw
parents: 2593
diff changeset
10634 * Recheck, that the port state did not change when we
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10635 * released mutex.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10636 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10637 if (cportinfo->cport_state & SATA_STATE_READY) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10638 SATA_CPORTINFO_DRV_INFO(cportinfo) = sdinfo;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10639 sdinfo->satadrv_addr = cportinfo->cport_addr;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10640 sdinfo->satadrv_addr.qual = SATA_ADDR_DCPORT;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10641 sdinfo->satadrv_type = SATA_DTYPE_UNKNOWN;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10642 sdinfo->satadrv_state = SATA_STATE_UNKNOWN;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10643 } else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10644 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10645 * Port is not in ready state, we
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10646 * cannot attach a device.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10647 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10648 mutex_exit(&cportinfo->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10649 kmem_free(sdinfo, sizeof (sata_drive_info_t));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10650 return (SATA_SUCCESS);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10651 }
1781
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
10652 /*
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
10653 * Since we are adding device, presumably new one,
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
10654 * indicate that it should be initalized,
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
10655 * as well as some internal framework states).
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
10656 */
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
10657 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
10658 }
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10659 cportinfo->cport_dev_type = SATA_DTYPE_UNKNOWN;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10660 sata_device->satadev_addr.qual = sdinfo->satadrv_addr.qual;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10661 } else {
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10662 /* Device change: Drive -> PMult */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10663 SATA_CPORTINFO_DRV_INFO(cportinfo) = NULL;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10664 if (sdinfo != NULL) {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10665 kmem_free(sdinfo, sizeof (sata_drive_info_t));
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10666 sata_log(sata_hba_inst, CE_WARN,
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10667 "SATA device detached "
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10668 "from port %d", cportinfo->cport_addr.cport);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10669 }
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10670
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10671 sata_log(sata_hba_inst, CE_WARN,
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10672 "SATA port multiplier detected at port %d",
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10673 cportinfo->cport_addr.cport);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10674
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10675 mutex_exit(&cportinfo->cport_mutex);
10663
4d59e1faf654 6881565 sata hba interfaces need to keep backward compatibility
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10427
diff changeset
10676 if (sata_alloc_pmult(sata_hba_inst, sata_device) !=
4d59e1faf654 6881565 sata hba interfaces need to keep backward compatibility
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10427
diff changeset
10677 SATA_SUCCESS)
4d59e1faf654 6881565 sata hba interfaces need to keep backward compatibility
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10427
diff changeset
10678 return (SATA_FAILURE);
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10679 sata_show_pmult_info(sata_hba_inst, sata_device);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10680 mutex_enter(&cportinfo->cport_mutex);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10681
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10682 /*
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10683 * Mark all the port multiplier port behind the port
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10684 * multiplier behind with link events, so that the sata daemon
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10685 * will update their status.
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10686 */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10687 pmultinfo = SATA_PMULT_INFO(sata_hba_inst, cport);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10688 pmultinfo->pmult_event_flags |= SATA_EVNT_DEVICE_RESET;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10689 mutex_exit(&cportinfo->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10690 return (SATA_SUCCESS);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10691 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10692 mutex_exit(&cportinfo->cport_mutex);
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10693
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10694 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10695 * 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
10696 * 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
10697 * function.
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
10698 */
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
10699 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
10700 rval_init = SATA_FAILURE;
6539
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
10701 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
10702 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
10703 /*
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
10704 * 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
10705 * 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
10706 */
6539
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
10707 if (osdinfo != NULL &&
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
10708 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
10709 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
10710
6539
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
10711 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
10712 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
10713 /* 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
10714 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
10715 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
10716 sdinfo);
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
10717 }
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
10718 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
10719 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
10720 /* 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
10721
6539
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
10722 } else {
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
10723 /*
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
10724 * 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
10725 * 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
10726 * 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
10727 * during probing process.
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
10728 */
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
10729 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
10730 if (osdinfo != NULL) {
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
10731 cportinfo->cport_dev_type = prev_device_type;
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
10732 sdinfo->satadrv_type = prev_device_type;
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
10733 sdinfo->satadrv_state = prev_device_state;
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
10734 }
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
10735 } else {
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
10736 /* device is gone */
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
10737 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
10738 cportinfo->cport_dev_type = SATA_DTYPE_NONE;
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
10739 SATA_CPORTINFO_DRV_INFO(cportinfo) = NULL;
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
10740 mutex_exit(&cportinfo->cport_mutex);
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
10741 return (SATA_SUCCESS);
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
10742 }
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
10743 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
10744 }
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
10745
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
10746 if (retry) {
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
10747 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
10748 /*
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
10749 * 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
10750 * 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
10751 */
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
10752 if ((cur_time - start_time) <
6539
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
10753 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
10754 /* sleep for a while */
6539
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
10755 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
10756 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
10757 }
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
10758 /* 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
10759 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
10760 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
10761 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
10762 /*
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
10763 * 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
10764 * 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
10765 * 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
10766 */
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
10767 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
10768 "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
10769 "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
10770 "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
10771 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
10772 } else {
6539
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
10773 SATA_CPORTINFO_DRV_INFO(cportinfo)->
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
10774 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
10775 }
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
10776 }
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
10777 mutex_exit(&cportinfo->cport_mutex);
6539
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
10778 }
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
10779 return (SATA_SUCCESS);
1781
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
10780 }
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
10781
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
10782 /*
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10783 * Reprobe a controller port that connected to a port multiplier.
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10784 *
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10785 * NOTE: No Mutex should be hold.
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10786 */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10787 static int
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10788 sata_reprobe_pmult(sata_hba_inst_t *sata_hba_inst, sata_device_t *sata_device,
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10789 int flag)
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10790 {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10791 _NOTE(ARGUNUSED(flag))
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10792 sata_cport_info_t *cportinfo;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10793 sata_pmult_info_t *pmultinfo;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10794 uint8_t cport = sata_device->satadev_addr.cport;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10795 int rval_probe;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10796
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10797 cportinfo = SATA_CPORT_INFO(sata_hba_inst, cport);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10798 pmultinfo = SATA_PMULT_INFO(sata_hba_inst, cport);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10799
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10800 /* probe port */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10801 mutex_enter(&cportinfo->cport_mutex);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10802 cportinfo->cport_state &= ~SATA_PORT_STATE_CLEAR_MASK;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10803 cportinfo->cport_state |= SATA_STATE_PROBING;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10804 mutex_exit(&cportinfo->cport_mutex);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10805
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10806 rval_probe = (*SATA_PROBE_PORT_FUNC(sata_hba_inst))
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10807 (SATA_DIP(sata_hba_inst), sata_device);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10808
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10809 mutex_enter(&cportinfo->cport_mutex);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10810 if (rval_probe != SATA_SUCCESS) {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10811 cportinfo->cport_state = SATA_PSTATE_FAILED;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10812 SATA_LOG_D((sata_hba_inst, CE_WARN, "sata_reprobe_pmult: "
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10813 "SATA port %d probing failed", cport));
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10814 sata_log(sata_hba_inst, CE_WARN,
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10815 "SATA port multiplier detached at port %d", cport);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10816 mutex_exit(&cportinfo->cport_mutex);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10817 sata_free_pmult(sata_hba_inst, sata_device);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10818 return (SATA_FAILURE);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10819 }
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10820
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10821 /*
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10822 * update sata port state and set device type
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10823 */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10824 sata_update_port_info(sata_hba_inst, sata_device);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10825 cportinfo->cport_state &= ~SATA_STATE_PROBING;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10826 cportinfo->cport_state |= SATA_STATE_PROBED;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10827
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10828 /*
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10829 * Sanity check - Port is active? Is the link active?
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10830 * Is there any device attached?
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10831 */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10832 if ((cportinfo->cport_state &
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10833 (SATA_PSTATE_SHUTDOWN | SATA_PSTATE_FAILED)) ||
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10834 (cportinfo->cport_scr.sstatus & SATA_PORT_DEVLINK_UP_MASK) !=
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10835 SATA_PORT_DEVLINK_UP ||
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10836 (sata_device->satadev_type == SATA_DTYPE_NONE)) {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10837 cportinfo->cport_dev_type = SATA_DTYPE_NONE;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10838 mutex_exit(&cportinfo->cport_mutex);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10839 sata_free_pmult(sata_hba_inst, sata_device);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10840 sata_log(sata_hba_inst, CE_WARN,
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10841 "SATA port multiplier detached at port %d", cport);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10842 return (SATA_SUCCESS);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10843 }
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10844
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10845 /*
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10846 * Device changed: PMult -> Non-PMult
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10847 *
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10848 * This situation is uncommon, most possibly being caused by errors
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10849 * after which the port multiplier is not correct initialized and
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10850 * recognized. In that case the new device will be marked as unknown
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10851 * and will not be automatically probed in this routine. Instead
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10852 * system administrator could manually restart it via cfgadm(1M).
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10853 */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10854 if (sata_device->satadev_type != SATA_DTYPE_PMULT) {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10855 cportinfo->cport_dev_type = SATA_DTYPE_UNKNOWN;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10856 mutex_exit(&cportinfo->cport_mutex);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10857 sata_free_pmult(sata_hba_inst, sata_device);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10858 sata_log(sata_hba_inst, CE_WARN,
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10859 "SATA port multiplier detached at port %d", cport);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10860 return (SATA_FAILURE);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10861 }
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10862
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10863 /*
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10864 * Now we know it is a port multiplier. However, if this is not the
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10865 * previously attached port multiplier - they may have different
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10866 * pmport numbers - we need to re-allocate data structures for every
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10867 * pmport and drive.
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10868 *
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10869 * Port multipliers of the same model have identical values in these
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10870 * registers, so it is still necessary to update the information of
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10871 * all drives attached to the previous port multiplier afterwards.
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10872 */
10663
4d59e1faf654 6881565 sata hba interfaces need to keep backward compatibility
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10427
diff changeset
10873 /* Device changed: PMult -> another PMult */
4d59e1faf654 6881565 sata hba interfaces need to keep backward compatibility
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10427
diff changeset
10874 mutex_exit(&cportinfo->cport_mutex);
4d59e1faf654 6881565 sata hba interfaces need to keep backward compatibility
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10427
diff changeset
10875 sata_free_pmult(sata_hba_inst, sata_device);
4d59e1faf654 6881565 sata hba interfaces need to keep backward compatibility
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10427
diff changeset
10876 if (sata_alloc_pmult(sata_hba_inst, sata_device) != SATA_SUCCESS)
4d59e1faf654 6881565 sata hba interfaces need to keep backward compatibility
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10427
diff changeset
10877 return (SATA_FAILURE);
4d59e1faf654 6881565 sata hba interfaces need to keep backward compatibility
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10427
diff changeset
10878 mutex_enter(&cportinfo->cport_mutex);
4d59e1faf654 6881565 sata hba interfaces need to keep backward compatibility
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10427
diff changeset
10879
4d59e1faf654 6881565 sata hba interfaces need to keep backward compatibility
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10427
diff changeset
10880 SATADBG1(SATA_DBG_PMULT, sata_hba_inst,
4d59e1faf654 6881565 sata hba interfaces need to keep backward compatibility
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10427
diff changeset
10881 "SATA port multiplier [changed] at port %d", cport);
4d59e1faf654 6881565 sata hba interfaces need to keep backward compatibility
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10427
diff changeset
10882 sata_log(sata_hba_inst, CE_WARN,
4d59e1faf654 6881565 sata hba interfaces need to keep backward compatibility
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10427
diff changeset
10883 "SATA port multiplier detected at port %d", cport);
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10884
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10885 /*
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10886 * Mark all the port multiplier port behind the port
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10887 * multiplier behind with link events, so that the sata daemon
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10888 * will update their status.
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10889 */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10890 pmultinfo->pmult_event_flags |= SATA_EVNT_DEVICE_RESET;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10891 mutex_exit(&cportinfo->cport_mutex);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10892
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10893 return (SATA_SUCCESS);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10894 }
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10895
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10896 /*
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10897 * Re-probe a port multiplier port, check for a device and attach info
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10898 * structures when necessary. Identify Device data is fetched, if possible.
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10899 * Assumption: sata address is already validated as port multiplier port.
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10900 * SATA_SUCCESS is returned if port is re-probed sucessfully, regardless of
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10901 * the presence of a device and its type.
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10902 *
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10903 * flag arg specifies that the function should try multiple times to identify
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10904 * device type and to initialize it, or it should return immediately on failure.
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10905 * SATA_DEV_IDENTIFY_RETRY - retry
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10906 * SATA_DEV_IDENTIFY_NORETRY - no retry
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10907 *
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10908 * SATA_FAILURE is returned if one of the operations failed.
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10909 *
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10910 * This function cannot be called in interrupt context - it may sleep.
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10911 *
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10912 * NOTE: Should be only called by sata_probe_port() in case target port is a
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10913 * port multiplier port.
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10914 * NOTE: No Mutex should be hold.
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10915 */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10916 static int
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10917 sata_reprobe_pmport(sata_hba_inst_t *sata_hba_inst, sata_device_t *sata_device,
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10918 int flag)
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10919 {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10920 sata_cport_info_t *cportinfo = NULL;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10921 sata_pmport_info_t *pmportinfo = NULL;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10922 sata_drive_info_t *sdinfo, *osdinfo;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10923 sata_device_t sdevice;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10924 boolean_t init_device = B_FALSE;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10925 int prev_device_type = SATA_DTYPE_NONE;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10926 int prev_device_settings = 0;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10927 int prev_device_state = 0;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10928 clock_t start_time;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10929 uint8_t cport = sata_device->satadev_addr.cport;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10930 uint8_t pmport = sata_device->satadev_addr.pmport;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10931 int rval;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10932
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10933 cportinfo = SATA_CPORT_INFO(sata_hba_inst, cport);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10934 pmportinfo = SATA_PMPORT_INFO(sata_hba_inst, cport, pmport);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10935 osdinfo = SATA_PMPORTINFO_DRV_INFO(pmportinfo);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10936
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10937 if (osdinfo != NULL) {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10938 /*
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10939 * We are re-probing port with a previously attached device.
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10940 * Save previous device type and settings.
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10941 */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10942 prev_device_type = pmportinfo->pmport_dev_type;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10943 prev_device_settings = osdinfo->satadrv_settings;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10944 prev_device_state = osdinfo->satadrv_state;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10945 }
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10946
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10947 start_time = ddi_get_lbolt();
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10948
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10949 /* check parent status */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10950 mutex_enter(&cportinfo->cport_mutex);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10951 if ((cportinfo->cport_state &
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10952 (SATA_PSTATE_SHUTDOWN | SATA_PSTATE_FAILED)) ||
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10953 (cportinfo->cport_scr.sstatus & SATA_PORT_DEVLINK_UP_MASK) !=
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10954 SATA_PORT_DEVLINK_UP) {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10955 mutex_exit(&cportinfo->cport_mutex);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10956 return (SATA_FAILURE);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10957 }
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10958 mutex_exit(&cportinfo->cport_mutex);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10959
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10960 retry_probe_pmport:
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10961
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10962 /* probe port */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10963 mutex_enter(&pmportinfo->pmport_mutex);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10964 pmportinfo->pmport_state &= ~SATA_PORT_STATE_CLEAR_MASK;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10965 pmportinfo->pmport_state |= SATA_STATE_PROBING;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10966 mutex_exit(&pmportinfo->pmport_mutex);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10967
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10968 rval = (*SATA_PROBE_PORT_FUNC(sata_hba_inst))
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10969 (SATA_DIP(sata_hba_inst), sata_device);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10970
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10971 /* might need retry because we cannot touch registers. */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10972 if (rval == SATA_FAILURE) {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10973 mutex_enter(&pmportinfo->pmport_mutex);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10974 pmportinfo->pmport_state = SATA_PSTATE_FAILED;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10975 mutex_exit(&pmportinfo->pmport_mutex);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10976 SATA_LOG_D((sata_hba_inst, CE_WARN, "sata_reprobe_pmport: "
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10977 "SATA port %d:%d probing failed",
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10978 cport, pmport));
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10979 return (SATA_FAILURE);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10980 } else if (rval == SATA_RETRY) {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10981 SATA_LOG_D((sata_hba_inst, CE_WARN, "sata_reprobe_pmport: "
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10982 "SATA port %d:%d probing failed, retrying...",
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10983 cport, pmport));
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10984 clock_t cur_time = ddi_get_lbolt();
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10985 /*
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10986 * A device was not successfully identified or initialized.
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10987 * Track retry time for device identification.
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10988 */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10989 if ((cur_time - start_time) <
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10990 drv_usectohz(SATA_DEV_REPROBE_TIMEOUT)) {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10991 /* sleep for a while */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10992 delay(drv_usectohz(SATA_DEV_RETRY_DLY));
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10993 goto retry_probe_pmport;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10994 } else {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10995 mutex_enter(&pmportinfo->pmport_mutex);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10996 if (SATA_PMPORTINFO_DRV_INFO(pmportinfo) != NULL)
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10997 SATA_PMPORTINFO_DRV_INFO(pmportinfo)->
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10998 satadrv_state = SATA_DSTATE_FAILED;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
10999 mutex_exit(&pmportinfo->pmport_mutex);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11000 return (SATA_SUCCESS);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11001 }
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11002 }
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11003
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11004 /*
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11005 * Sanity check - Controller port is active? Is the link active?
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11006 * Is it still a port multiplier?
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11007 */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11008 if ((cportinfo->cport_state &
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11009 (SATA_PSTATE_SHUTDOWN | SATA_PSTATE_FAILED)) ||
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11010 (cportinfo->cport_scr.sstatus & SATA_PORT_DEVLINK_UP_MASK) !=
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11011 SATA_PORT_DEVLINK_UP ||
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11012 (cportinfo->cport_dev_type != SATA_DTYPE_PMULT)) {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11013 /*
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11014 * Port in non-usable state or no link active/no
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11015 * device. Free info structure.
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11016 */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11017 cportinfo->cport_dev_type = SATA_DTYPE_UNKNOWN;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11018
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11019 sdevice.satadev_addr.cport = cport;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11020 sdevice.satadev_addr.pmport = pmport;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11021 sdevice.satadev_addr.qual = SATA_ADDR_PMULT;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11022 mutex_exit(&cportinfo->cport_mutex);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11023
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11024 sata_free_pmult(sata_hba_inst, &sdevice);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11025 return (SATA_FAILURE);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11026 }
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11027
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11028 /* SATA_SUCCESS NOW */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11029 /*
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11030 * update sata port state and set device type
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11031 */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11032 mutex_enter(&pmportinfo->pmport_mutex);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11033 sata_update_pmport_info(sata_hba_inst, sata_device);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11034 pmportinfo->pmport_state &= ~SATA_STATE_PROBING;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11035
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11036 /*
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11037 * Sanity check - Port is active? Is the link active?
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11038 * Is there any device attached?
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11039 */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11040 if ((pmportinfo->pmport_state &
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11041 (SATA_PSTATE_SHUTDOWN | SATA_PSTATE_FAILED)) ||
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11042 (pmportinfo->pmport_scr.sstatus & SATA_PORT_DEVLINK_UP_MASK) !=
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11043 SATA_PORT_DEVLINK_UP) {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11044 /*
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11045 * Port in non-usable state or no link active/no device.
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11046 * Free info structure if necessary (direct attached drive
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11047 * only, for now!
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11048 */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11049 sdinfo = SATA_PMPORTINFO_DRV_INFO(pmportinfo);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11050 SATA_PMPORTINFO_DRV_INFO(pmportinfo) = NULL;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11051 /* Add here differentiation for device attached or not */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11052 pmportinfo->pmport_dev_type = SATA_DTYPE_NONE;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11053 mutex_exit(&pmportinfo->pmport_mutex);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11054 if (sdinfo != NULL)
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11055 kmem_free(sdinfo, sizeof (sata_drive_info_t));
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11056 return (SATA_SUCCESS);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11057 }
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11058
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11059 pmportinfo->pmport_state |= SATA_STATE_READY;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11060 pmportinfo->pmport_dev_type = sata_device->satadev_type;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11061 sdinfo = SATA_PMPORTINFO_DRV_INFO(pmportinfo);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11062
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11063 /*
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11064 * If we are re-probing the port, there may be
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11065 * sata_drive_info structure attached
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11066 * (or sata_pm_info, if PMult is supported).
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11067 */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11068 if (sata_device->satadev_type == SATA_DTYPE_NONE) {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11069 /*
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11070 * There is no device, so remove device info structure,
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11071 * if necessary.
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11072 */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11073 SATA_PMPORTINFO_DRV_INFO(pmportinfo) = NULL;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11074 pmportinfo->pmport_dev_type = SATA_DTYPE_NONE;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11075 if (sdinfo != NULL) {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11076 kmem_free(sdinfo, sizeof (sata_drive_info_t));
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11077 sata_log(sata_hba_inst, CE_WARN,
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11078 "SATA device detached from port %d:%d",
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11079 cport, pmport);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11080 }
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11081 mutex_exit(&pmportinfo->pmport_mutex);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11082 return (SATA_SUCCESS);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11083 }
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11084
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11085 /* this should not be a pmult */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11086 ASSERT(sata_device->satadev_type != SATA_DTYPE_PMULT);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11087 if (sdinfo == NULL) {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11088 /*
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11089 * There is some device attached, but there is
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11090 * no sata_drive_info structure - allocate one
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11091 */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11092 mutex_exit(&pmportinfo->pmport_mutex);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11093 sdinfo = kmem_zalloc(sizeof (sata_drive_info_t),
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11094 KM_SLEEP);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11095 mutex_enter(&pmportinfo->pmport_mutex);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11096 /*
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11097 * Recheck, that the port state did not change when we
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11098 * released mutex.
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11099 */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11100 if (pmportinfo->pmport_state & SATA_STATE_READY) {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11101 SATA_PMPORTINFO_DRV_INFO(pmportinfo) = sdinfo;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11102 sdinfo->satadrv_addr = pmportinfo->pmport_addr;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11103 sdinfo->satadrv_addr.qual = SATA_ADDR_DPMPORT;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11104 sdinfo->satadrv_type = SATA_DTYPE_UNKNOWN;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11105 sdinfo->satadrv_state = SATA_STATE_UNKNOWN;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11106 } else {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11107 /*
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11108 * Port is not in ready state, we
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11109 * cannot attach a device.
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11110 */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11111 mutex_exit(&pmportinfo->pmport_mutex);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11112 kmem_free(sdinfo, sizeof (sata_drive_info_t));
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11113 return (SATA_SUCCESS);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11114 }
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11115 /*
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11116 * Since we are adding device, presumably new one,
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11117 * indicate that it should be initalized,
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11118 * as well as some internal framework states).
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11119 */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11120 init_device = B_TRUE;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11121 }
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11122
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11123 pmportinfo->pmport_dev_type = SATA_DTYPE_UNKNOWN;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11124 sata_device->satadev_addr.qual = sdinfo->satadrv_addr.qual;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11125
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11126 mutex_exit(&pmportinfo->pmport_mutex);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11127 /*
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11128 * Figure out what kind of device we are really
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11129 * dealing with.
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11130 */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11131 rval = sata_probe_device(sata_hba_inst, sata_device);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11132
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11133 mutex_enter(&pmportinfo->pmport_mutex);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11134 if (rval == SATA_SUCCESS) {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11135 /*
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11136 * If we are dealing with the same type of a device as before,
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11137 * restore its settings flags.
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11138 */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11139 if (osdinfo != NULL &&
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11140 sata_device->satadev_type == prev_device_type)
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11141 sdinfo->satadrv_settings = prev_device_settings;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11142
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11143 mutex_exit(&pmportinfo->pmport_mutex);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11144 /* Set initial device features, if necessary */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11145 if (init_device == B_TRUE) {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11146 rval = sata_initialize_device(sata_hba_inst, sdinfo);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11147 }
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11148 if (rval == SATA_SUCCESS)
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11149 return (rval);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11150 } else {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11151 /*
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11152 * If there was some device info before we probe the device,
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11153 * restore previous device setting, so we can retry from scratch
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11154 * later. Providing, of course, that device has not disappeared
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11155 * during probing process.
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11156 */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11157 if (sata_device->satadev_type != SATA_DTYPE_NONE) {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11158 if (osdinfo != NULL) {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11159 pmportinfo->pmport_dev_type = prev_device_type;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11160 sdinfo->satadrv_type = prev_device_type;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11161 sdinfo->satadrv_state = prev_device_state;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11162 }
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11163 } else {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11164 /* device is gone */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11165 kmem_free(sdinfo, sizeof (sata_drive_info_t));
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11166 pmportinfo->pmport_dev_type = SATA_DTYPE_NONE;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11167 SATA_PMPORTINFO_DRV_INFO(pmportinfo) = NULL;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11168 mutex_exit(&pmportinfo->pmport_mutex);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11169 return (SATA_SUCCESS);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11170 }
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11171 mutex_exit(&pmportinfo->pmport_mutex);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11172 }
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11173
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11174 if (flag == SATA_DEV_IDENTIFY_RETRY) {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11175 clock_t cur_time = ddi_get_lbolt();
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11176 /*
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11177 * A device was not successfully identified or initialized.
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11178 * Track retry time for device identification.
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11179 */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11180 if ((cur_time - start_time) <
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11181 drv_usectohz(SATA_DEV_REPROBE_TIMEOUT)) {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11182 /* sleep for a while */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11183 delay(drv_usectohz(SATA_DEV_RETRY_DLY));
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11184 goto retry_probe_pmport;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11185 } else {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11186 mutex_enter(&pmportinfo->pmport_mutex);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11187 if (SATA_PMPORTINFO_DRV_INFO(pmportinfo) != NULL)
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11188 SATA_PMPORTINFO_DRV_INFO(pmportinfo)->
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11189 satadrv_state = SATA_DSTATE_FAILED;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11190 mutex_exit(&pmportinfo->pmport_mutex);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11191 }
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11192 }
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11193 return (SATA_SUCCESS);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11194 }
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11195
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11196 /*
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11197 * Allocated related structure for a port multiplier and its device ports
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11198 *
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11199 * Port multiplier should be ready and probed, and related information like
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11200 * the number of the device ports should be store in sata_device_t.
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11201 *
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11202 * NOTE: No Mutex should be hold.
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11203 */
10663
4d59e1faf654 6881565 sata hba interfaces need to keep backward compatibility
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10427
diff changeset
11204 static int
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11205 sata_alloc_pmult(sata_hba_inst_t *sata_hba_inst, sata_device_t *sata_device)
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11206 {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11207 dev_info_t *dip = SATA_DIP(sata_hba_inst);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11208 sata_cport_info_t *cportinfo = NULL;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11209 sata_pmult_info_t *pmultinfo = NULL;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11210 sata_pmport_info_t *pmportinfo = NULL;
10663
4d59e1faf654 6881565 sata hba interfaces need to keep backward compatibility
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10427
diff changeset
11211 sata_device_t sd;
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11212 dev_t minor_number;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11213 char name[16];
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11214 uint8_t cport = sata_device->satadev_addr.cport;
10663
4d59e1faf654 6881565 sata hba interfaces need to keep backward compatibility
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10427
diff changeset
11215 int rval;
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11216 int npmport;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11217
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11218 cportinfo = SATA_CPORT_INFO(sata_hba_inst, cport);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11219
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11220 /* This function might be called while a port-mult is hot-plugged. */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11221 mutex_enter(&cportinfo->cport_mutex);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11222
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11223 /* dev_type's not updated when get called from sata_reprobe_port() */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11224 if (SATA_CPORTINFO_PMULT_INFO(cportinfo) == NULL) {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11225 /* Create a pmult_info structure */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11226 SATA_CPORTINFO_PMULT_INFO(cportinfo) =
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11227 kmem_zalloc(sizeof (sata_pmult_info_t), KM_SLEEP);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11228 }
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11229 pmultinfo = SATA_CPORTINFO_PMULT_INFO(cportinfo);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11230
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11231 pmultinfo->pmult_addr = sata_device->satadev_addr;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11232 pmultinfo->pmult_addr.qual = SATA_ADDR_PMULT;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11233 pmultinfo->pmult_state = SATA_STATE_PROBING;
10663
4d59e1faf654 6881565 sata hba interfaces need to keep backward compatibility
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10427
diff changeset
11234
4d59e1faf654 6881565 sata hba interfaces need to keep backward compatibility
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10427
diff changeset
11235 /*
4d59e1faf654 6881565 sata hba interfaces need to keep backward compatibility
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10427
diff changeset
11236 * Probe the port multiplier with qualifier SATA_ADDR_PMULT_SPEC,
4d59e1faf654 6881565 sata hba interfaces need to keep backward compatibility
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10427
diff changeset
11237 * The HBA driver should initialize and register the port multiplier,
4d59e1faf654 6881565 sata hba interfaces need to keep backward compatibility
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10427
diff changeset
11238 * sata_register_pmult() will fill following fields,
4d59e1faf654 6881565 sata hba interfaces need to keep backward compatibility
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10427
diff changeset
11239 * + sata_pmult_info.pmult_gscr
4d59e1faf654 6881565 sata hba interfaces need to keep backward compatibility
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10427
diff changeset
11240 * + sata_pmult_info.pmult_num_dev_ports
4d59e1faf654 6881565 sata hba interfaces need to keep backward compatibility
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10427
diff changeset
11241 */
4d59e1faf654 6881565 sata hba interfaces need to keep backward compatibility
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10427
diff changeset
11242 sd.satadev_addr = sata_device->satadev_addr;
4d59e1faf654 6881565 sata hba interfaces need to keep backward compatibility
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10427
diff changeset
11243 sd.satadev_addr.qual = SATA_ADDR_PMULT_SPEC;
4d59e1faf654 6881565 sata hba interfaces need to keep backward compatibility
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10427
diff changeset
11244 mutex_exit(&cportinfo->cport_mutex);
4d59e1faf654 6881565 sata hba interfaces need to keep backward compatibility
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10427
diff changeset
11245 rval = (*SATA_PROBE_PORT_FUNC(sata_hba_inst))
4d59e1faf654 6881565 sata hba interfaces need to keep backward compatibility
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10427
diff changeset
11246 (SATA_DIP(sata_hba_inst), &sd);
4d59e1faf654 6881565 sata hba interfaces need to keep backward compatibility
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10427
diff changeset
11247 mutex_enter(&cportinfo->cport_mutex);
4d59e1faf654 6881565 sata hba interfaces need to keep backward compatibility
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10427
diff changeset
11248
4d59e1faf654 6881565 sata hba interfaces need to keep backward compatibility
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10427
diff changeset
11249 if (rval != SATA_SUCCESS ||
4d59e1faf654 6881565 sata hba interfaces need to keep backward compatibility
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10427
diff changeset
11250 (sd.satadev_type != SATA_DTYPE_PMULT) ||
4d59e1faf654 6881565 sata hba interfaces need to keep backward compatibility
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10427
diff changeset
11251 !(sd.satadev_state & SATA_DSTATE_PMULT_INIT)) {
4d59e1faf654 6881565 sata hba interfaces need to keep backward compatibility
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10427
diff changeset
11252 SATA_CPORTINFO_PMULT_INFO(cportinfo) = NULL;
4d59e1faf654 6881565 sata hba interfaces need to keep backward compatibility
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10427
diff changeset
11253 kmem_free(pmultinfo, sizeof (sata_pmult_info_t));
4d59e1faf654 6881565 sata hba interfaces need to keep backward compatibility
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10427
diff changeset
11254 cportinfo->cport_state = SATA_PSTATE_FAILED;
4d59e1faf654 6881565 sata hba interfaces need to keep backward compatibility
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10427
diff changeset
11255 cportinfo->cport_dev_type = SATA_DTYPE_UNKNOWN;
4d59e1faf654 6881565 sata hba interfaces need to keep backward compatibility
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10427
diff changeset
11256 mutex_exit(&cportinfo->cport_mutex);
4d59e1faf654 6881565 sata hba interfaces need to keep backward compatibility
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10427
diff changeset
11257 SATADBG1(SATA_DBG_PMULT, sata_hba_inst,
4d59e1faf654 6881565 sata hba interfaces need to keep backward compatibility
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10427
diff changeset
11258 "sata_alloc_pmult: failed to initialize pmult "
4d59e1faf654 6881565 sata hba interfaces need to keep backward compatibility
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10427
diff changeset
11259 "at port %d.", cport)
4d59e1faf654 6881565 sata hba interfaces need to keep backward compatibility
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10427
diff changeset
11260 return (SATA_FAILURE);
4d59e1faf654 6881565 sata hba interfaces need to keep backward compatibility
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10427
diff changeset
11261 }
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11262
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11263 /* Initialize pmport_info structure */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11264 for (npmport = 0; npmport < pmultinfo->pmult_num_dev_ports;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11265 npmport++) {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11266
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11267 /* if everything is allocated, skip */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11268 if (SATA_PMPORT_INFO(sata_hba_inst, cport, npmport) != NULL)
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11269 continue;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11270
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11271 pmportinfo = kmem_zalloc(sizeof (sata_pmport_info_t), KM_SLEEP);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11272 mutex_init(&pmportinfo->pmport_mutex, NULL, MUTEX_DRIVER, NULL);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11273 mutex_exit(&cportinfo->cport_mutex);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11274
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11275 mutex_enter(&pmportinfo->pmport_mutex);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11276 pmportinfo->pmport_addr.cport = cport;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11277 pmportinfo->pmport_addr.pmport = (uint8_t)npmport;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11278 pmportinfo->pmport_addr.qual = SATA_ADDR_PMPORT;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11279 pmportinfo->pmport_state &= ~SATA_PORT_STATE_CLEAR_MASK;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11280 mutex_exit(&pmportinfo->pmport_mutex);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11281
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11282 mutex_enter(&cportinfo->cport_mutex);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11283 SATA_PMPORT_INFO(sata_hba_inst, cport, npmport) = pmportinfo;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11284
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11285 /* Create an attachment point */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11286 minor_number = SATA_MAKE_AP_MINOR(ddi_get_instance(dip),
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11287 cport, (uint8_t)npmport, SATA_ADDR_PMPORT);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11288 (void) sprintf(name, "%d.%d", cport, npmport);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11289
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11290 if (ddi_create_minor_node(dip, name, S_IFCHR, minor_number,
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11291 DDI_NT_SATA_ATTACHMENT_POINT, 0) != DDI_SUCCESS) {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11292 sata_log(sata_hba_inst, CE_WARN, "sata_hba_attach: "
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11293 "cannot create SATA attachment point for "
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11294 "port %d:%d", cport, npmport);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11295 }
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11296 }
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11297
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11298 pmultinfo->pmult_state &= ~SATA_STATE_PROBING;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11299 pmultinfo->pmult_state |= (SATA_STATE_PROBED|SATA_STATE_READY);
11104
166a083c78c5 6900065 System crash when running diskomizer on disks connected to host via SIL3726
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 11066
diff changeset
11300 cportinfo->cport_dev_type = SATA_DTYPE_PMULT;
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11301
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11302 mutex_exit(&cportinfo->cport_mutex);
10663
4d59e1faf654 6881565 sata hba interfaces need to keep backward compatibility
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10427
diff changeset
11303 return (SATA_SUCCESS);
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11304 }
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11305
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11306 /*
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11307 * Free data structures when a port multiplier is removed.
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11308 *
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11309 * NOTE: No Mutex should be hold.
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11310 */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11311 static void
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11312 sata_free_pmult(sata_hba_inst_t *sata_hba_inst, sata_device_t *sata_device)
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11313 {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11314 sata_cport_info_t *cportinfo;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11315 sata_pmult_info_t *pmultinfo;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11316 sata_pmport_info_t *pmportinfo;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11317 sata_device_t pmport_device;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11318 sata_drive_info_t *sdinfo;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11319 dev_info_t *tdip;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11320 char name[16];
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11321 uint8_t cport = sata_device->satadev_addr.cport;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11322 int npmport;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11323
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11324 cportinfo = SATA_CPORT_INFO(sata_hba_inst, cport);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11325
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11326 /* This function might be called while port-mult is hot plugged. */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11327 mutex_enter(&cportinfo->cport_mutex);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11328
11104
166a083c78c5 6900065 System crash when running diskomizer on disks connected to host via SIL3726
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 11066
diff changeset
11329 cportinfo->cport_dev_type = SATA_DTYPE_NONE;
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11330 pmultinfo = SATA_CPORTINFO_PMULT_INFO(cportinfo);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11331 ASSERT(pmultinfo != NULL);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11332
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11333 /* Free pmport_info structure */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11334 for (npmport = 0; npmport < pmultinfo->pmult_num_dev_ports;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11335 npmport++) {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11336 pmportinfo = SATA_PMPORT_INFO(sata_hba_inst, cport, npmport);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11337 if (pmportinfo == NULL)
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11338 continue;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11339 mutex_exit(&cportinfo->cport_mutex);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11340
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11341 mutex_enter(&pmportinfo->pmport_mutex);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11342 sdinfo = pmportinfo->pmport_sata_drive;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11343 SATA_PMPORTINFO_DRV_INFO(pmportinfo) = NULL;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11344 mutex_exit(&pmportinfo->pmport_mutex);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11345
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11346 /* Remove attachment point. */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11347 name[0] = '\0';
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11348 (void) sprintf(name, "%d.%d", cport, npmport);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11349 ddi_remove_minor_node(SATA_DIP(sata_hba_inst), name);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11350 sata_log(sata_hba_inst, CE_NOTE,
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11351 "Remove attachment point of port %d:%d",
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11352 cport, npmport);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11353
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11354 /*
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11355 * Rumove target node
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11356 */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11357 bzero(&pmport_device, sizeof (sata_device_t));
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11358 pmport_device.satadev_rev = SATA_DEVICE_REV;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11359 pmport_device.satadev_addr.cport = cport;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11360 pmport_device.satadev_addr.pmport = (uint8_t)npmport;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11361 pmport_device.satadev_addr.qual = SATA_ADDR_DPMPORT;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11362
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11363 tdip = sata_get_scsi_target_dip(SATA_DIP(sata_hba_inst),
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11364 &(pmport_device.satadev_addr));
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11365 if (tdip != NULL && ndi_devi_offline(tdip,
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11366 NDI_DEVI_REMOVE) != NDI_SUCCESS) {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11367 /*
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11368 * Problem :
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11369 * The target node remained attached.
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11370 * This happens when the device file was open
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11371 * or a node was waiting for resources.
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11372 * Cannot do anything about it.
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11373 */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11374 SATA_LOG_D((sata_hba_inst, CE_WARN,
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11375 "sata_free_pmult: could not unconfigure device "
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11376 "before disconnecting the SATA port %d:%d",
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11377 cport, npmport));
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11378
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11379 /*
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11380 * Set DEVICE REMOVED state in the target
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11381 * node. It will prevent access to the device
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11382 * even when a new device is attached, until
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11383 * the old target node is released, removed and
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11384 * recreated for a new device.
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11385 */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11386 sata_set_device_removed(tdip);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11387
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11388 /*
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11389 * Instruct event daemon to try the target
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11390 * node cleanup later.
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11391 */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11392 sata_set_target_node_cleanup(
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11393 sata_hba_inst, &(pmport_device.satadev_addr));
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11394
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11395 }
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11396 mutex_enter(&cportinfo->cport_mutex);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11397
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11398 /*
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11399 * Add here differentiation for device attached or not
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11400 */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11401 if (sdinfo != NULL) {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11402 sata_log(sata_hba_inst, CE_WARN,
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11403 "SATA device detached from port %d:%d",
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11404 cport, npmport);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11405 kmem_free(sdinfo, sizeof (sata_drive_info_t));
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11406 }
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11407
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11408 mutex_destroy(&pmportinfo->pmport_mutex);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11409 kmem_free(pmportinfo, sizeof (sata_pmport_info_t));
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11410 }
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11411
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11412 kmem_free(pmultinfo, sizeof (sata_pmult_info_t));
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11413
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11414 cportinfo->cport_devp.cport_sata_pmult = NULL;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11415
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11416 sata_log(sata_hba_inst, CE_WARN,
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11417 "SATA port multiplier detached at port %d", cport);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11418
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11419 mutex_exit(&cportinfo->cport_mutex);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11420 }
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11421
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11422 /*
1781
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
11423 * Initialize device
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
11424 * Specified device is initialized to a default state.
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
11425 *
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
11426 * 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
11427 * 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
11428 * successfully, and SATA_FAILURE otherwise.
1781
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
11429 */
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
11430 static int
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
11431 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
11432 sata_drive_info_t *sdinfo)
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
11433 {
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
11434 int rval;
1781
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
11435
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
11436 sata_save_drive_settings(sdinfo);
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
11437
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
11438 sdinfo->satadrv_settings |= SATA_DEV_READ_AHEAD;
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
11439
2734
1a2f23099c2a 6428449 sata disks have read cache disabled after being hot-plugged
pawelw
parents: 2593
diff changeset
11440 sata_init_write_cache_mode(sdinfo);
1a2f23099c2a 6428449 sata disks have read cache disabled after being hot-plugged
pawelw
parents: 2593
diff changeset
11441
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
11442 rval = sata_set_drive_features(sata_hba_inst, sdinfo, 0);
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 /* Determine current data transfer mode */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
11445 if ((sdinfo->satadrv_id.ai_cap & SATA_DMA_SUPPORT) == 0) {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
11446 sdinfo->satadrv_settings &= ~SATA_DEV_DMA;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
11447 } else if ((sdinfo->satadrv_id.ai_validinfo &
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
11448 SATA_VALIDINFO_88) != 0 &&
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
11449 (sdinfo->satadrv_id.ai_ultradma & SATA_UDMA_SEL_MASK) != 0) {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
11450 sdinfo->satadrv_settings |= SATA_DEV_DMA;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
11451 } else if ((sdinfo->satadrv_id.ai_dworddma &
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
11452 SATA_MDMA_SEL_MASK) != 0) {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
11453 sdinfo->satadrv_settings |= SATA_DEV_DMA;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
11454 } else
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
11455 /* DMA supported, not no DMA transfer mode is selected !? */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
11456 sdinfo->satadrv_settings &= ~SATA_DEV_DMA;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
11457
10131
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
11458 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
11459 (sdinfo->satadrv_id.ai_features86 & 0x20))
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
11460 sdinfo->satadrv_power_level = SATA_POWER_STANDBY;
10427
7d60ed90f743 6873542 forced core dump fails
Ada <Ada.Feng@Sun.COM>
parents: 10391
diff changeset
11461 else
7d60ed90f743 6873542 forced core dump fails
Ada <Ada.Feng@Sun.COM>
parents: 10391
diff changeset
11462 sdinfo->satadrv_power_level = SATA_POWER_ACTIVE;
10131
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
11463
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
11464 return (rval);
1781
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
11465 }
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
11466
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
11467
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
11468 /*
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
11469 * Initialize write cache mode.
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
11470 *
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
11471 * 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
11472 * static variable. ATAPI CD/DVDs devices have write cache default is
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
11473 * 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
11474 * 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
11475 * 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
11476 * 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
11477 * sata_atapidisk_write_cache static variable.
1781
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
11478 * 1 - enable
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
11479 * 0 - disable
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
11480 * any other value - current drive setting
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
11481 *
8317
249d7b80428e 6767262 ahci driver should support Dell PowerVault RD1000 backup device
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 8168
diff changeset
11482 * 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
11483 * 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
11484 * for the maximun flexibility.
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
11485 *
1781
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
11486 * 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
11487 * 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
11488 * 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
11489 * SATA_FAILURE otherwise.
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
11490 */
2734
1a2f23099c2a 6428449 sata disks have read cache disabled after being hot-plugged
pawelw
parents: 2593
diff changeset
11491 static void
1a2f23099c2a 6428449 sata disks have read cache disabled after being hot-plugged
pawelw
parents: 2593
diff changeset
11492 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
11493 {
8010
95c42a8a213e 6703522 ahci driver needs to support SATA tape
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 7954
diff changeset
11494 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
11495 case SATA_DTYPE_ATADISK:
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
11496 if (sata_write_cache == 1)
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
11497 sdinfo->satadrv_settings |= SATA_DEV_WRITE_CACHE;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
11498 else if (sata_write_cache == 0)
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
11499 sdinfo->satadrv_settings &= ~SATA_DEV_WRITE_CACHE;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
11500 /*
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
11501 * When sata_write_cache value is not 0 or 1,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
11502 * a current setting of the drive's write cache is used.
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
11503 */
8010
95c42a8a213e 6703522 ahci driver needs to support SATA tape
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 7954
diff changeset
11504 break;
95c42a8a213e 6703522 ahci driver needs to support SATA tape
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 7954
diff changeset
11505 case SATA_DTYPE_ATAPICD:
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
11506 if (sata_atapicdvd_write_cache == 1)
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
11507 sdinfo->satadrv_settings |= SATA_DEV_WRITE_CACHE;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
11508 else if (sata_atapicdvd_write_cache == 0)
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
11509 sdinfo->satadrv_settings &= ~SATA_DEV_WRITE_CACHE;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
11510 /*
8317
249d7b80428e 6767262 ahci driver should support Dell PowerVault RD1000 backup device
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 8168
diff changeset
11511 * 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
11512 * a current setting of the drive's write cache is used.
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
11513 */
8010
95c42a8a213e 6703522 ahci driver needs to support SATA tape
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 7954
diff changeset
11514 break;
95c42a8a213e 6703522 ahci driver needs to support SATA tape
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 7954
diff changeset
11515 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
11516 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
11517 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
11518 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
11519 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
11520 /*
8317
249d7b80428e 6767262 ahci driver should support Dell PowerVault RD1000 backup device
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 8168
diff changeset
11521 * 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
11522 * 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
11523 */
249d7b80428e 6767262 ahci driver should support Dell PowerVault RD1000 backup device
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 8168
diff changeset
11524 break;
249d7b80428e 6767262 ahci driver should support Dell PowerVault RD1000 backup device
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 8168
diff changeset
11525 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
11526 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
11527 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
11528 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
11529 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
11530 /*
249d7b80428e 6767262 ahci driver should support Dell PowerVault RD1000 backup device
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 8168
diff changeset
11531 * 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
11532 * 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
11533 */
95c42a8a213e 6703522 ahci driver needs to support SATA tape
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 7954
diff changeset
11534 break;
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
11535 }
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11536 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11537
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11538
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11539 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11540 * Validate sata address.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11541 * Specified cport, pmport and qualifier has to match
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11542 * passed sata_scsi configuration info.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11543 * The presence of an attached device is not verified.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11544 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11545 * Returns 0 when address is valid, -1 otherwise.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11546 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11547 static int
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11548 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
11549 int pmport, int qual)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11550 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11551 if (qual == SATA_ADDR_DCPORT && pmport != 0)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11552 goto invalid_address;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11553 if (cport >= SATA_NUM_CPORTS(sata_hba_inst))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11554 goto invalid_address;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11555 if ((qual == SATA_ADDR_DPMPORT || qual == SATA_ADDR_PMPORT) &&
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11556 ((SATA_CPORT_DEV_TYPE(sata_hba_inst, cport) != SATA_DTYPE_PMULT) ||
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11557 (SATA_PMULT_INFO(sata_hba_inst, cport) == NULL) ||
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11558 (pmport >= SATA_NUM_PMPORTS(sata_hba_inst, cport))))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11559 goto invalid_address;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11560
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11561 return (0);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11562
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11563 invalid_address:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11564 return (-1);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11565
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11566 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11567
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11568 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11569 * Validate scsi address
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11570 * SCSI target address is translated into SATA cport/pmport and compared
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11571 * with a controller port/device configuration. LUN has to be 0.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11572 * Returns 0 if a scsi target refers to an attached device,
10391
12b08c516444 6838603 Under heavy I/O load, all Seagate Dragonfly drives in an x4x40 go offline at the same time
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 10318
diff changeset
11573 * returns 1 if address is valid but no valid device is attached,
12b08c516444 6838603 Under heavy I/O load, all Seagate Dragonfly drives in an x4x40 go offline at the same time
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 10318
diff changeset
11574 * returns 2 if address is valid but device type is unknown (not valid device),
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11575 * returns -1 if bad address or device is of an unsupported type.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11576 * Upon return sata_device argument is set.
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11577 *
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11578 * Port multiplier is supported now.
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11579 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11580 static int
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11581 sata_validate_scsi_address(sata_hba_inst_t *sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11582 struct scsi_address *ap, sata_device_t *sata_device)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11583 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11584 int cport, pmport, qual, rval;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11585
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11586 rval = -1; /* Invalid address */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11587 if (ap->a_lun != 0)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11588 goto out;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11589
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11590 qual = SCSI_TO_SATA_ADDR_QUAL(ap->a_target);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11591 cport = SCSI_TO_SATA_CPORT(ap->a_target);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11592 pmport = SCSI_TO_SATA_PMPORT(ap->a_target);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11593
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11594 if (qual != SATA_ADDR_DCPORT && qual != SATA_ADDR_DPMPORT)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11595 goto out;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11596
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11597 if (sata_validate_sata_address(sata_hba_inst, cport, pmport, qual) ==
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11598 0) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11599
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11600 sata_cport_info_t *cportinfo;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11601 sata_pmult_info_t *pmultinfo;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11602 sata_drive_info_t *sdinfo = NULL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11603
10391
12b08c516444 6838603 Under heavy I/O load, all Seagate Dragonfly drives in an x4x40 go offline at the same time
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 10318
diff changeset
11604 sata_device->satadev_addr.qual = qual;
12b08c516444 6838603 Under heavy I/O load, all Seagate Dragonfly drives in an x4x40 go offline at the same time
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 10318
diff changeset
11605 sata_device->satadev_addr.cport = cport;
12b08c516444 6838603 Under heavy I/O load, all Seagate Dragonfly drives in an x4x40 go offline at the same time
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 10318
diff changeset
11606 sata_device->satadev_addr.pmport = pmport;
12b08c516444 6838603 Under heavy I/O load, all Seagate Dragonfly drives in an x4x40 go offline at the same time
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 10318
diff changeset
11607 sata_device->satadev_rev = SATA_DEVICE_REV_1;
12b08c516444 6838603 Under heavy I/O load, all Seagate Dragonfly drives in an x4x40 go offline at the same time
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 10318
diff changeset
11608
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11609 rval = 1; /* Valid sata address */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11610
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11611 cportinfo = SATA_CPORT_INFO(sata_hba_inst, cport);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11612 if (qual == SATA_ADDR_DCPORT) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11613 if (cportinfo == NULL ||
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11614 cportinfo->cport_dev_type == SATA_DTYPE_NONE)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11615 goto out;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11616
10391
12b08c516444 6838603 Under heavy I/O load, all Seagate Dragonfly drives in an x4x40 go offline at the same time
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 10318
diff changeset
11617 sdinfo = SATA_CPORTINFO_DRV_INFO(cportinfo);
12b08c516444 6838603 Under heavy I/O load, all Seagate Dragonfly drives in an x4x40 go offline at the same time
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 10318
diff changeset
11618 if (cportinfo->cport_dev_type == SATA_DTYPE_UNKNOWN &&
12b08c516444 6838603 Under heavy I/O load, all Seagate Dragonfly drives in an x4x40 go offline at the same time
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 10318
diff changeset
11619 sdinfo != NULL) {
12b08c516444 6838603 Under heavy I/O load, all Seagate Dragonfly drives in an x4x40 go offline at the same time
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 10318
diff changeset
11620 rval = 2;
12b08c516444 6838603 Under heavy I/O load, all Seagate Dragonfly drives in an x4x40 go offline at the same time
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 10318
diff changeset
11621 goto out;
12b08c516444 6838603 Under heavy I/O load, all Seagate Dragonfly drives in an x4x40 go offline at the same time
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 10318
diff changeset
11622 }
12b08c516444 6838603 Under heavy I/O load, all Seagate Dragonfly drives in an x4x40 go offline at the same time
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 10318
diff changeset
11623
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11624 if ((cportinfo->cport_dev_type &
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11625 SATA_VALID_DEV_TYPE) == 0) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11626 rval = -1;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11627 goto out;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11628 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11629
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11630 } else if (qual == SATA_ADDR_DPMPORT) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11631 pmultinfo = SATA_CPORTINFO_PMULT_INFO(cportinfo);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11632 if (pmultinfo == NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11633 rval = -1;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11634 goto out;
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 if (SATA_PMPORT_INFO(sata_hba_inst, cport, pmport) ==
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11637 NULL ||
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11638 SATA_PMPORT_DEV_TYPE(sata_hba_inst, cport,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11639 pmport) == SATA_DTYPE_NONE)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11640 goto out;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11641
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11642 sdinfo = SATA_PMPORT_DRV_INFO(sata_hba_inst, cport,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11643 pmport);
10391
12b08c516444 6838603 Under heavy I/O load, all Seagate Dragonfly drives in an x4x40 go offline at the same time
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 10318
diff changeset
11644 if (SATA_PMPORT_DEV_TYPE(sata_hba_inst, cport,
12b08c516444 6838603 Under heavy I/O load, all Seagate Dragonfly drives in an x4x40 go offline at the same time
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 10318
diff changeset
11645 pmport) == SATA_DTYPE_UNKNOWN && sdinfo != NULL) {
12b08c516444 6838603 Under heavy I/O load, all Seagate Dragonfly drives in an x4x40 go offline at the same time
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 10318
diff changeset
11646 rval = 2;
12b08c516444 6838603 Under heavy I/O load, all Seagate Dragonfly drives in an x4x40 go offline at the same time
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 10318
diff changeset
11647 goto out;
12b08c516444 6838603 Under heavy I/O load, all Seagate Dragonfly drives in an x4x40 go offline at the same time
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 10318
diff changeset
11648 }
12b08c516444 6838603 Under heavy I/O load, all Seagate Dragonfly drives in an x4x40 go offline at the same time
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 10318
diff changeset
11649
12b08c516444 6838603 Under heavy I/O load, all Seagate Dragonfly drives in an x4x40 go offline at the same time
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 10318
diff changeset
11650 if ((SATA_PMPORT_DEV_TYPE(sata_hba_inst, cport,
12b08c516444 6838603 Under heavy I/O load, all Seagate Dragonfly drives in an x4x40 go offline at the same time
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 10318
diff changeset
11651 pmport) && SATA_VALID_DEV_TYPE) == 0) {
12b08c516444 6838603 Under heavy I/O load, all Seagate Dragonfly drives in an x4x40 go offline at the same time
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 10318
diff changeset
11652 rval = -1;
12b08c516444 6838603 Under heavy I/O load, all Seagate Dragonfly drives in an x4x40 go offline at the same time
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 10318
diff changeset
11653 goto out;
12b08c516444 6838603 Under heavy I/O load, all Seagate Dragonfly drives in an x4x40 go offline at the same time
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 10318
diff changeset
11654 }
12b08c516444 6838603 Under heavy I/O load, all Seagate Dragonfly drives in an x4x40 go offline at the same time
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 10318
diff changeset
11655
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11656 } else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11657 rval = -1;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11658 goto out;
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 if ((sdinfo == NULL) ||
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11661 (sdinfo->satadrv_type & SATA_VALID_DEV_TYPE) == 0)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11662 goto out;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11663
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11664 sata_device->satadev_type = sdinfo->satadrv_type;
10391
12b08c516444 6838603 Under heavy I/O load, all Seagate Dragonfly drives in an x4x40 go offline at the same time
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 10318
diff changeset
11665
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11666 return (0);
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 out:
10391
12b08c516444 6838603 Under heavy I/O load, all Seagate Dragonfly drives in an x4x40 go offline at the same time
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 10318
diff changeset
11669 if (rval > 0) {
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11670 SATADBG2(SATA_DBG_SCSI_IF, sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11671 "sata_validate_scsi_address: no valid target %x lun %x",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11672 ap->a_target, ap->a_lun);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11673 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11674 return (rval);
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
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11677 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11678 * Find dip corresponding to passed device number
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11679 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11680 * 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
11681 * Returns dip is device is found.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11682 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11683 static dev_info_t *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11684 sata_devt_to_devinfo(dev_t dev)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11685 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11686 dev_info_t *dip;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11687 #ifndef __lock_lint
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11688 struct devnames *dnp;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11689 major_t major = getmajor(dev);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11690 int instance = SATA_MINOR2INSTANCE(getminor(dev));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11691
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11692 if (major >= devcnt)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11693 return (NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11694
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11695 dnp = &devnamesp[major];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11696 LOCK_DEV_OPS(&(dnp->dn_lock));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11697 dip = dnp->dn_head;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11698 while (dip && (ddi_get_instance(dip) != instance)) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11699 dip = ddi_get_next(dip);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11700 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11701 UNLOCK_DEV_OPS(&(dnp->dn_lock));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11702 #endif
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 return (dip);
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 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11709 * Probe device.
2734
1a2f23099c2a 6428449 sata disks have read cache disabled after being hot-plugged
pawelw
parents: 2593
diff changeset
11710 * This function issues Identify Device command and initializes local
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11711 * sata_drive_info structure if the device can be identified.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11712 * The device type is determined by examining Identify Device
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11713 * command response.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11714 * If the sata_hba_inst has linked drive info structure for this
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11715 * device address, the Identify Device data is stored into sata_drive_info
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11716 * structure linked to the port info structure.
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 * 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
11719 * by sata_hba_inst structure.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11720 *
4014
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
11721 * Returns:
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
11722 * 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
11723 * drive info structure was updated;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11724 * 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
11725 * successully;
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
11726 * SATA_RETRY if device probe can be retried later.
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11727 * 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
11728 * 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
11729 * 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
11730 * the caller.
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
11731 */
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
11732
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11733
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11734 static int
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11735 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
11736 {
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11737 sata_pmport_info_t *pmportinfo;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11738 sata_drive_info_t *sdinfo;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11739 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
11740 int rval;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11741
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11742 ASSERT((SATA_CPORT_STATE(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11743 sata_device->satadev_addr.cport) &
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11744 (SATA_STATE_PROBED | SATA_STATE_READY)) != 0);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11745
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11746 sata_device->satadev_type = SATA_DTYPE_NONE;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11747
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11748 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11749 sata_device->satadev_addr.cport)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11750
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11751 if (sata_device->satadev_addr.qual == SATA_ADDR_DPMPORT) {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11752 pmportinfo = SATA_PMPORT_INFO(sata_hba_inst,
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11753 sata_device->satadev_addr.cport,
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11754 sata_device->satadev_addr.pmport);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11755 ASSERT(pmportinfo != NULL);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11756 }
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11757
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11758 /* Get pointer to port-linked sata device info structure */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11759 sdinfo = sata_get_device_info(sata_hba_inst, sata_device);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11760 if (sdinfo != NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11761 sdinfo->satadrv_state &=
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11762 ~(SATA_STATE_PROBED | SATA_STATE_READY);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11763 sdinfo->satadrv_state |= SATA_STATE_PROBING;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11764 } else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11765 /* No device to probe */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11766 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11767 sata_device->satadev_addr.cport)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11768 sata_device->satadev_type = SATA_DTYPE_NONE;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11769 sata_device->satadev_state = SATA_STATE_UNKNOWN;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11770 return (SATA_FAILURE);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11771 }
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 * Need to issue both types of identify device command and
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11774 * determine device type by examining retreived data/status.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11775 * First, ATA Identify Device.
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 bzero(&new_sdinfo, sizeof (sata_drive_info_t));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11778 new_sdinfo.satadrv_addr = sata_device->satadev_addr;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11779 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11780 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
11781 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
11782 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
11783 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
11784 /* We may try to check for ATAPI device */
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11785 if (SATA_FEATURES(sata_hba_inst) & SATA_CTLF_ATAPI) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11786 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11787 * HBA supports ATAPI - try to issue Identify Packet
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11788 * Device command.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11789 */
8010
95c42a8a213e 6703522 ahci driver needs to support SATA tape
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 7954
diff changeset
11790 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
11791 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
11792 }
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
11793 }
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
11794 if (rval == SATA_SUCCESS) {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
11795 /*
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
11796 * Got something responding positively to ATA Identify Device
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
11797 * or to Identify Packet Device cmd.
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
11798 * 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
11799 */
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
11800 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
11801
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11802 /* save device info, if possible */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11803 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11804 sata_device->satadev_addr.cport)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11805 sdinfo = sata_get_device_info(sata_hba_inst, sata_device);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11806 if (sdinfo == NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11807 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11808 sata_device->satadev_addr.cport)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11809 return (SATA_FAILURE);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11810 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11811 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11812 * Copy drive info into the port-linked drive info structure.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11813 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11814 *sdinfo = new_sdinfo;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11815 sdinfo->satadrv_state &= ~SATA_STATE_PROBING;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11816 sdinfo->satadrv_state |= SATA_STATE_PROBED;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11817 if (sata_device->satadev_addr.qual == SATA_ADDR_DCPORT)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11818 SATA_CPORT_DEV_TYPE(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11819 sata_device->satadev_addr.cport) =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11820 sdinfo->satadrv_type;
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11821 else { /* SATA_ADDR_DPMPORT */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11822 mutex_enter(&pmportinfo->pmport_mutex);
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11823 SATA_PMPORT_DEV_TYPE(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11824 sata_device->satadev_addr.cport,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11825 sata_device->satadev_addr.pmport) =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11826 sdinfo->satadrv_type;
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11827 mutex_exit(&pmportinfo->pmport_mutex);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11828 }
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11829 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11830 sata_device->satadev_addr.cport)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11831 return (SATA_SUCCESS);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11832 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11833
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
11834 /*
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
11835 * It may be SATA_RETRY or SATA_FAILURE return.
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
11836 * Looks like we cannot determine the device type at this time.
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11837 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11838 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11839 sata_device->satadev_addr.cport)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11840 sdinfo = sata_get_device_info(sata_hba_inst, sata_device);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11841 if (sdinfo != NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11842 sata_device->satadev_type = SATA_DTYPE_UNKNOWN;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11843 sdinfo->satadrv_type = SATA_DTYPE_UNKNOWN;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11844 sdinfo->satadrv_state &= ~SATA_STATE_PROBING;
6539
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
11845 sdinfo->satadrv_state |= SATA_STATE_PROBED;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11846 if (sata_device->satadev_addr.qual == SATA_ADDR_DCPORT)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11847 SATA_CPORT_DEV_TYPE(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11848 sata_device->satadev_addr.cport) =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11849 SATA_DTYPE_UNKNOWN;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11850 else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11851 /* SATA_ADDR_DPMPORT */
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11852 mutex_enter(&pmportinfo->pmport_mutex);
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11853 if ((SATA_PMULT_INFO(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11854 sata_device->satadev_addr.cport) != NULL) &&
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11855 (SATA_PMPORT_INFO(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11856 sata_device->satadev_addr.cport,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11857 sata_device->satadev_addr.pmport) != NULL))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11858 SATA_PMPORT_DEV_TYPE(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11859 sata_device->satadev_addr.cport,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11860 sata_device->satadev_addr.pmport) =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11861 SATA_DTYPE_UNKNOWN;
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11862 mutex_exit(&pmportinfo->pmport_mutex);
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11863 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11864 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11865 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11866 sata_device->satadev_addr.cport)));
4014
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
11867 return (rval);
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11868 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11869
10391
12b08c516444 6838603 Under heavy I/O load, all Seagate Dragonfly drives in an x4x40 go offline at the same time
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 10318
diff changeset
11870
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11871 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11872 * Get pointer to sata_drive_info structure.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11873 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11874 * The sata_device has to contain address (cport, pmport and qualifier) for
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11875 * specified sata_scsi structure.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11876 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11877 * Returns NULL if device address is not valid for this HBA configuration.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11878 * Otherwise, returns a pointer to sata_drive_info structure.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11879 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11880 * This function should be called with a port mutex held.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11881 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11882 static sata_drive_info_t *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11883 sata_get_device_info(sata_hba_inst_t *sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11884 sata_device_t *sata_device)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11885 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11886 uint8_t cport = sata_device->satadev_addr.cport;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11887 uint8_t pmport = sata_device->satadev_addr.pmport;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11888 uint8_t qual = sata_device->satadev_addr.qual;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11889
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11890 if (cport >= SATA_NUM_CPORTS(sata_hba_inst))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11891 return (NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11892
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11893 if (!(SATA_CPORT_STATE(sata_hba_inst, cport) &
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11894 (SATA_STATE_PROBED | SATA_STATE_READY)))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11895 /* Port not probed yet */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11896 return (NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11897
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11898 if (SATA_CPORT_DEV_TYPE(sata_hba_inst, cport) == SATA_DTYPE_NONE)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11899 return (NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11900
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11901 if (qual == SATA_ADDR_DCPORT) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11902 /* Request for a device on a controller port */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11903 if (SATA_CPORT_DEV_TYPE(sata_hba_inst, cport) ==
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11904 SATA_DTYPE_PMULT)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11905 /* Port multiplier attached */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11906 return (NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11907 return (SATA_CPORT_DRV_INFO(sata_hba_inst, cport));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11908 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11909 if (qual == SATA_ADDR_DPMPORT) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11910 if (SATA_CPORT_DEV_TYPE(sata_hba_inst, cport) !=
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11911 SATA_DTYPE_PMULT)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11912 return (NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11913
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11914 if (pmport > SATA_NUM_PMPORTS(sata_hba_inst, cport))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11915 return (NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11916
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11917 if (!(SATA_PMPORT_STATE(sata_hba_inst, cport, pmport) &
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11918 (SATA_STATE_PROBED | SATA_STATE_READY)))
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11919 /* Port multiplier port not probed yet */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11920 return (NULL);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
11921
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11922 return (SATA_PMPORT_DRV_INFO(sata_hba_inst, cport, pmport));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11923 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11924
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11925 /* we should not get here */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11926 return (NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11927 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11928
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11929
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11930 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11931 * sata_identify_device.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11932 * Send Identify Device command to SATA HBA driver.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11933 * If command executes successfully, update sata_drive_info structure pointed
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11934 * to by sdinfo argument, including Identify Device data.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11935 * If command fails, invalidate data in sata_drive_info.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11936 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11937 * Cannot be called from interrupt level.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11938 *
2960
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
11939 * Returns:
4014
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
11940 * 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
11941 * 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
11942 * 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
11943 * should not be retried.
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11944 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11945 static int
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11946 sata_identify_device(sata_hba_inst_t *sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11947 sata_drive_info_t *sdinfo)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11948 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11949 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
11950 int rval;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11951
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11952 /* fetch device identify data */
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
11953 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
11954 sdinfo)) != SATA_SUCCESS)
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11955 goto fail_unknown;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11956
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11957 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
11958
95c42a8a213e 6703522 ahci driver needs to support SATA tape
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 7954
diff changeset
11959 /* 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
11960 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
11961 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
11962 } 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
11963 /* 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
11964 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
11965 } 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
11966 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
11967 case SATA_ATAPI_CDROM_DEV:
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11968 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
11969 break;
95c42a8a213e 6703522 ahci driver needs to support SATA tape
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 7954
diff changeset
11970 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
11971 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
11972 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
11973 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
11974 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
11975 break;
8010
95c42a8a213e 6703522 ahci driver needs to support SATA tape
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 7954
diff changeset
11976 default:
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11977 sdinfo->satadrv_type = SATA_DTYPE_UNKNOWN;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11978 }
8010
95c42a8a213e 6703522 ahci driver needs to support SATA tape
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 7954
diff changeset
11979 } else {
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11980 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
11981 }
95c42a8a213e 6703522 ahci driver needs to support SATA tape
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 7954
diff changeset
11982
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11983 if (sdinfo->satadrv_type == SATA_DTYPE_ATADISK) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11984 if (sdinfo->satadrv_capacity == 0) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11985 /* Non-LBA disk. Too bad... */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11986 sata_log(sata_hba_inst, CE_WARN,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11987 "SATA disk device at port %d does not support LBA",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11988 sdinfo->satadrv_addr.cport);
4014
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
11989 rval = SATA_FAILURE;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11990 goto fail_unknown;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11991 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11992 }
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
11993 #if 0
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
11994 /* Left for historical reason */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
11995 /*
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
11996 * Some initial version of SATA spec indicated that at least
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
11997 * 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
11998 * SerialATA 2.6, so this restriction is removed.
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
11999 */
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12000 /* Check for Ultra DMA modes 6 through 0 being supported */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12001 for (i = 6; i >= 0; --i) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12002 if (sdinfo->satadrv_id.ai_ultradma & (1 << i))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12003 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12004 }
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
12005
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12006 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12007 * 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
12008 * higher are not supported by the device, fail this
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12009 * device.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12010 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12011 if (i < 4) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12012 /* No required Ultra DMA mode supported */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12013 sata_log(sata_hba_inst, CE_WARN,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12014 "SATA disk device at port %d does not support UDMA "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12015 "mode 4 or higher", sdinfo->satadrv_addr.cport);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12016 SATA_LOG_D((sata_hba_inst, CE_WARN,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12017 "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
12018 rval = SATA_FAILURE;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12019 goto fail_unknown;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12020 }
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
12021 #endif
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12022
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
12023 /*
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
12024 * 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
12025 * 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
12026 */
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
12027 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
12028 !((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
12029 (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
12030 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
12031 "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
12032 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
12033 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
12034 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
12035 }
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
12036
4014
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
12037 return (SATA_SUCCESS);
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12038
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12039 fail_unknown:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12040 /* Invalidate sata_drive_info ? */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12041 sdinfo->satadrv_type = SATA_DTYPE_UNKNOWN;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12042 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
12043 return (rval);
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12044 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12045
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12046 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12047 * Log/display device information
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12048 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12049 static void
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12050 sata_show_drive_info(sata_hba_inst_t *sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12051 sata_drive_info_t *sdinfo)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12052 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12053 int valid_version;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12054 char msg_buf[MAXPATHLEN];
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
12055 int i;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12056
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12057 /* Show HBA path */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12058 (void) ddi_pathname(SATA_DIP(sata_hba_inst), msg_buf);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12059
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12060 cmn_err(CE_CONT, "?%s :\n", msg_buf);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12061
8010
95c42a8a213e 6703522 ahci driver needs to support SATA tape
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 7954
diff changeset
12062 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
12063 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
12064 (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
12065 break;
95c42a8a213e 6703522 ahci driver needs to support SATA tape
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 7954
diff changeset
12066
95c42a8a213e 6703522 ahci driver needs to support SATA tape
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 7954
diff changeset
12067 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
12068 (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
12069 break;
95c42a8a213e 6703522 ahci driver needs to support SATA tape
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 7954
diff changeset
12070
95c42a8a213e 6703522 ahci driver needs to support SATA tape
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 7954
diff changeset
12071 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
12072 (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
12073 break;
95c42a8a213e 6703522 ahci driver needs to support SATA tape
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 7954
diff changeset
12074
8317
249d7b80428e 6767262 ahci driver should support Dell PowerVault RD1000 backup device
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 8168
diff changeset
12075 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
12076 (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
12077 break;
249d7b80428e 6767262 ahci driver should support Dell PowerVault RD1000 backup device
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 8168
diff changeset
12078
8010
95c42a8a213e 6703522 ahci driver needs to support SATA tape
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 7954
diff changeset
12079 case SATA_DTYPE_UNKNOWN:
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12080 (void) sprintf(msg_buf,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12081 "Unsupported SATA device type (cfg 0x%x) at ",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12082 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
12083 break;
95c42a8a213e 6703522 ahci driver needs to support SATA tape
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 7954
diff changeset
12084 }
95c42a8a213e 6703522 ahci driver needs to support SATA tape
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 7954
diff changeset
12085
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12086 if (sdinfo->satadrv_addr.qual == SATA_ADDR_DCPORT)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12087 cmn_err(CE_CONT, "?\t%s port %d\n",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12088 msg_buf, sdinfo->satadrv_addr.cport);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12089 else
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
12090 cmn_err(CE_CONT, "?\t%s port %d:%d\n",
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12091 msg_buf, sdinfo->satadrv_addr.cport,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12092 sdinfo->satadrv_addr.pmport);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12093
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12094 bcopy(&sdinfo->satadrv_id.ai_model, msg_buf,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12095 sizeof (sdinfo->satadrv_id.ai_model));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12096 swab(msg_buf, msg_buf, sizeof (sdinfo->satadrv_id.ai_model));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12097 msg_buf[sizeof (sdinfo->satadrv_id.ai_model)] = '\0';
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12098 cmn_err(CE_CONT, "?\tmodel %s\n", msg_buf);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12099
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12100 bcopy(&sdinfo->satadrv_id.ai_fw, msg_buf,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12101 sizeof (sdinfo->satadrv_id.ai_fw));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12102 swab(msg_buf, msg_buf, sizeof (sdinfo->satadrv_id.ai_fw));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12103 msg_buf[sizeof (sdinfo->satadrv_id.ai_fw)] = '\0';
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12104 cmn_err(CE_CONT, "?\tfirmware %s\n", msg_buf);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12105
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12106 bcopy(&sdinfo->satadrv_id.ai_drvser, msg_buf,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12107 sizeof (sdinfo->satadrv_id.ai_drvser));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12108 swab(msg_buf, msg_buf, sizeof (sdinfo->satadrv_id.ai_drvser));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12109 msg_buf[sizeof (sdinfo->satadrv_id.ai_drvser)] = '\0';
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
12110 if (sdinfo->satadrv_type == SATA_DTYPE_ATADISK) {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
12111 cmn_err(CE_CONT, "?\tserial number %s\n", msg_buf);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
12112 } else {
8010
95c42a8a213e 6703522 ahci driver needs to support SATA tape
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 7954
diff changeset
12113 /*
95c42a8a213e 6703522 ahci driver needs to support SATA tape
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 7954
diff changeset
12114 * 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
12115 * violate the spec by providing spaces rather than zeros
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
12116 * in serial number field. Scan the buffer to detect it.
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
12117 */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
12118 for (i = 0; i < sizeof (sdinfo->satadrv_id.ai_drvser); i++) {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
12119 if (msg_buf[i] != '\0' && msg_buf[i] != ' ')
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
12120 break;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
12121 }
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
12122 if (i == sizeof (sdinfo->satadrv_id.ai_drvser)) {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
12123 cmn_err(CE_CONT, "?\tserial number - none\n");
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
12124 } else {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
12125 cmn_err(CE_CONT, "?\tserial number %s\n", msg_buf);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
12126 }
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
12127 }
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12128
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12129 #ifdef SATA_DEBUG
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12130 if (sdinfo->satadrv_id.ai_majorversion != 0 &&
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12131 sdinfo->satadrv_id.ai_majorversion != 0xffff) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12132 int i;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12133 for (i = 14; i >= 2; i--) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12134 if (sdinfo->satadrv_id.ai_majorversion & (1 << i)) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12135 valid_version = i;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12136 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12137 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12138 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12139 cmn_err(CE_CONT,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12140 "?\tATA/ATAPI-%d supported, majver 0x%x minver 0x%x\n",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12141 valid_version,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12142 sdinfo->satadrv_id.ai_majorversion,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12143 sdinfo->satadrv_id.ai_minorversion);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12144 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12145 #endif
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12146 /* Log some info */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12147 cmn_err(CE_CONT, "?\tsupported features:\n");
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12148 msg_buf[0] = '\0';
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
12149 if (sdinfo->satadrv_type == SATA_DTYPE_ATADISK) {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
12150 if (sdinfo->satadrv_features_support & SATA_DEV_F_LBA48)
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
12151 (void) strlcat(msg_buf, "48-bit LBA, ", MAXPATHLEN);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
12152 else if (sdinfo->satadrv_features_support & SATA_DEV_F_LBA28)
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
12153 (void) strlcat(msg_buf, "28-bit LBA, ", MAXPATHLEN);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
12154 }
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12155 if (sdinfo->satadrv_features_support & SATA_DEV_F_DMA)
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
12156 (void) strlcat(msg_buf, "DMA", MAXPATHLEN);
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12157 if (sdinfo->satadrv_features_support & SATA_DEV_F_NCQ)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12158 (void) strlcat(msg_buf, ", Native Command Queueing",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12159 MAXPATHLEN);
1940
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
12160 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
12161 (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
12162 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
12163 (sdinfo->satadrv_id.ai_features85 & SATA_SMART_ENABLED))
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
12164 (void) strlcat(msg_buf, ", SMART", MAXPATHLEN);
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
12165 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
12166 (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
12167 (void) strlcat(msg_buf, ", SMART self-test", MAXPATHLEN);
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12168 cmn_err(CE_CONT, "?\t %s\n", msg_buf);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12169 if (sdinfo->satadrv_features_support & SATA_DEV_F_SATA2)
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
12170 cmn_err(CE_CONT, "?\tSATA Gen2 signaling speed (3.0Gbps)\n");
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12171 else if (sdinfo->satadrv_features_support & SATA_DEV_F_SATA1)
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
12172 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
12173 if (sdinfo->satadrv_features_support &
4582
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
12174 (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
12175 msg_buf[0] = '\0';
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
12176 (void) snprintf(msg_buf, MAXPATHLEN,
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
12177 "Supported queue depth %d",
4582
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
12178 sdinfo->satadrv_queue_depth);
5014
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
12179 if (!(sata_func_enable &
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
12180 (SATA_ENABLE_QUEUING | SATA_ENABLE_NCQ)))
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
12181 (void) strlcat(msg_buf,
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
12182 " - queueing disabled globally", MAXPATHLEN);
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
12183 else if (sdinfo->satadrv_queue_depth >
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
12184 sdinfo->satadrv_max_queue_depth) {
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
12185 (void) snprintf(&msg_buf[strlen(msg_buf)],
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
12186 MAXPATHLEN - strlen(msg_buf), ", limited to %d",
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
12187 (int)sdinfo->satadrv_max_queue_depth);
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
12188 }
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
12189 cmn_err(CE_CONT, "?\t%s\n", msg_buf);
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
12190 }
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
12191
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
12192 if (sdinfo->satadrv_type == SATA_DTYPE_ATADISK) {
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12193 #ifdef __i386
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
12194 (void) sprintf(msg_buf, "\tcapacity = %llu sectors\n",
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
12195 sdinfo->satadrv_capacity);
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12196 #else
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
12197 (void) sprintf(msg_buf, "\tcapacity = %lu sectors\n",
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
12198 sdinfo->satadrv_capacity);
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12199 #endif
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
12200 cmn_err(CE_CONT, "?%s", msg_buf);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
12201 }
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12202 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12203
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
12204 /*
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
12205 * Log/display port multiplier information
10663
4d59e1faf654 6881565 sata hba interfaces need to keep backward compatibility
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10427
diff changeset
12206 * No Mutex should be hold.
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
12207 */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
12208 static void
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
12209 sata_show_pmult_info(sata_hba_inst_t *sata_hba_inst,
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
12210 sata_device_t *sata_device)
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
12211 {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
12212 _NOTE(ARGUNUSED(sata_hba_inst))
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
12213
10663
4d59e1faf654 6881565 sata hba interfaces need to keep backward compatibility
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10427
diff changeset
12214 int cport = sata_device->satadev_addr.cport;
4d59e1faf654 6881565 sata hba interfaces need to keep backward compatibility
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10427
diff changeset
12215 sata_pmult_info_t *pmultinfo;
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
12216 char msg_buf[MAXPATHLEN];
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
12217 uint32_t gscr0, gscr1, gscr2, gscr64;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
12218
10663
4d59e1faf654 6881565 sata hba interfaces need to keep backward compatibility
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10427
diff changeset
12219 mutex_enter(&SATA_CPORT_MUTEX(sata_hba_inst, cport));
4d59e1faf654 6881565 sata hba interfaces need to keep backward compatibility
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10427
diff changeset
12220 pmultinfo = SATA_PMULT_INFO(sata_hba_inst, cport);
10679
c7ca3a4d76d9 6886126 sata_show_pmult_info returns without releasing mutex
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10663
diff changeset
12221 if (pmultinfo == NULL) {
c7ca3a4d76d9 6886126 sata_show_pmult_info returns without releasing mutex
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10663
diff changeset
12222 mutex_exit(&SATA_CPORT_MUTEX(sata_hba_inst, cport));
c7ca3a4d76d9 6886126 sata_show_pmult_info returns without releasing mutex
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10663
diff changeset
12223 return;
c7ca3a4d76d9 6886126 sata_show_pmult_info returns without releasing mutex
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10663
diff changeset
12224 }
10663
4d59e1faf654 6881565 sata hba interfaces need to keep backward compatibility
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10427
diff changeset
12225
4d59e1faf654 6881565 sata hba interfaces need to keep backward compatibility
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10427
diff changeset
12226 gscr0 = pmultinfo->pmult_gscr.gscr0;
4d59e1faf654 6881565 sata hba interfaces need to keep backward compatibility
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10427
diff changeset
12227 gscr1 = pmultinfo->pmult_gscr.gscr1;
4d59e1faf654 6881565 sata hba interfaces need to keep backward compatibility
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10427
diff changeset
12228 gscr2 = pmultinfo->pmult_gscr.gscr2;
4d59e1faf654 6881565 sata hba interfaces need to keep backward compatibility
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10427
diff changeset
12229 gscr64 = pmultinfo->pmult_gscr.gscr64;
4d59e1faf654 6881565 sata hba interfaces need to keep backward compatibility
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10427
diff changeset
12230 mutex_exit(&SATA_CPORT_MUTEX(sata_hba_inst, cport));
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
12231
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
12232 cmn_err(CE_CONT, "?Port Multiplier %d device-ports found at port %d",
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
12233 sata_device->satadev_add_info, sata_device->satadev_addr.cport);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
12234
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
12235 (void) sprintf(msg_buf, "\tVendor_ID 0x%04x, Module_ID 0x%04x",
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
12236 gscr0 & 0xffff, (gscr0 >> 16) & 0xffff);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
12237 cmn_err(CE_CONT, "?%s", msg_buf);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
12238
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
12239 (void) strcpy(msg_buf, "\tSupport SATA PMP Spec ");
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
12240 if (gscr1 & (1 << 3))
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
12241 (void) strlcat(msg_buf, "1.2", MAXPATHLEN);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
12242 else if (gscr1 & (1 << 2))
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
12243 (void) strlcat(msg_buf, "1.1", MAXPATHLEN);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
12244 else if (gscr1 & (1 << 1))
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
12245 (void) strlcat(msg_buf, "1.0", MAXPATHLEN);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
12246 else
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
12247 (void) strlcat(msg_buf, "unknown", MAXPATHLEN);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
12248 cmn_err(CE_CONT, "?%s", msg_buf);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
12249
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
12250 (void) strcpy(msg_buf, "\tSupport ");
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
12251 if (gscr64 & (1 << 3))
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
12252 (void) strlcat(msg_buf, "Asy-Notif, ",
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
12253 MAXPATHLEN);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
12254 if (gscr64 & (1 << 2))
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
12255 (void) strlcat(msg_buf, "Dyn-SSC, ", MAXPATHLEN);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
12256 if (gscr64 & (1 << 1))
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
12257 (void) strlcat(msg_buf, "Iss-PMREQ, ", MAXPATHLEN);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
12258 if (gscr64 & (1 << 0))
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
12259 (void) strlcat(msg_buf, "BIST", MAXPATHLEN);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
12260 if ((gscr64 & 0xf) == 0)
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
12261 (void) strlcat(msg_buf, "nothing", MAXPATHLEN);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
12262 cmn_err(CE_CONT, "?%s", msg_buf);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
12263
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
12264 (void) sprintf(msg_buf, "\tNumber of exposed device fan-out ports: %d",
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
12265 gscr2 & SATA_PMULT_PORTNUM_MASK);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
12266 cmn_err(CE_CONT, "?%s", msg_buf);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
12267 }
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12268
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12269 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12270 * sata_save_drive_settings extracts current setting of the device and stores
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12271 * 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
12272 * after the device reset.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12273 *
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
12274 * 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
12275 * device supports these features at all.
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
12276 * For ATAPI devices the Removable Media Status Notification setting is saved.
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12277 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12278 static void
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12279 sata_save_drive_settings(sata_drive_info_t *sdinfo)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12280 {
9058
a7b4d0b3fd3d 6803930 ahci task file errors on new development box
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 8317
diff changeset
12281 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
12282 SATA_WRITE_CACHE_SUPPORTED(sdinfo->satadrv_id)) {
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
12283
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
12284 /* 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
12285 if (SATA_READ_AHEAD_ENABLED(sdinfo->satadrv_id))
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
12286 sdinfo->satadrv_settings |= SATA_DEV_READ_AHEAD;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
12287 else
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
12288 sdinfo->satadrv_settings &= ~SATA_DEV_READ_AHEAD;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
12289
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
12290 /* 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
12291 if (SATA_WRITE_CACHE_ENABLED(sdinfo->satadrv_id))
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
12292 sdinfo->satadrv_settings |= SATA_DEV_WRITE_CACHE;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
12293 else
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
12294 sdinfo->satadrv_settings &= ~SATA_DEV_WRITE_CACHE;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
12295 }
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
12296
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
12297 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
12298 if (SATA_RM_NOTIFIC_SUPPORTED(sdinfo->satadrv_id))
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
12299 sdinfo->satadrv_settings |= SATA_DEV_RMSN;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
12300 else
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
12301 sdinfo->satadrv_settings &= ~SATA_DEV_RMSN;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
12302 }
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12303 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12304
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12305
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12306 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12307 * sata_check_capacity function determines a disk capacity
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12308 * and addressing mode (LBA28/LBA48) by examining a disk identify device data.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12309 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12310 * 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
12311 * this function is not called.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12312 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12313 * 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
12314 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12315 static uint64_t
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12316 sata_check_capacity(sata_drive_info_t *sdinfo)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12317 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12318 uint64_t capacity = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12319 int i;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12320
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12321 if (sdinfo->satadrv_type != SATA_DTYPE_ATADISK ||
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12322 !sdinfo->satadrv_id.ai_cap & SATA_LBA_SUPPORT)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12323 /* Capacity valid only for LBA-addressable disk devices */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12324 return (0);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12325
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12326 if ((sdinfo->satadrv_id.ai_validinfo & SATA_VALIDINFO_88) &&
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12327 (sdinfo->satadrv_id.ai_cmdset83 & SATA_EXT48) &&
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12328 (sdinfo->satadrv_id.ai_features86 & SATA_EXT48)) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12329 /* LBA48 mode supported and enabled */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12330 sdinfo->satadrv_features_support |= SATA_DEV_F_LBA48 |
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12331 SATA_DEV_F_LBA28;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12332 for (i = 3; i >= 0; --i) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12333 capacity <<= 16;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12334 capacity += sdinfo->satadrv_id.ai_addrsecxt[i];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12335 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12336 } else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12337 capacity = sdinfo->satadrv_id.ai_addrsec[1];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12338 capacity <<= 16;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12339 capacity += sdinfo->satadrv_id.ai_addrsec[0];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12340 if (capacity >= 0x1000000)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12341 /* LBA28 mode */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12342 sdinfo->satadrv_features_support |= SATA_DEV_F_LBA28;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12343 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12344 return (capacity);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12345 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12346
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12347
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12348 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12349 * Allocate consistent buffer for DMA transfer
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12350 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12351 * 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
12352 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12353 * Returns pointer to allocated buffer structure, or NULL if allocation failed.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12354 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12355 static struct buf *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12356 sata_alloc_local_buffer(sata_pkt_txlate_t *spx, int len)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12357 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12358 struct scsi_address ap;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12359 struct buf *bp;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12360 ddi_dma_attr_t cur_dma_attr;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12361
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12362 ASSERT(spx->txlt_sata_pkt != NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12363 ap.a_hba_tran = spx->txlt_sata_hba_inst->satahba_scsi_tran;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12364 ap.a_target = SATA_TO_SCSI_TARGET(
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12365 spx->txlt_sata_pkt->satapkt_device.satadev_addr.cport,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12366 spx->txlt_sata_pkt->satapkt_device.satadev_addr.pmport,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12367 spx->txlt_sata_pkt->satapkt_device.satadev_addr.qual);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12368 ap.a_lun = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12369
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12370 bp = scsi_alloc_consistent_buf(&ap, NULL, len,
4582
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
12371 B_READ, SLEEP_FUNC, NULL);
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12372
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12373 if (bp != NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12374 /* Allocate DMA resources for this buffer */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12375 spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp = bp;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12376 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12377 * We use a local version of the dma_attr, to account
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12378 * for a device addressing limitations.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12379 * sata_adjust_dma_attr() will handle sdinfo == NULL which
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12380 * will cause dma attributes to be adjusted to a lowest
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12381 * acceptable level.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12382 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12383 sata_adjust_dma_attr(NULL,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12384 SATA_DMA_ATTR(spx->txlt_sata_hba_inst), &cur_dma_attr);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12385
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12386 if (sata_dma_buf_setup(spx, PKT_CONSISTENT,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12387 SLEEP_FUNC, NULL, &cur_dma_attr) != DDI_SUCCESS) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12388 scsi_free_consistent_buf(bp);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12389 spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp = NULL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12390 bp = NULL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12391 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12392 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12393 return (bp);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12394 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12395
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12396 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12397 * Release local buffer (consistent buffer for DMA transfer) allocated
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12398 * via sata_alloc_local_buffer().
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12399 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12400 static void
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12401 sata_free_local_buffer(sata_pkt_txlate_t *spx)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12402 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12403 ASSERT(spx->txlt_sata_pkt != NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12404 ASSERT(spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp != NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12405
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12406 spx->txlt_sata_pkt->satapkt_cmd.satacmd_num_dma_cookies = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12407 spx->txlt_sata_pkt->satapkt_cmd.satacmd_dma_cookie_list = NULL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12408
9699
fb90a02808bd 6824084 sata: callout queue size allocated per registered controller is too small
Martin Faltesek <Martin.Faltesek@Sun.COM>
parents: 9305
diff changeset
12409 sata_common_free_dma_rsrcs(spx);
7152
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
12410
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12411 /* Free buffer */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12412 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
12413 spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp = NULL;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12414 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12415
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12416 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12417 * Allocate sata_pkt
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12418 * Pkt structure version and embedded strcutures version are initialized.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12419 * sata_pkt and sata_pkt_txlate structures are cross-linked.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12420 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12421 * 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
12422 * callback argument determines if it can sleep or not.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12423 * Hence, it should not be called from interrupt context.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12424 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12425 * If successful, non-NULL pointer to a sata pkt is returned.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12426 * Upon failure, NULL pointer is returned.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12427 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12428 static sata_pkt_t *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12429 sata_pkt_alloc(sata_pkt_txlate_t *spx, int (*callback)(caddr_t))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12430 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12431 sata_pkt_t *spkt;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12432 int kmsflag;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12433
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12434 kmsflag = (callback == SLEEP_FUNC) ? KM_SLEEP : KM_NOSLEEP;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12435 spkt = kmem_zalloc(sizeof (sata_pkt_t), kmsflag);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12436 if (spkt == NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12437 SATA_LOG_D((spx->txlt_sata_hba_inst, CE_WARN,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12438 "sata_pkt_alloc: failed"));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12439 return (NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12440 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12441 spkt->satapkt_rev = SATA_PKT_REV;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12442 spkt->satapkt_cmd.satacmd_rev = SATA_CMD_REV;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12443 spkt->satapkt_device.satadev_rev = SATA_DEVICE_REV;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12444 spkt->satapkt_framework_private = spx;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12445 spx->txlt_sata_pkt = spkt;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12446 return (spkt);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12447 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12448
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12449 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12450 * Free sata pkt allocated via sata_pkt_alloc()
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12451 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12452 static void
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12453 sata_pkt_free(sata_pkt_txlate_t *spx)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12454 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12455 ASSERT(spx->txlt_sata_pkt != NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12456 ASSERT(spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp == NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12457 kmem_free(spx->txlt_sata_pkt, sizeof (sata_pkt_t));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12458 spx->txlt_sata_pkt = NULL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12459 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12460
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12461
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12462 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12463 * Adjust DMA attributes.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12464 * 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
12465 * from 8 bits to 16 bits, depending on a command being used.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12466 * Limiting max block count arbitrarily to 256 for all read/write
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12467 * commands may affects performance, so check both the device and
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12468 * controller capability before adjusting dma attributes.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12469 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12470 void
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12471 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
12472 ddi_dma_attr_t *adj_dma_attr)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12473 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12474 uint32_t count_max;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12475
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12476 /* Copy original attributes */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12477 *adj_dma_attr = *dma_attr;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12478 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12479 * Things to consider: device addressing capability,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12480 * "excessive" controller DMA capabilities.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12481 * If a device is being probed/initialized, there are
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12482 * no device info - use default limits then.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12483 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12484 if (sdinfo == NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12485 count_max = dma_attr->dma_attr_granular * 0x100;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12486 if (dma_attr->dma_attr_count_max > count_max)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12487 adj_dma_attr->dma_attr_count_max = count_max;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12488 if (dma_attr->dma_attr_maxxfer > count_max)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12489 adj_dma_attr->dma_attr_maxxfer = count_max;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12490 return;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12491 }
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
12492
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
12493 if (sdinfo->satadrv_type == SATA_DTYPE_ATADISK) {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
12494 if (sdinfo->satadrv_features_support & (SATA_DEV_F_LBA48)) {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
12495 /*
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
12496 * 16-bit sector count may be used - we rely on
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
12497 * the assumption that only read and write cmds
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
12498 * will request more than 256 sectors worth of data
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
12499 */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
12500 count_max = adj_dma_attr->dma_attr_granular * 0x10000;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
12501 } else {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
12502 /*
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
12503 * 8-bit sector count will be used - default limits
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
12504 * for dma attributes
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
12505 */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
12506 count_max = adj_dma_attr->dma_attr_granular * 0x100;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
12507 }
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
12508 /*
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
12509 * Adjust controler dma attributes, if necessary
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
12510 */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
12511 if (dma_attr->dma_attr_count_max > count_max)
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
12512 adj_dma_attr->dma_attr_count_max = count_max;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
12513 if (dma_attr->dma_attr_maxxfer > count_max)
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
12514 adj_dma_attr->dma_attr_maxxfer = count_max;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
12515 }
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12516 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12517
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12518
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12519 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12520 * Allocate DMA resources for the buffer
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12521 * This function handles initial DMA resource allocation as well as
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12522 * 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
12523 * 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
12524 * 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
12525 * 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
12526 * 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
12527 * 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
12528 *
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
12529 * Returns DDI_SUCCESS upon successful operation.
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
12530 * Return failure code of a failing command or DDI_FAILURE when
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12531 * internal cleanup failed.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12532 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12533 static int
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12534 sata_dma_buf_setup(sata_pkt_txlate_t *spx, int flags,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12535 int (*callback)(caddr_t), caddr_t arg,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12536 ddi_dma_attr_t *cur_dma_attr)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12537 {
3935
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
12538 int rval;
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
12539 off_t offset;
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
12540 size_t size;
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
12541 int max_sg_len, req_len, i;
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
12542 uint_t dma_flags;
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
12543 struct buf *bp;
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
12544 uint64_t cur_txfer_len;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12545
2539
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
12546
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12547 ASSERT(spx->txlt_sata_pkt != NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12548 bp = spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12549 ASSERT(bp != NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12550
2553
624f674f2ad8 6430966 SATA NCQ support is needed in SATA framework and hba drivers
ls24207
parents: 2539
diff changeset
12551
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12552 if (spx->txlt_buf_dma_handle == NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12553 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12554 * No DMA resources allocated so far - this is a first call
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12555 * for this sata pkt.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12556 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12557 rval = ddi_dma_alloc_handle(SATA_DIP(spx->txlt_sata_hba_inst),
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12558 cur_dma_attr, callback, arg, &spx->txlt_buf_dma_handle);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12559
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12560 if (rval != DDI_SUCCESS) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12561 SATA_LOG_D((spx->txlt_sata_hba_inst, CE_WARN,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12562 "sata_dma_buf_setup: no buf DMA resources %x",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12563 rval));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12564 return (rval);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12565 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12566
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12567 if (bp->b_flags & B_READ)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12568 dma_flags = DDI_DMA_READ;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12569 else
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12570 dma_flags = DDI_DMA_WRITE;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12571
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12572 if (flags & PKT_CONSISTENT)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12573 dma_flags |= DDI_DMA_CONSISTENT;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12574
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12575 if (flags & PKT_DMA_PARTIAL)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12576 dma_flags |= DDI_DMA_PARTIAL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12577
2539
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
12578 /*
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
12579 * Check buffer alignment and size against dma attributes
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
12580 * Consider dma_attr_align only. There may be requests
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
12581 * 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
12582 * 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
12583 * is necessary. The dma_attr_minxfer theoretically should
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
12584 * be considered, but no HBA driver is checking it.
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
12585 */
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
12586 if (IS_P2ALIGNED(bp->b_un.b_addr,
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
12587 cur_dma_attr->dma_attr_align)) {
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
12588 rval = ddi_dma_buf_bind_handle(
4582
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
12589 spx->txlt_buf_dma_handle,
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
12590 bp, dma_flags, callback, arg,
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
12591 &spx->txlt_dma_cookie,
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
12592 &spx->txlt_curwin_num_dma_cookies);
2539
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
12593 } else { /* Buffer is not aligned */
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
12594
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
12595 int (*ddicallback)(caddr_t);
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
12596 size_t bufsz;
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
12597
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
12598 /* Check id sleeping is allowed */
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
12599 ddicallback = (callback == NULL_FUNC) ?
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
12600 DDI_DMA_DONTWAIT : DDI_DMA_SLEEP;
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
12601
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
12602 SATADBG2(SATA_DBG_DMA_SETUP, spx->txlt_sata_hba_inst,
4582
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
12603 "mis-aligned buffer: addr=0x%p, cnt=%lu",
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
12604 (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
12605
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
12606 if (bp->b_flags & (B_PAGEIO|B_PHYS))
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
12607 /*
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
12608 * CPU will need to access data in the buffer
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
12609 * (for copying) so map it.
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
12610 */
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
12611 bp_mapin(bp);
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
12612
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
12613 ASSERT(spx->txlt_tmp_buf == NULL);
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
12614
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
12615 /* Buffer may be padded by ddi_dma_mem_alloc()! */
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
12616 rval = ddi_dma_mem_alloc(
4582
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
12617 spx->txlt_buf_dma_handle,
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
12618 bp->b_bcount,
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
12619 &sata_acc_attr,
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
12620 DDI_DMA_STREAMING,
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
12621 ddicallback, NULL,
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
12622 &spx->txlt_tmp_buf,
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
12623 &bufsz,
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
12624 &spx->txlt_tmp_buf_handle);
2539
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
12625
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
12626 if (rval != DDI_SUCCESS) {
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
12627 /* DMA mapping failed */
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
12628 (void) ddi_dma_free_handle(
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
12629 &spx->txlt_buf_dma_handle);
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
12630 spx->txlt_buf_dma_handle = NULL;
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
12631 #ifdef SATA_DEBUG
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
12632 mbuffail_count++;
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
12633 #endif
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
12634 SATADBG1(SATA_DBG_DMA_SETUP,
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
12635 spx->txlt_sata_hba_inst,
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
12636 "sata_dma_buf_setup: "
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
12637 "buf dma mem alloc failed %x\n", rval);
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
12638 return (rval);
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
12639 }
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
12640 ASSERT(IS_P2ALIGNED(spx->txlt_tmp_buf,
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
12641 cur_dma_attr->dma_attr_align));
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
12642
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
12643 #ifdef SATA_DEBUG
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
12644 mbuf_count++;
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
12645
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
12646 if (bp->b_bcount != bufsz)
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
12647 /*
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
12648 * This will require special handling, because
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
12649 * DMA cookies will be based on the temporary
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
12650 * buffer size, not the original buffer
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
12651 * b_bcount, so the residue may have to
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
12652 * be counted differently.
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
12653 */
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
12654 SATADBG2(SATA_DBG_DMA_SETUP,
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
12655 spx->txlt_sata_hba_inst,
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
12656 "sata_dma_buf_setup: bp size %x != "
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
12657 "bufsz %x\n", bp->b_bcount, bufsz);
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
12658 #endif
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
12659 if (dma_flags & DDI_DMA_WRITE) {
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
12660 /*
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
12661 * Write operation - copy data into
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
12662 * an aligned temporary buffer. Buffer will be
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
12663 * synced for device by ddi_dma_addr_bind_handle
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
12664 */
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
12665 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
12666 bp->b_bcount);
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
12667 }
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
12668
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
12669 rval = ddi_dma_addr_bind_handle(
4582
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
12670 spx->txlt_buf_dma_handle,
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
12671 NULL,
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
12672 spx->txlt_tmp_buf,
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
12673 bufsz, dma_flags, ddicallback, 0,
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
12674 &spx->txlt_dma_cookie,
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
12675 &spx->txlt_curwin_num_dma_cookies);
2539
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
12676 }
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12677
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12678 switch (rval) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12679 case DDI_DMA_PARTIAL_MAP:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12680 SATADBG1(SATA_DBG_DMA_SETUP, spx->txlt_sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12681 "sata_dma_buf_setup: DMA Partial Map\n", NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12682 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12683 * Partial DMA mapping.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12684 * Retrieve number of DMA windows for this request.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12685 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12686 if (ddi_dma_numwin(spx->txlt_buf_dma_handle,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12687 &spx->txlt_num_dma_win) != DDI_SUCCESS) {
2539
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
12688 if (spx->txlt_tmp_buf != NULL) {
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
12689 ddi_dma_mem_free(
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
12690 &spx->txlt_tmp_buf_handle);
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
12691 spx->txlt_tmp_buf = NULL;
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
12692 }
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12693 (void) ddi_dma_unbind_handle(
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12694 spx->txlt_buf_dma_handle);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12695 (void) ddi_dma_free_handle(
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12696 &spx->txlt_buf_dma_handle);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12697 spx->txlt_buf_dma_handle = NULL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12698 SATA_LOG_D((spx->txlt_sata_hba_inst, CE_WARN,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12699 "sata_dma_buf_setup: numwin failed\n"));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12700 return (DDI_FAILURE);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12701 }
3935
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
12702 SATADBG2(SATA_DBG_DMA_SETUP,
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
12703 spx->txlt_sata_hba_inst,
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
12704 "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
12705 spx->txlt_num_dma_win,
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
12706 spx->txlt_curwin_num_dma_cookies);
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12707 spx->txlt_cur_dma_win = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12708 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12709
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12710 case DDI_DMA_MAPPED:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12711 /* DMA fully mapped */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12712 spx->txlt_num_dma_win = 1;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12713 spx->txlt_cur_dma_win = 0;
3935
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
12714 SATADBG1(SATA_DBG_DMA_SETUP,
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
12715 spx->txlt_sata_hba_inst,
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
12716 "sata_dma_buf_setup: windows: 1 "
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
12717 "cookies: %d\n", spx->txlt_curwin_num_dma_cookies);
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12718 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12719
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12720 default:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12721 /* DMA mapping failed */
2539
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
12722 if (spx->txlt_tmp_buf != NULL) {
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
12723 ddi_dma_mem_free(
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
12724 &spx->txlt_tmp_buf_handle);
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
12725 spx->txlt_tmp_buf = NULL;
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
12726 }
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12727 (void) ddi_dma_free_handle(&spx->txlt_buf_dma_handle);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12728 spx->txlt_buf_dma_handle = NULL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12729 SATA_LOG_D((spx->txlt_sata_hba_inst, CE_WARN,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12730 "sata_dma_buf_setup: buf dma handle binding "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12731 "failed %x\n", rval));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12732 return (rval);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12733 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12734 spx->txlt_curwin_processed_dma_cookies = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12735 spx->txlt_dma_cookie_list = NULL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12736 } else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12737 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12738 * DMA setup is reused. Check if we need to process more
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12739 * cookies in current window, or to get next window, if any.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12740 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12741
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12742 ASSERT(spx->txlt_curwin_processed_dma_cookies <=
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12743 spx->txlt_curwin_num_dma_cookies);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12744
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12745 if (spx->txlt_curwin_processed_dma_cookies ==
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12746 spx->txlt_curwin_num_dma_cookies) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12747 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12748 * All cookies from current DMA window were processed.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12749 * Get next DMA window.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12750 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12751 spx->txlt_cur_dma_win++;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12752 if (spx->txlt_cur_dma_win < spx->txlt_num_dma_win) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12753 (void) ddi_dma_getwin(spx->txlt_buf_dma_handle,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12754 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
12755 &spx->txlt_dma_cookie,
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12756 &spx->txlt_curwin_num_dma_cookies);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12757 spx->txlt_curwin_processed_dma_cookies = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12758 } else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12759 /* No more windows! End of request! */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12760 /* What to do? - panic for now */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12761 ASSERT(spx->txlt_cur_dma_win >=
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12762 spx->txlt_num_dma_win);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12763
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12764 spx->txlt_curwin_num_dma_cookies = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12765 spx->txlt_curwin_processed_dma_cookies = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12766 spx->txlt_sata_pkt->
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12767 satapkt_cmd.satacmd_num_dma_cookies = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12768 return (DDI_SUCCESS);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12769 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12770 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12771 }
3935
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
12772 /* There better be at least one DMA cookie outstanding */
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12773 ASSERT((spx->txlt_curwin_num_dma_cookies -
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12774 spx->txlt_curwin_processed_dma_cookies) > 0);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12775
3935
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
12776 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
12777 /* 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
12778 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
12779 spx->txlt_dma_cookie_list = NULL;
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
12780 spx->txlt_dma_cookie_list_len = 0;
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
12781 }
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12782 if (spx->txlt_curwin_processed_dma_cookies == 0) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12783 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12784 * Processing a new DMA window - set-up dma cookies list.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12785 * We may reuse previously allocated cookie array if it is
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12786 * possible.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12787 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12788 if (spx->txlt_dma_cookie_list != NULL &&
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12789 spx->txlt_dma_cookie_list_len <
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12790 spx->txlt_curwin_num_dma_cookies) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12791 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12792 * New DMA window contains more cookies than
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12793 * the previous one. We need larger cookie list - free
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12794 * the old one.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12795 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12796 (void) kmem_free(spx->txlt_dma_cookie_list,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12797 spx->txlt_dma_cookie_list_len *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12798 sizeof (ddi_dma_cookie_t));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12799 spx->txlt_dma_cookie_list = NULL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12800 spx->txlt_dma_cookie_list_len = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12801 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12802 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
12803 /*
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
12804 * 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
12805 * 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
12806 */
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
12807 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
12808 req_len = MIN(max_sg_len,
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
12809 spx->txlt_curwin_num_dma_cookies);
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
12810
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
12811 /* Allocate new dma cookie array if necessary */
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
12812 if (req_len == 1) {
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
12813 /* 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
12814 spx->txlt_dma_cookie_list =
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
12815 &spx->txlt_dma_cookie;
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
12816 spx->txlt_dma_cookie_list_len = 1;
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
12817 } else {
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
12818 /*
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
12819 * 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
12820 */
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
12821 spx->txlt_dma_cookie_list = kmem_zalloc(
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
12822 sizeof (ddi_dma_cookie_t) * req_len,
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
12823 callback == NULL_FUNC ? KM_NOSLEEP :
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
12824 KM_SLEEP);
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
12825 if (spx->txlt_dma_cookie_list == NULL) {
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
12826 SATADBG1(SATA_DBG_DMA_SETUP,
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
12827 spx->txlt_sata_hba_inst,
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
12828 "sata_dma_buf_setup: cookie list "
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
12829 "allocation failed\n", NULL);
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
12830 /*
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
12831 * We could not allocate space for
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
12832 * neccessary number of dma cookies in
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
12833 * this window, so we fail this request.
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
12834 * Next invocation would try again to
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
12835 * allocate space for cookie list.
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
12836 * Note:Packet residue was not modified.
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
12837 */
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
12838 return (DDI_DMA_NORESOURCES);
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
12839 } else {
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
12840 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
12841 }
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
12842 }
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
12843 }
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
12844 /*
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
12845 * 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
12846 * First cookie was already fetched.
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
12847 */
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
12848 *(&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
12849 cur_txfer_len =
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
12850 (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
12851 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
12852 spx->txlt_curwin_processed_dma_cookies++;
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
12853 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
12854 (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
12855 ddi_dma_nextcookie(spx->txlt_buf_dma_handle,
4582
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
12856 &spx->txlt_dma_cookie_list[i]);
3935
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
12857 cur_txfer_len +=
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
12858 (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
12859 spx->txlt_curwin_processed_dma_cookies++;
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
12860 spx->txlt_sata_pkt->
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
12861 satapkt_cmd.satacmd_num_dma_cookies += 1;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12862 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12863 } else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12864 SATADBG2(SATA_DBG_DMA_SETUP, spx->txlt_sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12865 "sata_dma_buf_setup: sliding within DMA window, "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12866 "cur cookie %d, total cookies %d\n",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12867 spx->txlt_curwin_processed_dma_cookies,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12868 spx->txlt_curwin_num_dma_cookies);
3935
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
12869
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
12870 /*
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
12871 * 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
12872 * of s/g limitation.
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
12873 * 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
12874 * 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
12875 */
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
12876 if (spx->txlt_dma_cookie_list == NULL) {
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
12877 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
12878 spx->txlt_dma_cookie_list_len = 1;
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
12879 }
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
12880 /*
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
12881 * 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
12882 * 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
12883 * current dma cookie list.
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
12884 */
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
12885 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
12886 (spx->txlt_curwin_num_dma_cookies -
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
12887 spx->txlt_curwin_processed_dma_cookies));
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
12888
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
12889 /* Fetch the next batch of cookies */
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
12890 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
12891 ddi_dma_nextcookie(spx->txlt_buf_dma_handle,
4582
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
12892 &spx->txlt_dma_cookie_list[i]);
3935
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
12893 cur_txfer_len +=
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
12894 (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
12895 spx->txlt_sata_pkt->
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
12896 satapkt_cmd.satacmd_num_dma_cookies++;
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
12897 spx->txlt_curwin_processed_dma_cookies++;
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
12898 }
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
12899 }
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
12900
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
12901 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
12902
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
12903 /* Point sata_cmd to the cookie list */
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12904 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
12905 &spx->txlt_dma_cookie_list[0];
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
12906
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
12907 /* 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
12908 spx->txlt_num_dma_cookies =
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
12909 spx->txlt_sata_pkt->satapkt_cmd.satacmd_num_dma_cookies;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12910
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12911 ASSERT(cur_txfer_len != 0);
2539
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
12912 if (cur_txfer_len <= bp->b_bcount)
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
12913 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
12914 else {
2539
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
12915 /*
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
12916 * Temporary DMA buffer has been padded by
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
12917 * ddi_dma_mem_alloc()!
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
12918 * This requires special handling, because DMA cookies are
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
12919 * 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
12920 * 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
12921 * 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
12922 * the requested number of bytes.
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
12923 */
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
12924 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
12925 }
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12926
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12927 return (DDI_SUCCESS);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12928 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12929
7152
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
12930 /*
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
12931 * Common routine for releasing DMA resources
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
12932 */
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
12933 static void
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
12934 sata_common_free_dma_rsrcs(sata_pkt_txlate_t *spx)
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
12935 {
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
12936 if (spx->txlt_buf_dma_handle != NULL) {
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
12937 if (spx->txlt_tmp_buf != NULL) {
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
12938 /*
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
12939 * Intermediate DMA buffer was allocated.
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
12940 * Free allocated buffer and associated access handle.
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
12941 */
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
12942 ddi_dma_mem_free(&spx->txlt_tmp_buf_handle);
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
12943 spx->txlt_tmp_buf = NULL;
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
12944 }
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
12945 /*
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
12946 * Free DMA resources - cookies and handles
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
12947 */
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
12948 /* ASSERT(spx->txlt_dma_cookie_list != NULL); */
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
12949 if (spx->txlt_dma_cookie_list != NULL) {
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
12950 if (spx->txlt_dma_cookie_list !=
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
12951 &spx->txlt_dma_cookie) {
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
12952 (void) kmem_free(spx->txlt_dma_cookie_list,
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
12953 spx->txlt_dma_cookie_list_len *
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
12954 sizeof (ddi_dma_cookie_t));
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
12955 spx->txlt_dma_cookie_list = NULL;
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
12956 }
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
12957 }
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
12958 (void) ddi_dma_unbind_handle(spx->txlt_buf_dma_handle);
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
12959 (void) ddi_dma_free_handle(&spx->txlt_buf_dma_handle);
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
12960 spx->txlt_buf_dma_handle = NULL;
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
12961 }
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
12962 }
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
12963
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
12964 /*
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
12965 * Free DMA resources
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
12966 * 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
12967 *
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
12968 * Returns Void
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
12969 */
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
12970 void
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
12971 sata_free_dma_resources(sata_pkt_t *sata_pkt)
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
12972 {
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
12973 sata_pkt_txlate_t *spx;
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
12974
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
12975 if (sata_pkt == NULL)
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
12976 return;
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
12977
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
12978 spx = (sata_pkt_txlate_t *)sata_pkt->satapkt_framework_private;
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
12979
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
12980 sata_common_free_dma_rsrcs(spx);
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
12981 }
10391
12b08c516444 6838603 Under heavy I/O load, all Seagate Dragonfly drives in an x4x40 go offline at the same time
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 10318
diff changeset
12982
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12983 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12984 * Fetch Device Identify data.
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
12985 * 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
12986 * command to a device and get the device identify data.
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12987 * 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
12988 * device identify command).
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12989 *
2960
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
12990 * Returns:
4014
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
12991 * SATA_SUCCESS if cmd succeeded
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
12992 * 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
12993 * 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
12994 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12995 * Cannot be called in an interrupt context.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12996 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12997
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12998 static int
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
12999 sata_fetch_device_identify_data(sata_hba_inst_t *sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
13000 sata_drive_info_t *sdinfo)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
13001 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
13002 struct buf *bp;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
13003 sata_pkt_t *spkt;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
13004 sata_cmd_t *scmd;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
13005 sata_pkt_txlate_t *spx;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
13006 int rval;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
13007
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
13008 spx = kmem_zalloc(sizeof (sata_pkt_txlate_t), KM_SLEEP);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
13009 spx->txlt_sata_hba_inst = sata_hba_inst;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
13010 spx->txlt_scsi_pkt = NULL; /* No scsi pkt involved */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
13011 spkt = sata_pkt_alloc(spx, SLEEP_FUNC);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
13012 if (spkt == NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
13013 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
13014 return (SATA_RETRY); /* may retry later */
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
13015 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
13016 /* address is needed now */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
13017 spkt->satapkt_device.satadev_addr = sdinfo->satadrv_addr;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
13018
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
13019 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
13020 * Allocate buffer for Identify Data return data
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
13021 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
13022 bp = sata_alloc_local_buffer(spx, sizeof (sata_id_t));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
13023 if (bp == NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
13024 sata_pkt_free(spx);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
13025 kmem_free(spx, sizeof (sata_pkt_txlate_t));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
13026 SATA_LOG_D((sata_hba_inst, CE_WARN,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
13027 "sata_fetch_device_identify_data: "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
13028 "cannot allocate buffer for ID"));
4014
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
13029 return (SATA_RETRY); /* may retry later */
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
13030 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
13031
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
13032 /* Fill sata_pkt */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
13033 sdinfo->satadrv_state = SATA_STATE_PROBING;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
13034 spkt->satapkt_device.satadev_addr = sdinfo->satadrv_addr;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
13035 spkt->satapkt_op_mode = SATA_OPMODE_SYNCH | SATA_OPMODE_INTERRUPTS;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
13036 /* Synchronous mode, no callback */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
13037 spkt->satapkt_comp = NULL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
13038 /* Timeout 30s */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
13039 spkt->satapkt_time = sata_default_pkt_time;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
13040
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
13041 scmd = &spkt->satapkt_cmd;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
13042 scmd->satacmd_bp = bp;
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
13043 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
13044 scmd->satacmd_flags.sata_ignore_dev_reset = B_TRUE;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
13045
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
13046 /* Build Identify Device cmd in the sata_pkt */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
13047 scmd->satacmd_addr_type = 0; /* N/A */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
13048 scmd->satacmd_sec_count_lsb = 0; /* N/A */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
13049 scmd->satacmd_lba_low_lsb = 0; /* N/A */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
13050 scmd->satacmd_lba_mid_lsb = 0; /* N/A */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
13051 scmd->satacmd_lba_high_lsb = 0; /* N/A */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
13052 scmd->satacmd_features_reg = 0; /* N/A */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
13053 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
13054 if (sdinfo->satadrv_type & SATA_DTYPE_ATAPI) {
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
13055 /* Identify Packet Device cmd */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
13056 scmd->satacmd_cmd_reg = SATAC_ID_PACKET_DEVICE;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
13057 } else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
13058 /* Identify Device cmd - mandatory for all other devices */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
13059 scmd->satacmd_cmd_reg = SATAC_ID_DEVICE;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
13060 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
13061
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
13062 /* 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
13063 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
13064
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
13065 #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
13066 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
13067 #endif
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
13068
2960
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
13069 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
13070 spkt->satapkt_reason == SATA_PKT_COMPLETED) {
7152
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
13071 if (spx->txlt_buf_dma_handle != NULL) {
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
13072 rval = ddi_dma_sync(spx->txlt_buf_dma_handle, 0, 0,
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
13073 DDI_DMA_SYNC_FORKERNEL);
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
13074 ASSERT(rval == DDI_SUCCESS);
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
13075 }
5832
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
13076 if ((((sata_id_t *)(bp->b_un.b_addr))->ai_config &
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
13077 SATA_INCOMPLETE_DATA) == SATA_INCOMPLETE_DATA) {
3935
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
13078 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
13079 "SATA disk device at port %d - "
1a2f23099c2a 6428449 sata disks have read cache disabled after being hot-plugged
pawelw
parents: 2593
diff changeset
13080 "partial Identify Data",
3935
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
13081 sdinfo->satadrv_addr.cport));
4014
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
13082 rval = SATA_RETRY; /* may retry later */
2734
1a2f23099c2a 6428449 sata disks have read cache disabled after being hot-plugged
pawelw
parents: 2593
diff changeset
13083 goto fail;
1a2f23099c2a 6428449 sata disks have read cache disabled after being hot-plugged
pawelw
parents: 2593
diff changeset
13084 }
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
13085 /* Update sata_drive_info */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
13086 bcopy(bp->b_un.b_addr, &sdinfo->satadrv_id,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
13087 sizeof (sata_id_t));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
13088
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
13089 sdinfo->satadrv_features_support = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
13090 if (sdinfo->satadrv_type == SATA_DTYPE_ATADISK) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
13091 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
13092 * Retrieve capacity (disks only) and addressing mode
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 sdinfo->satadrv_capacity = sata_check_capacity(sdinfo);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
13095 } else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
13096 /*
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
13097 * For ATAPI devices one would have to issue
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
13098 * Get Capacity cmd for media capacity. Not here.
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
13099 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
13100 sdinfo->satadrv_capacity = 0;
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
13101 /*
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
13102 * Check what cdb length is supported
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
13103 */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
13104 if ((sdinfo->satadrv_id.ai_config &
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
13105 SATA_ATAPI_ID_PKT_SZ) == SATA_ATAPI_ID_PKT_16B)
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
13106 sdinfo->satadrv_atapi_cdb_len = 16;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
13107 else
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
13108 sdinfo->satadrv_atapi_cdb_len = 12;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
13109 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
13110 /* Setup supported features flags */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
13111 if (sdinfo->satadrv_id.ai_cap & SATA_DMA_SUPPORT)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
13112 sdinfo->satadrv_features_support |= SATA_DEV_F_DMA;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
13113
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
13114 /* Check for SATA GEN and NCQ support */
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
13115 if (sdinfo->satadrv_id.ai_satacap != 0 &&
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
13116 sdinfo->satadrv_id.ai_satacap != 0xffff) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
13117 /* SATA compliance */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
13118 if (sdinfo->satadrv_id.ai_satacap & SATA_NCQ)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
13119 sdinfo->satadrv_features_support |=
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
13120 SATA_DEV_F_NCQ;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
13121 if (sdinfo->satadrv_id.ai_satacap &
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
13122 (SATA_1_SPEED | SATA_2_SPEED)) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
13123 if (sdinfo->satadrv_id.ai_satacap &
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
13124 SATA_2_SPEED)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
13125 sdinfo->satadrv_features_support |=
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
13126 SATA_DEV_F_SATA2;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
13127 if (sdinfo->satadrv_id.ai_satacap &
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
13128 SATA_1_SPEED)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
13129 sdinfo->satadrv_features_support |=
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
13130 SATA_DEV_F_SATA1;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
13131 } else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
13132 sdinfo->satadrv_features_support |=
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
13133 SATA_DEV_F_SATA1;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
13134 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
13135 }
1940
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
13136 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
13137 (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
13138 sdinfo->satadrv_features_support |= SATA_DEV_F_TCQ;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
13139
2553
624f674f2ad8 6430966 SATA NCQ support is needed in SATA framework and hba drivers
ls24207
parents: 2539
diff changeset
13140 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
13141 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
13142 (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
13143 ++sdinfo->satadrv_queue_depth;
5014
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
13144 /* Adjust according to controller capabilities */
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
13145 sdinfo->satadrv_max_queue_depth = MIN(
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
13146 sdinfo->satadrv_queue_depth,
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
13147 SATA_QDEPTH(sata_hba_inst));
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
13148 /* Adjust according to global queue depth limit */
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
13149 sdinfo->satadrv_max_queue_depth = MIN(
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
13150 sdinfo->satadrv_max_queue_depth,
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
13151 sata_current_max_qdepth);
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
13152 if (sdinfo->satadrv_max_queue_depth == 0)
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
13153 sdinfo->satadrv_max_queue_depth = 1;
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
13154 } else
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
13155 sdinfo->satadrv_max_queue_depth = 1;
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
13156
4014
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
13157 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
13158 } else {
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
13159 /*
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
13160 * 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
13161 */
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
13162 if (rval == SATA_TRAN_BUSY || rval == SATA_TRAN_QUEUE_FULL) {
4582
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
13163 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
13164 } 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
13165 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
13166 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
13167 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
13168 spkt->satapkt_reason == SATA_PKT_RESET)
4014
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
13169 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
13170 else
4014
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
13171 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
13172 } else {
4014
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
13173 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
13174 }
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
13175 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
13176 fail:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
13177 /* Free allocated resources */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
13178 sata_free_local_buffer(spx);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
13179 sata_pkt_free(spx);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
13180 kmem_free(spx, sizeof (sata_pkt_txlate_t));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
13181
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
13182 return (rval);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
13183 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
13184
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
13185
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
13186 /*
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
13187 * 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
13188 * UDMA mode is checked first, followed by MWDMA mode.
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
13189 * 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
13190 * 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
13191 * 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
13192 * restriction has been removed.
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
13193 *
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
13194 * 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
13195 * Returns SATA_FAILURE if proper DMA mode could not be selected.
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
13196 *
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
13197 * 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
13198 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
13199 static int
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
13200 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
13201 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
13202 sata_pkt_t *spkt;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
13203 sata_cmd_t *scmd;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
13204 sata_pkt_txlate_t *spx;
11351
3f9ad5952518 6908813 ahci timeouts experienced on Toshiba M10's with TEAC DV-W28S-RT DVD drives
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 11222
diff changeset
13205 int i, mode;
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
13206 uint8_t subcmd;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
13207 int rval = SATA_SUCCESS;
1258
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 ASSERT(sdinfo != NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
13210 ASSERT(sata_hba_inst != NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
13211
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
13212 if ((sdinfo->satadrv_id.ai_validinfo & SATA_VALIDINFO_88) != 0 &&
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
13213 (sdinfo->satadrv_id.ai_ultradma & SATA_UDMA_SUP_MASK) != 0) {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
13214 /* Find highest Ultra DMA mode supported */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
13215 for (mode = 6; mode >= 0; --mode) {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
13216 if (sdinfo->satadrv_id.ai_ultradma & (1 << mode))
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
13217 break;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
13218 }
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
13219 #if 0
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
13220 /* Left for historical reasons */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
13221 /*
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
13222 * Some initial version of SATA spec indicated that at least
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
13223 * 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
13224 * SerialATA 2.6, so this restriction is removed.
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
13225 */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
13226 if (mode < 4)
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
13227 return (SATA_FAILURE);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
13228 #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
13229
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
13230 /*
11351
3f9ad5952518 6908813 ahci timeouts experienced on Toshiba M10's with TEAC DV-W28S-RT DVD drives
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 11222
diff changeset
13231 * For disk, we're still going to set DMA mode whatever is
3f9ad5952518 6908813 ahci timeouts experienced on Toshiba M10's with TEAC DV-W28S-RT DVD drives
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 11222
diff changeset
13232 * selected by default
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
13233 *
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
13234 * 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
13235 * 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
13236 * 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
13237 * 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
13238 */
11351
3f9ad5952518 6908813 ahci timeouts experienced on Toshiba M10's with TEAC DV-W28S-RT DVD drives
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 11222
diff changeset
13239 if (sdinfo->satadrv_type != SATA_DTYPE_ATADISK) {
3f9ad5952518 6908813 ahci timeouts experienced on Toshiba M10's with TEAC DV-W28S-RT DVD drives
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 11222
diff changeset
13240
3f9ad5952518 6908813 ahci timeouts experienced on Toshiba M10's with TEAC DV-W28S-RT DVD drives
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 11222
diff changeset
13241 /* Find UDMA mode currently selected */
3f9ad5952518 6908813 ahci timeouts experienced on Toshiba M10's with TEAC DV-W28S-RT DVD drives
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 11222
diff changeset
13242 for (i = 6; i >= 0; --i) {
3f9ad5952518 6908813 ahci timeouts experienced on Toshiba M10's with TEAC DV-W28S-RT DVD drives
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 11222
diff changeset
13243 if (sdinfo->satadrv_id.ai_ultradma &
3f9ad5952518 6908813 ahci timeouts experienced on Toshiba M10's with TEAC DV-W28S-RT DVD drives
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 11222
diff changeset
13244 (1 << (i + 8)))
3f9ad5952518 6908813 ahci timeouts experienced on Toshiba M10's with TEAC DV-W28S-RT DVD drives
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 11222
diff changeset
13245 break;
3f9ad5952518 6908813 ahci timeouts experienced on Toshiba M10's with TEAC DV-W28S-RT DVD drives
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 11222
diff changeset
13246 }
3f9ad5952518 6908813 ahci timeouts experienced on Toshiba M10's with TEAC DV-W28S-RT DVD drives
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 11222
diff changeset
13247 if (i >= mode)
3f9ad5952518 6908813 ahci timeouts experienced on Toshiba M10's with TEAC DV-W28S-RT DVD drives
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 11222
diff changeset
13248 /* Nothing to do */
3f9ad5952518 6908813 ahci timeouts experienced on Toshiba M10's with TEAC DV-W28S-RT DVD drives
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 11222
diff changeset
13249 return (SATA_SUCCESS);
3f9ad5952518 6908813 ahci timeouts experienced on Toshiba M10's with TEAC DV-W28S-RT DVD drives
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 11222
diff changeset
13250 }
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
13251
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
13252 subcmd = SATAC_TRANSFER_MODE_ULTRA_DMA;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
13253
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
13254 } 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
13255 /* Find highest MultiWord DMA mode supported */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
13256 for (mode = 2; mode >= 0; --mode) {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
13257 if (sdinfo->satadrv_id.ai_dworddma & (1 << mode))
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
13258 break;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
13259 }
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
13260
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
13261 /*
11351
3f9ad5952518 6908813 ahci timeouts experienced on Toshiba M10's with TEAC DV-W28S-RT DVD drives
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 11222
diff changeset
13262 * For disk, We're still going to set DMA mode whatever is
3f9ad5952518 6908813 ahci timeouts experienced on Toshiba M10's with TEAC DV-W28S-RT DVD drives
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 11222
diff changeset
13263 * selected by default
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
13264 *
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
13265 * 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
13266 * 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
13267 * 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
13268 * 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
13269 */
11351
3f9ad5952518 6908813 ahci timeouts experienced on Toshiba M10's with TEAC DV-W28S-RT DVD drives
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 11222
diff changeset
13270 if (sdinfo->satadrv_type != SATA_DTYPE_ATADISK) {
3f9ad5952518 6908813 ahci timeouts experienced on Toshiba M10's with TEAC DV-W28S-RT DVD drives
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 11222
diff changeset
13271
3f9ad5952518 6908813 ahci timeouts experienced on Toshiba M10's with TEAC DV-W28S-RT DVD drives
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 11222
diff changeset
13272 /* Find highest MultiWord DMA mode selected */
3f9ad5952518 6908813 ahci timeouts experienced on Toshiba M10's with TEAC DV-W28S-RT DVD drives
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 11222
diff changeset
13273 for (i = 2; i >= 0; --i) {
3f9ad5952518 6908813 ahci timeouts experienced on Toshiba M10's with TEAC DV-W28S-RT DVD drives
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 11222
diff changeset
13274 if (sdinfo->satadrv_id.ai_dworddma &
3f9ad5952518 6908813 ahci timeouts experienced on Toshiba M10's with TEAC DV-W28S-RT DVD drives
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 11222
diff changeset
13275 (1 << (i + 8)))
3f9ad5952518 6908813 ahci timeouts experienced on Toshiba M10's with TEAC DV-W28S-RT DVD drives
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 11222
diff changeset
13276 break;
3f9ad5952518 6908813 ahci timeouts experienced on Toshiba M10's with TEAC DV-W28S-RT DVD drives
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 11222
diff changeset
13277 }
3f9ad5952518 6908813 ahci timeouts experienced on Toshiba M10's with TEAC DV-W28S-RT DVD drives
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 11222
diff changeset
13278 if (i >= mode)
3f9ad5952518 6908813 ahci timeouts experienced on Toshiba M10's with TEAC DV-W28S-RT DVD drives
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 11222
diff changeset
13279 /* Nothing to do */
3f9ad5952518 6908813 ahci timeouts experienced on Toshiba M10's with TEAC DV-W28S-RT DVD drives
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 11222
diff changeset
13280 return (SATA_SUCCESS);
3f9ad5952518 6908813 ahci timeouts experienced on Toshiba M10's with TEAC DV-W28S-RT DVD drives
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 11222
diff changeset
13281 }
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
13282
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
13283 subcmd = SATAC_TRANSFER_MODE_MULTI_WORD_DMA;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
13284 } else
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
13285 return (SATA_SUCCESS);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
13286
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
13287 /*
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
13288 * Set DMA mode via SET FEATURES COMMAND.
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
13289 * Prepare packet for SET FEATURES COMMAND.
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
13290 */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
13291 spx = kmem_zalloc(sizeof (sata_pkt_txlate_t), KM_SLEEP);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
13292 spx->txlt_sata_hba_inst = sata_hba_inst;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
13293 spx->txlt_scsi_pkt = NULL; /* No scsi pkt involved */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
13294 spkt = sata_pkt_alloc(spx, SLEEP_FUNC);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
13295 if (spkt == NULL) {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
13296 SATA_LOG_D((sata_hba_inst, CE_WARN,
11790
033fba349b6c 6925789 sata_set_dma_mode logging format string is missing a conversion specification
Justin Roth <Justin.Roth@Sun.COM>
parents: 11598
diff changeset
13297 "sata_set_dma_mode: could not set DMA mode %d", mode));
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
13298 rval = SATA_FAILURE;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
13299 goto done;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
13300 }
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
13301 /* Fill sata_pkt */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
13302 spkt->satapkt_device.satadev_addr = sdinfo->satadrv_addr;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
13303 /* Timeout 30s */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
13304 spkt->satapkt_time = sata_default_pkt_time;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
13305 /* Synchronous mode, no callback, interrupts */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
13306 spkt->satapkt_op_mode = SATA_OPMODE_SYNCH | SATA_OPMODE_INTERRUPTS;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
13307 spkt->satapkt_comp = NULL;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
13308 scmd = &spkt->satapkt_cmd;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
13309 scmd->satacmd_flags.sata_data_direction = SATA_DIR_NODATA_XFER;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
13310 scmd->satacmd_flags.sata_ignore_dev_reset = B_TRUE;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
13311 scmd->satacmd_addr_type = 0;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
13312 scmd->satacmd_device_reg = 0;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
13313 scmd->satacmd_status_reg = 0;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
13314 scmd->satacmd_error_reg = 0;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
13315 scmd->satacmd_cmd_reg = SATAC_SET_FEATURES;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
13316 scmd->satacmd_features_reg = SATAC_SF_TRANSFER_MODE;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
13317 scmd->satacmd_sec_count_lsb = subcmd | mode;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
13318
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
13319 /* Transfer command to HBA */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
13320 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
13321 spkt) != SATA_TRAN_ACCEPTED ||
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
13322 spkt->satapkt_reason != SATA_PKT_COMPLETED) {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
13323 /* Pkt execution failed */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
13324 rval = SATA_FAILURE;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
13325 }
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
13326 done:
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
13327
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
13328 /* Free allocated resources */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
13329 if (spkt != NULL)
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
13330 sata_pkt_free(spx);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
13331 (void) kmem_free(spx, sizeof (sata_pkt_txlate_t));
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
13332
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
13333 return (rval);
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
13334 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
13335
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
13336
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
13337 /*
1781
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
13338 * Set device caching mode.
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
13339 * One of the following operations should be specified:
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
13340 * SATAC_SF_ENABLE_READ_AHEAD
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
13341 * SATAC_SF_DISABLE_READ_AHEAD
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
13342 * SATAC_SF_ENABLE_WRITE_CACHE
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
13343 * SATAC_SF_DISABLE_WRITE_CACHE
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
13344 *
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
13345 * 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
13346 * 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
13347 * 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
13348 */
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
13349
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
13350 static int
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
13351 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
13352 int cache_op)
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
13353 {
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
13354 sata_pkt_t *spkt;
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
13355 sata_cmd_t *scmd;
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
13356 sata_pkt_txlate_t *spx;
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
13357 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
13358 int hba_rval;
1781
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
13359 char *infop;
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
13360
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
13361 ASSERT(sdinfo != NULL);
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
13362 ASSERT(sata_hba_inst != NULL);
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
13363 ASSERT(cache_op == SATAC_SF_ENABLE_READ_AHEAD ||
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
13364 cache_op == SATAC_SF_DISABLE_READ_AHEAD ||
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
13365 cache_op == SATAC_SF_ENABLE_WRITE_CACHE ||
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
13366 cache_op == SATAC_SF_DISABLE_WRITE_CACHE);
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
13367
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
13368
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
13369 /* Prepare packet for SET FEATURES COMMAND */
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
13370 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
13371 spx->txlt_sata_hba_inst = sata_hba_inst;
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
13372 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
13373 spkt = sata_pkt_alloc(spx, SLEEP_FUNC);
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
13374 if (spkt == NULL) {
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
13375 rval = SATA_FAILURE;
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
13376 goto failure;
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
13377 }
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
13378 /* Fill sata_pkt */
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
13379 spkt->satapkt_device.satadev_addr = sdinfo->satadrv_addr;
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
13380 /* Timeout 30s */
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
13381 spkt->satapkt_time = sata_default_pkt_time;
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
13382 /* Synchronous mode, no callback, interrupts */
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
13383 spkt->satapkt_op_mode =
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
13384 SATA_OPMODE_SYNCH | SATA_OPMODE_INTERRUPTS;
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
13385 spkt->satapkt_comp = NULL;
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
13386 scmd = &spkt->satapkt_cmd;
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
13387 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
13388 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
13389 scmd->satacmd_addr_type = 0;
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
13390 scmd->satacmd_device_reg = 0;
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
13391 scmd->satacmd_status_reg = 0;
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
13392 scmd->satacmd_error_reg = 0;
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
13393 scmd->satacmd_cmd_reg = SATAC_SET_FEATURES;
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
13394 scmd->satacmd_features_reg = cache_op;
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
13395
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
13396 /* 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
13397 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
13398 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
13399
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
13400 #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
13401 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
13402 #endif
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
13403
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
13404 if ((hba_rval != SATA_TRAN_ACCEPTED) ||
1781
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
13405 (spkt->satapkt_reason != SATA_PKT_COMPLETED)) {
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
13406 /* Pkt execution failed */
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
13407 switch (cache_op) {
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
13408 case SATAC_SF_ENABLE_READ_AHEAD:
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
13409 infop = "enabling read ahead failed";
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
13410 break;
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
13411 case SATAC_SF_DISABLE_READ_AHEAD:
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
13412 infop = "disabling read ahead failed";
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
13413 break;
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
13414 case SATAC_SF_ENABLE_WRITE_CACHE:
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
13415 infop = "enabling write cache failed";
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
13416 break;
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
13417 case SATAC_SF_DISABLE_WRITE_CACHE:
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
13418 infop = "disabling write cache failed";
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
13419 break;
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
13420 }
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
13421 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
13422 rval = SATA_RETRY;
1781
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
13423 }
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
13424 failure:
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
13425 /* Free allocated resources */
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
13426 if (spkt != NULL)
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
13427 sata_pkt_free(spx);
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
13428 (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
13429 return (rval);
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
13430 }
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
13431
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
13432 /*
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
13433 * Set Removable Media Status Notification (enable/disable)
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
13434 * state == 0 , disable
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
13435 * state != 0 , enable
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
13436 *
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
13437 * If operation fails, system log messgage is emitted.
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
13438 * Returns SATA_SUCCESS when the operation succeeds, SATA_FAILURE otherwise.
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
13439 */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
13440
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
13441 static int
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
13442 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
13443 int state)
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
13444 {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
13445 sata_pkt_t *spkt;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
13446 sata_cmd_t *scmd;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
13447 sata_pkt_txlate_t *spx;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
13448 int rval = SATA_SUCCESS;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
13449 char *infop;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
13450
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
13451 ASSERT(sdinfo != NULL);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
13452 ASSERT(sata_hba_inst != NULL);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
13453
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
13454 /* Prepare packet for SET FEATURES COMMAND */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
13455 spx = kmem_zalloc(sizeof (sata_pkt_txlate_t), KM_SLEEP);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
13456 spx->txlt_sata_hba_inst = sata_hba_inst;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
13457 spx->txlt_scsi_pkt = NULL; /* No scsi pkt involved */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
13458 spkt = sata_pkt_alloc(spx, SLEEP_FUNC);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
13459 if (spkt == NULL) {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
13460 rval = SATA_FAILURE;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
13461 goto failure;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
13462 }
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
13463 /* Fill sata_pkt */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
13464 spkt->satapkt_device.satadev_addr = sdinfo->satadrv_addr;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
13465 /* Timeout 30s */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
13466 spkt->satapkt_time = sata_default_pkt_time;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
13467 /* Synchronous mode, no callback, interrupts */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
13468 spkt->satapkt_op_mode =
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
13469 SATA_OPMODE_SYNCH | SATA_OPMODE_INTERRUPTS;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
13470 spkt->satapkt_comp = NULL;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
13471 scmd = &spkt->satapkt_cmd;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
13472 scmd->satacmd_flags.sata_data_direction = SATA_DIR_NODATA_XFER;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
13473 scmd->satacmd_flags.sata_ignore_dev_reset = B_TRUE;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
13474 scmd->satacmd_addr_type = 0;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
13475 scmd->satacmd_device_reg = 0;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
13476 scmd->satacmd_status_reg = 0;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
13477 scmd->satacmd_error_reg = 0;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
13478 scmd->satacmd_cmd_reg = SATAC_SET_FEATURES;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
13479 if (state == 0)
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
13480 scmd->satacmd_features_reg = SATAC_SF_DISABLE_RMSN;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
13481 else
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
13482 scmd->satacmd_features_reg = SATAC_SF_ENABLE_RMSN;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
13483
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
13484 /* Transfer command to HBA */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
13485 if (((*SATA_START_FUNC(sata_hba_inst))(
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
13486 SATA_DIP(sata_hba_inst), spkt) != SATA_TRAN_ACCEPTED) ||
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
13487 (spkt->satapkt_reason != SATA_PKT_COMPLETED)) {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
13488 /* Pkt execution failed */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
13489 if (state == 0)
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
13490 infop = "disabling Removable Media Status "
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
13491 "Notification failed";
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
13492 else
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
13493 infop = "enabling Removable Media Status "
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
13494 "Notification failed";
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
13495
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
13496 SATA_LOG_D((sata_hba_inst, CE_WARN, "%s", infop));
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
13497 rval = SATA_FAILURE;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
13498 }
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
13499 failure:
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
13500 /* Free allocated resources */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
13501 if (spkt != NULL)
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
13502 sata_pkt_free(spx);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
13503 (void) kmem_free(spx, sizeof (sata_pkt_txlate_t));
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
13504 return (rval);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
13505 }
1781
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
13506
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
13507
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
13508 /*
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
13509 * Update state and copy port ss* values from passed sata_device structure.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
13510 * 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
13511 * configuration struct.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
13512 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
13513 * 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
13514 * regardless of the state in device argument.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
13515 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
13516 * Port mutex should be held while calling this function.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
13517 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
13518 static void
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
13519 sata_update_port_info(sata_hba_inst_t *sata_hba_inst,
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13520 sata_device_t *sata_device)
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13521 {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13522 sata_cport_info_t *cportinfo;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
13523
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
13524 if (sata_device->satadev_addr.qual == SATA_ADDR_CPORT ||
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
13525 sata_device->satadev_addr.qual == SATA_ADDR_DCPORT) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
13526 if (SATA_NUM_CPORTS(sata_hba_inst) <=
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
13527 sata_device->satadev_addr.cport)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
13528 return;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
13529
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
13530 cportinfo = SATA_CPORT_INFO(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
13531 sata_device->satadev_addr.cport);
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13532
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13533 ASSERT(mutex_owned(&cportinfo->cport_mutex));
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13534 cportinfo->cport_scr = sata_device->satadev_scr;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
13535
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
13536 /* Preserve SATA_PSTATE_SHUTDOWN flag */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
13537 cportinfo->cport_state &= ~(SATA_PSTATE_PWRON |
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
13538 SATA_PSTATE_PWROFF | SATA_PSTATE_FAILED);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
13539 cportinfo->cport_state |=
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
13540 sata_device->satadev_state & SATA_PSTATE_VALID;
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13541 }
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13542 }
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13543
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13544 void
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13545 sata_update_pmport_info(sata_hba_inst_t *sata_hba_inst,
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13546 sata_device_t *sata_device)
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13547 {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13548 sata_pmport_info_t *pmportinfo;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13549
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13550 if ((sata_device->satadev_addr.qual != SATA_ADDR_PMPORT &&
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13551 sata_device->satadev_addr.qual != SATA_ADDR_DPMPORT) ||
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13552 SATA_NUM_PMPORTS(sata_hba_inst,
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13553 sata_device->satadev_addr.cport) <
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13554 sata_device->satadev_addr.pmport) {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13555 SATADBG1(SATA_DBG_PMULT, sata_hba_inst,
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13556 "sata_update_port_info: error address %p.",
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13557 &sata_device->satadev_addr);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13558 return;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13559 }
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13560
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13561 pmportinfo = SATA_PMPORT_INFO(sata_hba_inst,
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13562 sata_device->satadev_addr.cport,
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13563 sata_device->satadev_addr.pmport);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13564
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13565 ASSERT(mutex_owned(&pmportinfo->pmport_mutex));
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13566 pmportinfo->pmport_scr = sata_device->satadev_scr;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13567
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13568 /* Preserve SATA_PSTATE_SHUTDOWN flag */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13569 pmportinfo->pmport_state &=
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13570 ~(SATA_PSTATE_PWRON | SATA_PSTATE_PWROFF | SATA_PSTATE_FAILED);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13571 pmportinfo->pmport_state |=
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13572 sata_device->satadev_state & SATA_PSTATE_VALID;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13573 }
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
13574
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
13575 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
13576 * Extract SATA port specification from an IOCTL argument.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
13577 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
13578 * 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
13579 * cannot retrieve port spec, then -1 is returned.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
13580 *
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13581 * Support port multiplier.
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
13582 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
13583 static int32_t
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
13584 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
13585 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
13586 int32_t port;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
13587
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
13588 /* Extract port number from nvpair in dca structure */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
13589 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
13590 SATA_LOG_D((sata_hba_inst, CE_NOTE,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
13591 "sata_get_port_num: invalid port spec 0x%x in ioctl",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
13592 port));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
13593 port = -1;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
13594 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
13595
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
13596 return (port);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
13597 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
13598
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
13599 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
13600 * 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
13601 * NOTE: target argument is a value used in ioctls to identify
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
13602 * the AP - it is not a sata_address.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
13603 * It is a combination of cport, pmport and address qualifier, encodded same
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
13604 * way as a scsi target number.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
13605 * At this moment it carries only cport number.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
13606 *
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13607 * PMult hotplug is supported now.
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
13608 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
13609 * Returns dev_info_t pointer if target device was found, NULL otherwise.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
13610 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
13611
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
13612 static dev_info_t *
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13613 sata_get_target_dip(dev_info_t *dip, uint8_t cport, uint8_t pmport)
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
13614 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
13615 dev_info_t *cdip = NULL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
13616 int target, tgt;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
13617 int circ;
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13618 uint8_t qual;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13619
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13620 sata_hba_inst_t *sata_hba_inst;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13621 scsi_hba_tran_t *scsi_hba_tran;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13622
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13623 /* Get target id */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13624 scsi_hba_tran = ddi_get_driver_private(dip);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13625 if (scsi_hba_tran == NULL)
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13626 return (NULL);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13627
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13628 sata_hba_inst = scsi_hba_tran->tran_hba_private;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13629
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13630 if (sata_hba_inst == NULL)
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13631 return (NULL);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13632
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13633 /* Identify a port-mult by cport_info.cport_dev_type */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13634 if (SATA_CPORT_DEV_TYPE(sata_hba_inst, cport) == SATA_DTYPE_PMULT)
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13635 qual = SATA_ADDR_DPMPORT;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13636 else
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13637 qual = SATA_ADDR_DCPORT;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13638
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13639 target = SATA_TO_SCSI_TARGET(cport, pmport, qual);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13640
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13641 /* Retrieve target dip */
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
13642 ndi_devi_enter(dip, &circ);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
13643 for (cdip = ddi_get_child(dip); cdip != NULL; ) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
13644 dev_info_t *next = ddi_get_next_sibling(cdip);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
13645
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
13646 tgt = ddi_prop_get_int(DDI_DEV_T_ANY, cdip,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
13647 DDI_PROP_DONTPASS, "target", -1);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
13648 if (tgt == -1) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
13649 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
13650 * This is actually an error condition, but not
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
13651 * a fatal one. Just continue the search.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
13652 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
13653 cdip = next;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
13654 continue;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
13655 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
13656
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
13657 if (tgt == target)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
13658 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
13659
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
13660 cdip = next;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
13661 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
13662 ndi_devi_exit(dip, circ);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
13663
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
13664 return (cdip);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
13665 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
13666
5832
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
13667 /*
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
13668 * 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
13669 * NOTE: target argument is a value used in ioctls to identify
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
13670 * the AP - it is not a sata_address.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
13671 * 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
13672 * way as a scsi target number.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
13673 *
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
13674 * 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
13675 */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
13676
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
13677 static dev_info_t *
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
13678 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
13679 {
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
13680 dev_info_t *cdip = NULL;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
13681 int target, tgt;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
13682 int circ;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
13683
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
13684 target = SATA_TO_SCSI_TARGET(saddr->cport, saddr->pmport, saddr->qual);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
13685
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
13686 ndi_devi_enter(dip, &circ);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
13687 for (cdip = ddi_get_child(dip); cdip != NULL; ) {
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
13688 dev_info_t *next = ddi_get_next_sibling(cdip);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
13689
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
13690 tgt = ddi_prop_get_int(DDI_DEV_T_ANY, cdip,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
13691 DDI_PROP_DONTPASS, "target", -1);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
13692 if (tgt == -1) {
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
13693 /*
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
13694 * This is actually an error condition, but not
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
13695 * a fatal one. Just continue the search.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
13696 */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
13697 cdip = next;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
13698 continue;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
13699 }
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
13700
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
13701 if (tgt == target)
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
13702 break;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
13703
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
13704 cdip = next;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
13705 }
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
13706 ndi_devi_exit(dip, circ);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
13707
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
13708 return (cdip);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
13709 }
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
13710
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
13711 /*
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
13712 * Process sata port disconnect request.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
13713 * Normally, cfgadm sata plugin will try to offline (unconfigure) the device
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
13714 * before this request. Nevertheless, if a device is still configured,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
13715 * we need to attempt to offline and unconfigure device.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
13716 * Regardless of the unconfigure operation results the port is marked as
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
13717 * deactivated and no access to the attached device is possible.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
13718 * If the target node remains because unconfigure operation failed, its state
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
13719 * 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
13720 * 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
13721 * the device and remove old target node.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
13722 *
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
13723 * This function invokes sata_hba_inst->satahba_tran->
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
13724 * sata_tran_hotplug_ops->sata_tran_port_deactivate().
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
13725 * 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
13726 * is removed and state of the port marked appropriately.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
13727 * 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
13728 * or may fail the port.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
13729 *
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13730 * NOTE: Port multiplier is supported.
5832
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
13731 */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
13732
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
13733 static int
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
13734 sata_ioctl_disconnect(sata_hba_inst_t *sata_hba_inst,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
13735 sata_device_t *sata_device)
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
13736 {
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13737 sata_drive_info_t *sdinfo = NULL, *subsdinfo = NULL;
5832
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
13738 sata_cport_info_t *cportinfo = NULL;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
13739 sata_pmport_info_t *pmportinfo = NULL;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
13740 sata_pmult_info_t *pmultinfo = NULL;
10391
12b08c516444 6838603 Under heavy I/O load, all Seagate Dragonfly drives in an x4x40 go offline at the same time
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 10318
diff changeset
13741 sata_device_t subsdevice;
5832
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
13742 int cport, pmport, qual;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
13743 int rval = SATA_SUCCESS;
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13744 int npmport = 0;
5832
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
13745 int rv = 0;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
13746
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
13747 cport = sata_device->satadev_addr.cport;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
13748 pmport = sata_device->satadev_addr.pmport;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
13749 qual = sata_device->satadev_addr.qual;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
13750
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13751 ASSERT(qual == SATA_ADDR_DCPORT || qual == SATA_ADDR_DPMPORT);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13752 if (qual == SATA_ADDR_DCPORT)
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13753 qual = SATA_ADDR_CPORT;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13754 else
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13755 qual = SATA_ADDR_PMPORT;
5832
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
13756
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
13757 /*
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
13758 * DEVCTL_AP_DISCONNECT invokes sata_hba_inst->satahba_tran->
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
13759 * sata_tran_hotplug_ops->sata_tran_port_deactivate().
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
13760 * Do the sanity check.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
13761 */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
13762 if (SATA_PORT_DEACTIVATE_FUNC(sata_hba_inst) == NULL) {
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
13763 /* No physical port deactivation supported. */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
13764 return (EINVAL);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
13765 }
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
13766
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
13767 /* Check the current state of the port */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
13768 rval = (*SATA_PROBE_PORT_FUNC(sata_hba_inst))
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
13769 (SATA_DIP(sata_hba_inst), sata_device);
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13770
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13771 cportinfo = SATA_CPORT_INFO(sata_hba_inst, cport);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13772
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13773 /*
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13774 * Processing port mulitiplier
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13775 */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13776 if (qual == SATA_ADDR_CPORT &&
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13777 SATA_CPORT_DEV_TYPE(sata_hba_inst, cport) == SATA_DTYPE_PMULT) {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13778 mutex_enter(&cportinfo->cport_mutex);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13779
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13780 /* Check controller port status */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13781 sata_update_port_info(sata_hba_inst, sata_device);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13782 if (rval != SATA_SUCCESS ||
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13783 (sata_device->satadev_state & SATA_PSTATE_FAILED) != 0) {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13784 /*
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13785 * Device port status is unknown or it is in failed
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13786 * state
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13787 */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13788 SATA_CPORT_STATE(sata_hba_inst, cport) =
5832
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
13789 SATA_PSTATE_FAILED;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
13790 SATADBG1(SATA_DBG_IOCTL_IF, sata_hba_inst,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
13791 "sata_hba_ioctl: connect: failed to deactivate "
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
13792 "SATA port %d", cport);
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13793 mutex_exit(&cportinfo->cport_mutex);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13794 return (EIO);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13795 }
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13796
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13797 /* Disconnect all sub-devices. */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13798 pmultinfo = SATA_CPORTINFO_PMULT_INFO(cportinfo);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13799 if (pmultinfo != NULL) {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13800
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13801 for (npmport = 0; npmport < SATA_NUM_PMPORTS(
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13802 sata_hba_inst, cport); npmport ++) {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13803 subsdinfo = SATA_PMPORT_DRV_INFO(
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13804 sata_hba_inst, cport, npmport);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13805 if (subsdinfo == NULL)
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13806 continue;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13807
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13808 subsdevice.satadev_addr = subsdinfo->
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13809 satadrv_addr;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13810
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13811 mutex_exit(&cportinfo->cport_mutex);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13812 if (sata_ioctl_disconnect(sata_hba_inst,
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13813 &subsdevice) == SATA_SUCCESS) {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13814 SATADBG2(SATA_DBG_PMULT, sata_hba_inst,
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13815 "[Remove] device at port %d:%d "
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13816 "successfully.", cport, npmport);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13817 }
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13818 mutex_enter(&cportinfo->cport_mutex);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13819 }
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13820 }
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13821
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13822 /* Disconnect the port multiplier */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13823 cportinfo->cport_state &= ~SATA_STATE_READY;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13824 mutex_exit(&cportinfo->cport_mutex);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13825
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13826 sata_device->satadev_addr.qual = qual;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13827 rval = (*SATA_PORT_DEACTIVATE_FUNC(sata_hba_inst))
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13828 (SATA_DIP(sata_hba_inst), sata_device);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13829
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13830 sata_gen_sysevent(sata_hba_inst, &sata_device->satadev_addr,
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13831 SE_NO_HINT);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13832
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13833 mutex_enter(&cportinfo->cport_mutex);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13834 sata_update_port_info(sata_hba_inst, sata_device);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13835 if (rval != SATA_SUCCESS &&
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13836 sata_device->satadev_state & SATA_PSTATE_FAILED) {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13837 cportinfo->cport_state = SATA_PSTATE_FAILED;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13838 rv = EIO;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13839 } else {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13840 cportinfo->cport_state |= SATA_PSTATE_SHUTDOWN;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13841 }
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13842 mutex_exit(&cportinfo->cport_mutex);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13843
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13844 return (rv);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13845 }
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13846
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13847 /*
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13848 * Process non-port-multiplier device - it could be a drive connected
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13849 * to a port multiplier port or a controller port.
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13850 */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13851 if (qual == SATA_ADDR_PMPORT) {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13852 pmportinfo = SATA_PMPORT_INFO(sata_hba_inst, cport, pmport);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13853 mutex_enter(&pmportinfo->pmport_mutex);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13854 sata_update_pmport_info(sata_hba_inst, sata_device);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13855 if (rval != SATA_SUCCESS ||
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13856 (sata_device->satadev_state & SATA_PSTATE_FAILED) != 0) {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13857 SATA_PMPORT_STATE(sata_hba_inst, cport, pmport) =
5832
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
13858 SATA_PSTATE_FAILED;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
13859 SATADBG2(SATA_DBG_IOCTL_IF, sata_hba_inst,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
13860 "sata_hba_ioctl: connect: failed to deactivate "
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
13861 "SATA port %d:%d", cport, pmport);
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13862 mutex_exit(&pmportinfo->pmport_mutex);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13863 return (EIO);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13864 }
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13865
5832
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
13866 if (pmportinfo->pmport_dev_type != SATA_DTYPE_NONE) {
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
13867 sdinfo = pmportinfo->pmport_sata_drive;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
13868 ASSERT(sdinfo != NULL);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
13869 }
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13870
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13871 /*
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13872 * Set port's dev_state to not ready - this will disable
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13873 * an access to a potentially attached device.
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13874 */
5832
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
13875 pmportinfo->pmport_state &= ~SATA_STATE_READY;
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13876
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13877 /* Remove and release sata_drive info structure. */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13878 if (sdinfo != NULL) {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13879 if ((sdinfo->satadrv_type &
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13880 SATA_VALID_DEV_TYPE) != 0) {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13881 /*
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13882 * If a target node exists, try to offline
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13883 * a device and remove target node.
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13884 */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13885 mutex_exit(&pmportinfo->pmport_mutex);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13886 (void) sata_offline_device(sata_hba_inst,
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13887 sata_device, sdinfo);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13888 mutex_enter(&pmportinfo->pmport_mutex);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13889 }
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13890
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13891 SATA_PMPORTINFO_DRV_INFO(pmportinfo) = NULL;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13892 pmportinfo->pmport_dev_type = SATA_DTYPE_NONE;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13893 (void) kmem_free((void *)sdinfo,
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13894 sizeof (sata_drive_info_t));
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13895 }
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13896 mutex_exit(&pmportinfo->pmport_mutex);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13897
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13898 } else if (qual == SATA_ADDR_CPORT) {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13899 mutex_enter(&cportinfo->cport_mutex);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13900 sata_update_port_info(sata_hba_inst, sata_device);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13901 if (rval != SATA_SUCCESS ||
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13902 (sata_device->satadev_state & SATA_PSTATE_FAILED) != 0) {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13903 /*
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13904 * Device port status is unknown or it is in failed
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13905 * state
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13906 */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13907 SATA_CPORT_STATE(sata_hba_inst, cport) =
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13908 SATA_PSTATE_FAILED;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13909 SATADBG1(SATA_DBG_IOCTL_IF, sata_hba_inst,
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13910 "sata_hba_ioctl: connect: failed to deactivate "
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13911 "SATA port %d", cport);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13912 mutex_exit(&cportinfo->cport_mutex);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13913 return (EIO);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13914 }
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13915
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13916 if (cportinfo->cport_dev_type == SATA_DTYPE_PMULT) {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13917 pmultinfo = SATA_CPORTINFO_PMULT_INFO(cportinfo);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13918 ASSERT(pmultinfo != NULL);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13919 } else if (cportinfo->cport_dev_type != SATA_DTYPE_NONE) {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13920 sdinfo = SATA_CPORTINFO_DRV_INFO(cportinfo);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13921 ASSERT(sdinfo != NULL);
5832
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
13922 }
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
13923 cportinfo->cport_state &= ~SATA_STATE_READY;
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13924
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13925 if (sdinfo != NULL) {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13926 if ((sdinfo->satadrv_type &
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13927 SATA_VALID_DEV_TYPE) != 0) {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13928 /*
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13929 * If a target node exists, try to offline
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13930 * a device and remove target node.
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13931 */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13932 mutex_exit(&cportinfo->cport_mutex);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13933 (void) sata_offline_device(sata_hba_inst,
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13934 sata_device, sdinfo);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13935 mutex_enter(&cportinfo->cport_mutex);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13936 }
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13937
5832
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
13938 SATA_CPORTINFO_DRV_INFO(cportinfo) = NULL;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
13939 cportinfo->cport_dev_type = SATA_DTYPE_NONE;
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13940 (void) kmem_free((void *)sdinfo,
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13941 sizeof (sata_drive_info_t));
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13942 }
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13943 mutex_exit(&cportinfo->cport_mutex);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13944 }
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13945
5832
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
13946 /* Just ask HBA driver to deactivate port */
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13947 sata_device->satadev_addr.qual = qual;
5832
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
13948
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
13949 rval = (*SATA_PORT_DEACTIVATE_FUNC(sata_hba_inst))
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
13950 (SATA_DIP(sata_hba_inst), sata_device);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
13951
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
13952 /*
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
13953 * Generate sysevent - EC_DR / ESC_DR_AP_STATE_CHANGE
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
13954 * without the hint (to force listener to investivate the state).
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
13955 */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
13956 sata_gen_sysevent(sata_hba_inst, &sata_device->satadev_addr,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
13957 SE_NO_HINT);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
13958
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13959 if (qual == SATA_ADDR_PMPORT) {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13960 mutex_enter(&pmportinfo->pmport_mutex);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13961 sata_update_pmport_info(sata_hba_inst, sata_device);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13962
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13963 if (rval != SATA_SUCCESS &&
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13964 sata_device->satadev_state & SATA_PSTATE_FAILED) {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13965 /*
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13966 * Port deactivation failure - do not change port
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13967 * state unless the state returned by HBA indicates a
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13968 * port failure.
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13969 *
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13970 * NOTE: device structures were released, so devices
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13971 * now are invisible! Port reset is needed to
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13972 * re-enumerate devices.
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13973 */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13974 pmportinfo->pmport_state = SATA_PSTATE_FAILED;
5832
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
13975 rv = EIO;
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13976 } else {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13977 /*
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13978 * Deactivation succeded. From now on the sata framework
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13979 * will not care what is happening to the device, until
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13980 * the port is activated again.
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13981 */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13982 pmportinfo->pmport_state |= SATA_PSTATE_SHUTDOWN;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13983 }
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13984 mutex_exit(&pmportinfo->pmport_mutex);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13985 } else if (qual == SATA_ADDR_CPORT) {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13986 mutex_enter(&cportinfo->cport_mutex);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13987 sata_update_port_info(sata_hba_inst, sata_device);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13988
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13989 if (rval != SATA_SUCCESS &&
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13990 sata_device->satadev_state & SATA_PSTATE_FAILED) {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13991 cportinfo->cport_state = SATA_PSTATE_FAILED;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13992 rv = EIO;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13993 } else {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13994 cportinfo->cport_state |= SATA_PSTATE_SHUTDOWN;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13995 }
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13996 mutex_exit(&cportinfo->cport_mutex);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13997 }
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
13998
5832
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
13999 return (rv);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14000 }
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14001
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14002
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14003
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14004 /*
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14005 * Process sata port connect request
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14006 * 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
14007 * 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
14008 * state).
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14009 * DEVCTL_AP_CONNECT would invoke sata_hba_inst->satahba_tran->
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14010 * sata_tran_hotplug_ops->sata_tran_port_activate().
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14011 * If successful and a device is found attached to the port,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14012 * the initialization sequence is executed to attach a device structure to
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14013 * 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
14014 * appropriately.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14015 * 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
14016 *
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14017 * Note, that activating the port may generate link events,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14018 * so it is important that following processing and the
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14019 * event processing does not interfere with each other!
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14020 *
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14021 * This operation may remove port failed state and will
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14022 * try to make port active and in good standing.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14023 *
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14024 * NOTE: Port multiplier is supported.
5832
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14025 */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14026
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14027 static int
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14028 sata_ioctl_connect(sata_hba_inst_t *sata_hba_inst,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14029 sata_device_t *sata_device)
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14030 {
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14031 sata_pmport_info_t *pmportinfo = NULL;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14032 uint8_t cport, pmport, qual;
5832
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14033 int rv = 0;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14034
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14035 cport = sata_device->satadev_addr.cport;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14036 pmport = sata_device->satadev_addr.pmport;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14037 qual = sata_device->satadev_addr.qual;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14038
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14039 ASSERT(qual == SATA_ADDR_DCPORT || qual == SATA_ADDR_DPMPORT);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14040 if (qual == SATA_ADDR_DCPORT)
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14041 qual = SATA_ADDR_CPORT;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14042 else
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14043 qual = SATA_ADDR_PMPORT;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14044
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14045 if (qual == SATA_ADDR_PMPORT)
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14046 pmportinfo = SATA_PMPORT_INFO(sata_hba_inst, cport, pmport);
5832
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14047
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14048 /*
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14049 * DEVCTL_AP_CONNECT would invoke sata_hba_inst->
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14050 * satahba_tran->sata_tran_hotplug_ops->sata_tran_port_activate().
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14051 * Perform sanity check now.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14052 */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14053 if (SATA_PORT_ACTIVATE_FUNC(sata_hba_inst) == NULL) {
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14054 /* No physical port activation supported. */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14055 return (EINVAL);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14056 }
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14057
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14058 /* Just ask HBA driver to activate port */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14059 if ((*SATA_PORT_ACTIVATE_FUNC(sata_hba_inst))
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14060 (SATA_DIP(sata_hba_inst), sata_device) != SATA_SUCCESS) {
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14061 /*
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14062 * Port activation failure.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14063 */
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14064 if (qual == SATA_ADDR_CPORT) {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14065 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst,
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14066 cport)->cport_mutex);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14067 sata_update_port_info(sata_hba_inst, sata_device);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14068 if (sata_device->satadev_state & SATA_PSTATE_FAILED) {
5832
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14069 SATA_CPORT_STATE(sata_hba_inst, cport) =
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14070 SATA_PSTATE_FAILED;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14071 SATADBG1(SATA_DBG_IOCTL_IF, sata_hba_inst,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14072 "sata_hba_ioctl: connect: failed to "
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14073 "activate SATA port %d", cport);
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14074 }
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14075 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14076 cport)->cport_mutex);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14077 } else { /* port multiplier device port */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14078 mutex_enter(&pmportinfo->pmport_mutex);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14079 sata_update_pmport_info(sata_hba_inst, sata_device);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14080 if (sata_device->satadev_state & SATA_PSTATE_FAILED) {
5832
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14081 SATA_PMPORT_STATE(sata_hba_inst, cport,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14082 pmport) = SATA_PSTATE_FAILED;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14083 SATADBG2(SATA_DBG_IOCTL_IF, sata_hba_inst,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14084 "sata_hba_ioctl: connect: failed to "
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14085 "activate SATA port %d:%d", cport, pmport);
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14086 }
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14087 mutex_exit(&pmportinfo->pmport_mutex);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14088 }
5832
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14089 return (EIO);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14090 }
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14091
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14092 /* Virgin port state - will be updated by the port re-probe. */
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14093 if (qual == SATA_ADDR_CPORT) {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14094 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst,
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14095 cport)->cport_mutex);
5832
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14096 SATA_CPORT_STATE(sata_hba_inst, cport) = 0;
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14097 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14098 cport)->cport_mutex);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14099 } else { /* port multiplier device port */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14100 mutex_enter(&pmportinfo->pmport_mutex);
5832
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14101 SATA_PMPORT_STATE(sata_hba_inst, cport, pmport) = 0;
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14102 mutex_exit(&pmportinfo->pmport_mutex);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14103 }
5832
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14104
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14105 /*
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14106 * Probe the port to find its state and attached device.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14107 */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14108 if (sata_reprobe_port(sata_hba_inst, sata_device,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14109 SATA_DEV_IDENTIFY_RETRY) == SATA_FAILURE)
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14110 rv = EIO;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14111
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14112 /*
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14113 * Generate sysevent - EC_DR / ESC_DR_AP_STATE_CHANGE
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14114 * without the hint
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14115 */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14116 sata_gen_sysevent(sata_hba_inst, &sata_device->satadev_addr,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14117 SE_NO_HINT);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14118
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14119 /*
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14120 * If there is a device attached to the port, emit
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14121 * a message.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14122 */
6539
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
14123 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
14124
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
14125 if (qual == SATA_ADDR_CPORT) {
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14126 if (sata_device->satadev_type == SATA_DTYPE_PMULT) {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14127 sata_log(sata_hba_inst, CE_WARN,
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14128 "SATA port multiplier detected "
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14129 "at port %d", cport);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14130 } else {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14131 sata_log(sata_hba_inst, CE_WARN,
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14132 "SATA device detected at port %d", cport);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14133 if (sata_device->satadev_type ==
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14134 SATA_DTYPE_UNKNOWN) {
6539
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
14135 /*
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
14136 * A device was not successfully identified
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
14137 */
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
14138 sata_log(sata_hba_inst, CE_WARN,
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
14139 "Could not identify SATA "
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
14140 "device at port %d", cport);
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14141 }
6539
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
14142 }
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
14143 } else { /* port multiplier device port */
5832
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14144 sata_log(sata_hba_inst, CE_WARN,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14145 "SATA device detected at port %d:%d",
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14146 cport, pmport);
6539
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
14147 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
14148 /*
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
14149 * A device was not successfully identified
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
14150 */
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
14151 sata_log(sata_hba_inst, CE_WARN,
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
14152 "Could not identify SATA "
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
14153 "device at port %d:%d", cport, pmport);
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
14154 }
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
14155 }
5832
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14156 }
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14157
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14158 return (rv);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14159 }
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14160
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14161
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14162 /*
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14163 * Process sata device unconfigure request.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14164 * The unconfigure operation uses generic nexus operation to
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14165 * offline a device. It leaves a target device node attached.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14166 * and obviously sata_drive_info attached as well, because
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14167 * from the hardware point of view nothing has changed.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14168 */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14169 static int
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14170 sata_ioctl_unconfigure(sata_hba_inst_t *sata_hba_inst,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14171 sata_device_t *sata_device)
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14172 {
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14173 int rv = 0;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14174 dev_info_t *tdip;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14175
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14176 /* We are addressing attached device, not a port */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14177 if (sata_device->satadev_addr.qual == SATA_ADDR_CPORT)
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14178 sata_device->satadev_addr.qual = SATA_ADDR_DCPORT;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14179 else if (sata_device->satadev_addr.qual == SATA_ADDR_PMPORT)
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14180 sata_device->satadev_addr.qual = SATA_ADDR_DPMPORT;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14181
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14182 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
14183 &sata_device->satadev_addr)) != NULL) {
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14184
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14185 if (ndi_devi_offline(tdip, NDI_UNCONFIG) != NDI_SUCCESS) {
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14186 SATA_LOG_D((sata_hba_inst, CE_WARN,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14187 "sata_hba_ioctl: unconfigure: "
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14188 "failed to unconfigure device at SATA port %d:%d",
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14189 sata_device->satadev_addr.cport,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14190 sata_device->satadev_addr.pmport));
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14191 rv = EIO;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14192 }
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14193 /*
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14194 * The target node devi_state should be marked with
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14195 * DEVI_DEVICE_OFFLINE by ndi_devi_offline().
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14196 * This would be the indication for cfgadm that
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14197 * the AP node occupant state is 'unconfigured'.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14198 */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14199
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14200 } else {
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14201 /*
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14202 * This would indicate a failure on the part of cfgadm
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14203 * to detect correct state of the node prior to this
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14204 * call - one cannot unconfigure non-existing device.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14205 */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14206 SATA_LOG_D((sata_hba_inst, CE_WARN,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14207 "sata_hba_ioctl: unconfigure: "
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14208 "attempt to unconfigure non-existing device "
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14209 "at SATA port %d:%d",
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14210 sata_device->satadev_addr.cport,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14211 sata_device->satadev_addr.pmport));
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14212 rv = ENXIO;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14213 }
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14214 return (rv);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14215 }
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14216
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14217 /*
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14218 * Process sata device configure request
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14219 * 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
14220 * 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
14221 * non-failed mode. Port reset wil also work in such situation.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14222 * 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
14223 * attempted prior to any other action.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14224 * 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
14225 * node exists, a device was most likely offlined.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14226 * 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
14227 * an attempt is made to online (configure) the device.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14228 *
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14229 * NOTE: Port multiplier is supported.
5832
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14230 */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14231 static int
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14232 sata_ioctl_configure(sata_hba_inst_t *sata_hba_inst,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14233 sata_device_t *sata_device)
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14234 {
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14235 int cport, pmport, qual;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14236 int rval;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14237 boolean_t target = TRUE;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14238 sata_cport_info_t *cportinfo;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14239 sata_pmport_info_t *pmportinfo = NULL;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14240 dev_info_t *tdip;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14241 sata_drive_info_t *sdinfo;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14242
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14243 cport = sata_device->satadev_addr.cport;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14244 pmport = sata_device->satadev_addr.pmport;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14245 qual = sata_device->satadev_addr.qual;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14246
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14247 /* Get current port state */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14248 rval = (*SATA_PROBE_PORT_FUNC(sata_hba_inst))
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14249 (SATA_DIP(sata_hba_inst), sata_device);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14250
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14251 cportinfo = SATA_CPORT_INFO(sata_hba_inst, cport);
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14252 if (qual == SATA_ADDR_DPMPORT) {
5832
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14253 pmportinfo = SATA_PMPORT_INFO(sata_hba_inst, cport, pmport);
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14254 mutex_enter(&pmportinfo->pmport_mutex);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14255 sata_update_pmport_info(sata_hba_inst, sata_device);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14256 if (rval != SATA_SUCCESS ||
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14257 (sata_device->satadev_state & SATA_PSTATE_FAILED) != 0) {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14258 /*
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14259 * Obviously, device on a failed port is not visible
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14260 */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14261 mutex_exit(&pmportinfo->pmport_mutex);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14262 return (ENXIO);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14263 }
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14264 mutex_exit(&pmportinfo->pmport_mutex);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14265 } else {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14266 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst,
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14267 cport)->cport_mutex);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14268 sata_update_port_info(sata_hba_inst, sata_device);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14269 if (rval != SATA_SUCCESS ||
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14270 (sata_device->satadev_state & SATA_PSTATE_FAILED) != 0) {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14271 /*
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14272 * Obviously, device on a failed port is not visible
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14273 */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14274 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14275 cport)->cport_mutex);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14276 return (ENXIO);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14277 }
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14278 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14279 cport)->cport_mutex);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14280 }
5832
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14281
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14282 if ((sata_device->satadev_state & SATA_PSTATE_SHUTDOWN) != 0) {
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14283 /* need to activate port */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14284 target = FALSE;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14285
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14286 /* Sanity check */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14287 if (SATA_PORT_ACTIVATE_FUNC(sata_hba_inst) == NULL)
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14288 return (ENXIO);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14289
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14290 /* Just let HBA driver to activate port */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14291 if ((*SATA_PORT_ACTIVATE_FUNC(sata_hba_inst))
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14292 (SATA_DIP(sata_hba_inst), sata_device) != SATA_SUCCESS) {
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14293 /*
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14294 * Port activation failure - do not change port state
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14295 * unless the state returned by HBA indicates a port
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14296 * failure.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14297 */
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14298 if (qual == SATA_ADDR_DPMPORT) {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14299 mutex_enter(&pmportinfo->pmport_mutex);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14300 sata_update_pmport_info(sata_hba_inst,
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14301 sata_device);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14302 if (sata_device->satadev_state &
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14303 SATA_PSTATE_FAILED)
5832
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14304 pmportinfo->pmport_state =
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14305 SATA_PSTATE_FAILED;
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14306 mutex_exit(&pmportinfo->pmport_mutex);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14307 } else {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14308 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst,
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14309 cport)->cport_mutex);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14310 sata_update_port_info(sata_hba_inst,
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14311 sata_device);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14312 if (sata_device->satadev_state &
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14313 SATA_PSTATE_FAILED)
5832
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14314 cportinfo->cport_state =
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14315 SATA_PSTATE_FAILED;
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14316 mutex_exit(&SATA_CPORT_INFO(
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14317 sata_hba_inst, cport)->cport_mutex);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14318 }
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14319 }
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14320 SATA_LOG_D((sata_hba_inst, CE_WARN,
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14321 "sata_hba_ioctl: configure: "
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14322 "failed to activate SATA port %d:%d",
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14323 cport, pmport));
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14324 return (EIO);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14325 }
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14326 /*
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14327 * Generate sysevent - EC_DR / ESC_DR_AP_STATE_CHANGE
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14328 * without the hint.
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14329 */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14330 sata_gen_sysevent(sata_hba_inst,
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14331 &sata_device->satadev_addr, SE_NO_HINT);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14332
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14333 /* Virgin port state */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14334 if (qual == SATA_ADDR_DPMPORT) {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14335 mutex_enter(&pmportinfo->pmport_mutex);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14336 pmportinfo->pmport_state = 0;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14337 mutex_exit(&pmportinfo->pmport_mutex);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14338 } else {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14339 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst,
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14340 cport)-> cport_mutex);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14341 cportinfo->cport_state = 0;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14342 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14343 cport)->cport_mutex);
5832
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14344 }
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14345 /*
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14346 * Always reprobe port, to get current device info.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14347 */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14348 if (sata_reprobe_port(sata_hba_inst, sata_device,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14349 SATA_DEV_IDENTIFY_RETRY) != SATA_SUCCESS)
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14350 return (EIO);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14351
6539
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
14352 if (sata_device->satadev_type != SATA_DTYPE_NONE && target == FALSE) {
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14353 if (qual == SATA_ADDR_DPMPORT) {
5832
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14354 /*
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14355 * That's the transition from "inactive" port
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14356 * to active one with device attached.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14357 */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14358 sata_log(sata_hba_inst, CE_WARN,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14359 "SATA device detected at port %d:%d",
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14360 cport, pmport);
6539
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
14361 } else {
5832
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14362 /*
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14363 * When PM is attached to the cport and cport is
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14364 * activated, every PM device port needs to be reprobed.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14365 * We need to emit message for all devices detected
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14366 * at port multiplier's device ports.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14367 * Add such code here.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14368 * For now, just inform about device attached to
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14369 * cport.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14370 */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14371 sata_log(sata_hba_inst, CE_WARN,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14372 "SATA device detected at port %d", cport);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14373 }
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14374 }
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14375
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14376 /*
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14377 * This is where real configuration operation starts.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14378 *
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14379 * When PM is attached to the cport and cport is activated,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14380 * devices attached PM device ports may have to be configured
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14381 * explicitly. This may change when port multiplier is supported.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14382 * For now, configure only disks and other valid target devices.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14383 */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14384 if (!(sata_device->satadev_type & SATA_VALID_DEV_TYPE)) {
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14385 if (qual == SATA_ADDR_DCPORT) {
6539
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
14386 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
14387 /*
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
14388 * A device was not successfully identified
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
14389 */
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
14390 sata_log(sata_hba_inst, CE_WARN,
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
14391 "Could not identify SATA "
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
14392 "device at port %d", cport);
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
14393 }
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
14394 } else { /* port multiplier device port */
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
14395 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
14396 /*
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
14397 * A device was not successfully identified
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
14398 */
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
14399 sata_log(sata_hba_inst, CE_WARN,
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
14400 "Could not identify SATA "
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
14401 "device at port %d:%d", cport, pmport);
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
14402 }
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
14403 }
5832
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14404 return (ENXIO); /* No device to configure */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14405 }
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14406
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14407 /*
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14408 * Here we may have a device in reset condition,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14409 * but because we are just configuring it, there is
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14410 * no need to process the reset other than just
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14411 * to clear device reset condition in the HBA driver.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14412 * Setting the flag SATA_EVNT_CLEAR_DEVICE_RESET will
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14413 * cause a first command sent the HBA driver with the request
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14414 * to clear device reset condition.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14415 */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14416 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14417 if (qual == SATA_ADDR_DPMPORT)
5832
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14418 sata_device->satadev_addr.qual = SATA_ADDR_DPMPORT;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14419 else
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14420 sata_device->satadev_addr.qual = SATA_ADDR_DCPORT;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14421 sdinfo = sata_get_device_info(sata_hba_inst, sata_device);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14422 if (sdinfo == NULL) {
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14423 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14424 return (ENXIO);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14425 }
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14426 if (sdinfo->satadrv_event_flags &
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14427 (SATA_EVNT_DEVICE_RESET | SATA_EVNT_INPROC_DEVICE_RESET)) {
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14428 sdinfo->satadrv_event_flags = 0;
6539
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
14429 }
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
14430 sdinfo->satadrv_event_flags |= SATA_EVNT_CLEAR_DEVICE_RESET;
5832
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14431 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14432
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14433 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
14434 &sata_device->satadev_addr)) != NULL) {
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14435 /*
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14436 * Target node exists. Verify, that it belongs
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14437 * to existing, attached device and not to
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14438 * a removed device.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14439 */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14440 if (sata_check_device_removed(tdip) == B_TRUE) {
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14441 if (qual == SATA_ADDR_DPMPORT)
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14442 sata_log(sata_hba_inst, CE_WARN,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14443 "SATA device at port %d cannot be "
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14444 "configured. "
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14445 "Application(s) accessing "
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14446 "previously attached device "
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14447 "have to release it before newly "
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14448 "inserted device can be made accessible.",
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14449 cport);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14450 else
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14451 sata_log(sata_hba_inst, CE_WARN,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14452 "SATA device at port %d:%d cannot be"
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14453 "configured. "
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14454 "Application(s) accessing "
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14455 "previously attached device "
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14456 "have to release it before newly "
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14457 "inserted device can be made accessible.",
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14458 cport, pmport);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14459 return (EIO);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14460 }
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14461 /*
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14462 * Device was not removed and re-inserted.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14463 * Try to online it.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14464 */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14465 if (ndi_devi_online(tdip, 0) != NDI_SUCCESS) {
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14466 SATA_LOG_D((sata_hba_inst, CE_WARN,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14467 "sata_hba_ioctl: configure: "
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14468 "onlining device at SATA port "
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14469 "%d:%d failed", cport, pmport));
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14470 return (EIO);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14471 }
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14472
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14473 if (qual == SATA_ADDR_DPMPORT) {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14474 mutex_enter(&pmportinfo->pmport_mutex);
5832
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14475 pmportinfo->pmport_tgtnode_clean = B_TRUE;
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14476 mutex_exit(&pmportinfo->pmport_mutex);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14477 } else {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14478 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst,
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14479 cport)->cport_mutex);
5832
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14480 cportinfo-> cport_tgtnode_clean = B_TRUE;
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14481 mutex_exit(&SATA_CPORT_INFO(
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14482 sata_hba_inst, cport)->cport_mutex);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14483 }
5832
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14484 } else {
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14485 /*
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14486 * No target node - need to create a new target node.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14487 */
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14488 if (qual == SATA_ADDR_DPMPORT) {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14489 mutex_enter(&pmportinfo->pmport_mutex);
5832
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14490 pmportinfo->pmport_tgtnode_clean = B_TRUE;
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14491 mutex_exit(&pmportinfo->pmport_mutex);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14492 } else {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14493 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, cport)->
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14494 cport_mutex);
5832
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14495 cportinfo-> cport_tgtnode_clean = B_TRUE;
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14496 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14497 cport_mutex);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14498 }
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14499
5832
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14500 tdip = sata_create_target_node(SATA_DIP(sata_hba_inst),
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14501 sata_hba_inst, &sata_device->satadev_addr);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14502 if (tdip == NULL) {
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14503 /* Configure operation failed */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14504 SATA_LOG_D((sata_hba_inst, CE_WARN,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14505 "sata_hba_ioctl: configure: "
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14506 "configuring SATA device at port %d:%d "
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14507 "failed", cport, pmport));
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14508 return (EIO);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14509 }
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14510 }
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14511 return (0);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14512 }
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14513
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14514
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14515 /*
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14516 * Process ioctl deactivate port request.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14517 * Arbitrarily unconfigure attached device, if any.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14518 * Even if the unconfigure fails, proceed with the
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14519 * port deactivation.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14520 *
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14521 * NOTE: Port Multiplier is supported now.
5832
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14522 */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14523
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14524 static int
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14525 sata_ioctl_deactivate(sata_hba_inst_t *sata_hba_inst,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14526 sata_device_t *sata_device)
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14527 {
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14528 int cport, pmport, qual;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14529 int rval, rv = 0;
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14530 int npmport;
5832
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14531 sata_cport_info_t *cportinfo;
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14532 sata_pmport_info_t *pmportinfo;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14533 sata_pmult_info_t *pmultinfo;
5832
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14534 dev_info_t *tdip;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14535 sata_drive_info_t *sdinfo = NULL;
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14536 sata_device_t subsdevice;
5832
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14537
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14538 /* Sanity check */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14539 if (SATA_PORT_DEACTIVATE_FUNC(sata_hba_inst) == NULL)
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14540 return (ENOTSUP);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14541
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14542 cport = sata_device->satadev_addr.cport;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14543 pmport = sata_device->satadev_addr.pmport;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14544 qual = sata_device->satadev_addr.qual;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14545
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14546 /* SCSI_TO_SATA_ADDR_QUAL() translate ap_id into a device qualifier */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14547 ASSERT(qual == SATA_ADDR_DCPORT || qual == SATA_ADDR_DPMPORT);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14548 if (qual == SATA_ADDR_DCPORT)
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14549 qual = SATA_ADDR_CPORT;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14550 else
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14551 qual = SATA_ADDR_PMPORT;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14552
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14553 cportinfo = SATA_CPORT_INFO(sata_hba_inst, cport);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14554 if (qual == SATA_ADDR_PMPORT)
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14555 pmportinfo = SATA_PMPORT_INFO(sata_hba_inst, cport, pmport);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14556
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14557 /*
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14558 * Processing port multiplier
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14559 */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14560 if (qual == SATA_ADDR_CPORT &&
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14561 SATA_CPORT_DEV_TYPE(sata_hba_inst, cport) == SATA_DTYPE_PMULT) {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14562 mutex_enter(&cportinfo->cport_mutex);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14563
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14564 /* Deactivate all sub-deices */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14565 pmultinfo = SATA_CPORTINFO_PMULT_INFO(cportinfo);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14566 if (pmultinfo != NULL) {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14567 for (npmport = 0; npmport < SATA_NUM_PMPORTS(
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14568 sata_hba_inst, cport); npmport++) {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14569
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14570 subsdevice.satadev_addr.cport = cport;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14571 subsdevice.satadev_addr.pmport =
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14572 (uint8_t)npmport;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14573 subsdevice.satadev_addr.qual =
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14574 SATA_ADDR_DPMPORT;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14575
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14576 SATADBG2(SATA_DBG_PMULT, sata_hba_inst,
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14577 "sata_hba_ioctl: deactivate: trying to "
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14578 "deactivate SATA port %d:%d",
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14579 cport, npmport);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14580
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14581 mutex_exit(&cportinfo->cport_mutex);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14582 if (sata_ioctl_deactivate(sata_hba_inst,
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14583 &subsdevice) == SATA_SUCCESS) {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14584 SATADBG2(SATA_DBG_PMULT, sata_hba_inst,
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14585 "[Deactivate] device at port %d:%d "
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14586 "successfully.", cport, npmport);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14587 }
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14588 mutex_enter(&cportinfo->cport_mutex);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14589 }
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14590 }
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14591
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14592 /* Deactivate the port multiplier now. */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14593 cportinfo->cport_state &= ~SATA_STATE_READY;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14594 mutex_exit(&cportinfo->cport_mutex);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14595
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14596 sata_device->satadev_addr.qual = qual;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14597 rval = (*SATA_PORT_DEACTIVATE_FUNC(sata_hba_inst))
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14598 (SATA_DIP(sata_hba_inst), sata_device);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14599
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14600 sata_gen_sysevent(sata_hba_inst, &sata_device->satadev_addr,
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14601 SE_NO_HINT);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14602
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14603 mutex_enter(&cportinfo->cport_mutex);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14604 sata_update_port_info(sata_hba_inst, sata_device);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14605 if (rval != SATA_SUCCESS) {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14606 if (sata_device->satadev_state & SATA_PSTATE_FAILED) {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14607 cportinfo->cport_state = SATA_PSTATE_FAILED;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14608 }
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14609 rv = EIO;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14610 } else {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14611 cportinfo->cport_state |= SATA_PSTATE_SHUTDOWN;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14612 }
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14613 mutex_exit(&cportinfo->cport_mutex);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14614
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14615 return (rv);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14616 }
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14617
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14618 /*
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14619 * Process non-port-multiplier device - it could be a drive connected
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14620 * to a port multiplier port or a controller port.
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14621 */
5832
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14622 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14623 if (qual == SATA_ADDR_CPORT) {
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14624 sata_device->satadev_addr.qual = SATA_ADDR_DCPORT;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14625 if (cportinfo->cport_dev_type != SATA_DTYPE_NONE) {
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14626 /* deal only with valid devices */
5832
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14627 if ((cportinfo->cport_dev_type &
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14628 SATA_VALID_DEV_TYPE) != 0)
6539
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
14629 sdinfo = SATA_CPORTINFO_DRV_INFO(cportinfo);
5832
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14630 }
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14631 cportinfo->cport_state &= ~SATA_STATE_READY;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14632 } else {
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14633 /* Port multiplier device port */
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14634 mutex_enter(&pmportinfo->pmport_mutex);
5832
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14635 sata_device->satadev_addr.qual = SATA_ADDR_DPMPORT;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14636 if (pmportinfo->pmport_dev_type != SATA_DTYPE_NONE &&
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14637 (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
14638 sdinfo = SATA_PMPORTINFO_DRV_INFO(pmportinfo);
5832
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14639 pmportinfo->pmport_state &= ~SATA_STATE_READY;
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14640 mutex_exit(&pmportinfo->pmport_mutex);
5832
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14641 }
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14642
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14643 if (sdinfo != NULL) {
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14644 /*
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14645 * If a target node exists, try to offline a device and
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14646 * to remove a target node.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14647 */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14648 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14649 cport_mutex);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14650 tdip = sata_get_scsi_target_dip(SATA_DIP(sata_hba_inst),
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14651 &sata_device->satadev_addr);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14652 if (tdip != NULL) {
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14653 /* target node exist */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14654 SATADBG1(SATA_DBG_IOCTL_IF, sata_hba_inst,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14655 "sata_hba_ioctl: port deactivate: "
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14656 "target node exists.", NULL);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14657
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14658 if (ndi_devi_offline(tdip, NDI_DEVI_REMOVE) !=
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14659 NDI_SUCCESS) {
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14660 SATA_LOG_D((sata_hba_inst, CE_WARN,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14661 "sata_hba_ioctl: port deactivate: "
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14662 "failed to unconfigure device at port "
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14663 "%d:%d before deactivating the port",
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14664 cport, pmport));
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14665 /*
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14666 * Set DEVICE REMOVED state in the target
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14667 * node. It will prevent an access to
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14668 * the device even when a new device is
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14669 * attached, until the old target node is
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14670 * released, removed and recreated for a new
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14671 * device.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14672 */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14673 sata_set_device_removed(tdip);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14674
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14675 /*
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14676 * Instruct the event daemon to try the
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14677 * target node cleanup later.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14678 */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14679 sata_set_target_node_cleanup(sata_hba_inst,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14680 &sata_device->satadev_addr);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14681 }
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14682 }
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14683 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, cport)->
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14684 cport_mutex);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14685 /*
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14686 * In any case, remove and release sata_drive_info
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14687 * structure.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14688 */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14689 if (qual == SATA_ADDR_CPORT) {
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14690 SATA_CPORTINFO_DRV_INFO(cportinfo) = NULL;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14691 cportinfo->cport_dev_type = SATA_DTYPE_NONE;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14692 } else { /* port multiplier device port */
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14693 mutex_enter(&pmportinfo->pmport_mutex);
5832
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14694 SATA_PMPORTINFO_DRV_INFO(pmportinfo) = NULL;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14695 pmportinfo->pmport_dev_type = SATA_DTYPE_NONE;
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14696 mutex_exit(&pmportinfo->pmport_mutex);
5832
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14697 }
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14698 (void) kmem_free((void *)sdinfo, sizeof (sata_drive_info_t));
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14699 }
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14700
5832
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14701 if (qual == SATA_ADDR_CPORT) {
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14702 cportinfo->cport_state &= ~(SATA_STATE_PROBED |
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14703 SATA_STATE_PROBING);
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14704 } else if (qual == SATA_ADDR_PMPORT) {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14705 mutex_enter(&pmportinfo->pmport_mutex);
5832
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14706 pmportinfo->pmport_state &= ~(SATA_STATE_PROBED |
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14707 SATA_STATE_PROBING);
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14708 mutex_exit(&pmportinfo->pmport_mutex);
5832
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14709 }
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14710 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14711
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14712 /* Just let HBA driver to deactivate port */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14713 sata_device->satadev_addr.qual = qual;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14714 rval = (*SATA_PORT_DEACTIVATE_FUNC(sata_hba_inst))
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14715 (SATA_DIP(sata_hba_inst), sata_device);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14716
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14717 /*
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14718 * Generate sysevent - EC_DR / ESC_DR_AP_STATE_CHANGE
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14719 * without the hint
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14720 */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14721 sata_gen_sysevent(sata_hba_inst, &sata_device->satadev_addr,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14722 SE_NO_HINT);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14723
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14724 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14725 sata_update_port_info(sata_hba_inst, sata_device);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14726 if (qual == SATA_ADDR_CPORT) {
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14727 if (rval != SATA_SUCCESS) {
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14728 /*
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14729 * Port deactivation failure - do not change port state
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14730 * unless the state returned by HBA indicates a port
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14731 * failure.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14732 */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14733 if (sata_device->satadev_state & SATA_PSTATE_FAILED) {
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14734 SATA_CPORT_STATE(sata_hba_inst, cport) =
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14735 SATA_PSTATE_FAILED;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14736 }
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14737 SATA_LOG_D((sata_hba_inst, CE_WARN,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14738 "sata_hba_ioctl: port deactivate: "
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14739 "cannot deactivate SATA port %d", cport));
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14740 rv = EIO;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14741 } else {
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14742 cportinfo->cport_state |= SATA_PSTATE_SHUTDOWN;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14743 }
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14744 } else {
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14745 mutex_enter(&pmportinfo->pmport_mutex);
5832
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14746 if (rval != SATA_SUCCESS) {
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14747 if (sata_device->satadev_state & SATA_PSTATE_FAILED) {
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14748 SATA_PMPORT_STATE(sata_hba_inst, cport,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14749 pmport) = SATA_PSTATE_FAILED;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14750 }
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14751 SATA_LOG_D((sata_hba_inst, CE_WARN,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14752 "sata_hba_ioctl: port deactivate: "
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14753 "cannot deactivate SATA port %d:%d",
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14754 cport, pmport));
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14755 rv = EIO;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14756 } else {
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14757 pmportinfo->pmport_state |= SATA_PSTATE_SHUTDOWN;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14758 }
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14759 mutex_exit(&pmportinfo->pmport_mutex);
5832
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14760 }
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14761
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14762 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14763
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14764 return (rv);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14765 }
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14766
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14767 /*
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14768 * Process ioctl port activate request.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14769 *
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14770 * NOTE: Port multiplier is supported now.
5832
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14771 */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14772 static int
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14773 sata_ioctl_activate(sata_hba_inst_t *sata_hba_inst,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14774 sata_device_t *sata_device)
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14775 {
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14776 int cport, pmport, qual;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14777 sata_cport_info_t *cportinfo;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14778 sata_pmport_info_t *pmportinfo = NULL;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14779 boolean_t dev_existed = TRUE;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14780
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14781 /* Sanity check */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14782 if (SATA_PORT_ACTIVATE_FUNC(sata_hba_inst) == NULL)
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14783 return (ENOTSUP);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14784
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14785 cport = sata_device->satadev_addr.cport;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14786 pmport = sata_device->satadev_addr.pmport;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14787 qual = sata_device->satadev_addr.qual;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14788
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14789 cportinfo = SATA_CPORT_INFO(sata_hba_inst, cport);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14790
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14791 /*
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14792 * The qual translate from ap_id (by SCSI_TO_SATA_ADDR_QUAL())
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14793 * is a device. But what we are dealing with is port/pmport.
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14794 */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14795 ASSERT(qual == SATA_ADDR_DCPORT || qual == SATA_ADDR_DPMPORT);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14796 if (qual == SATA_ADDR_DCPORT)
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14797 sata_device->satadev_addr.qual = qual = SATA_ADDR_CPORT;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14798 else
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14799 sata_device->satadev_addr.qual = qual = SATA_ADDR_PMPORT;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14800
5832
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14801 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14802 if (qual == SATA_ADDR_PMPORT) {
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14803 pmportinfo = SATA_PMPORT_INFO(sata_hba_inst, cport, pmport);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14804 if (pmportinfo->pmport_state & SATA_PSTATE_SHUTDOWN ||
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14805 pmportinfo->pmport_dev_type == SATA_DTYPE_NONE)
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14806 dev_existed = FALSE;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14807 } else { /* cport */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14808 if (cportinfo->cport_state & SATA_PSTATE_SHUTDOWN ||
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14809 cportinfo->cport_dev_type == SATA_DTYPE_NONE)
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14810 dev_existed = FALSE;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14811 }
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14812 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14813
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14814 /* Just let HBA driver to activate port, if necessary */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14815 if ((*SATA_PORT_ACTIVATE_FUNC(sata_hba_inst))
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14816 (SATA_DIP(sata_hba_inst), sata_device) != SATA_SUCCESS) {
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14817 /*
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14818 * Port activation failure - do not change port state unless
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14819 * the state returned by HBA indicates a port failure.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14820 */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14821 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14822 cport)->cport_mutex);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14823 sata_update_port_info(sata_hba_inst, sata_device);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14824 if (sata_device->satadev_state & SATA_PSTATE_FAILED) {
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14825 if (qual == SATA_ADDR_PMPORT) {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14826 mutex_enter(&pmportinfo->pmport_mutex);
5832
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14827 pmportinfo->pmport_state = SATA_PSTATE_FAILED;
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14828 mutex_exit(&pmportinfo->pmport_mutex);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14829 } else
5832
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14830 cportinfo->cport_state = SATA_PSTATE_FAILED;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14831
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14832 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14833 cport)->cport_mutex);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14834 SATA_LOG_D((sata_hba_inst, CE_WARN,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14835 "sata_hba_ioctl: port activate: cannot activate "
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14836 "SATA port %d:%d", cport, pmport));
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14837 return (EIO);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14838 }
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14839 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14840 }
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14841 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14842 if (qual == SATA_ADDR_PMPORT) {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14843 mutex_enter(&pmportinfo->pmport_mutex);
5832
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14844 pmportinfo->pmport_state &= ~SATA_PSTATE_SHUTDOWN;
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14845 mutex_exit(&pmportinfo->pmport_mutex);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14846 } else
5832
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14847 cportinfo->cport_state &= ~SATA_PSTATE_SHUTDOWN;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14848 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14849
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14850 /*
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14851 * 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
14852 * 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
14853 * found attached.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14854 * If port probing failed, the device type would be set to
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14855 * SATA_DTYPE_NONE.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14856 */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14857 (void) sata_reprobe_port(sata_hba_inst, sata_device,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14858 SATA_DEV_IDENTIFY_RETRY);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14859
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14860 /*
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14861 * Generate sysevent - EC_DR / ESC_DR_AP_STATE_CHANGE
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14862 * without the hint.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14863 */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14864 sata_gen_sysevent(sata_hba_inst, &sata_device->satadev_addr,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14865 SE_NO_HINT);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14866
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14867 if (dev_existed == FALSE) {
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14868 if (qual == SATA_ADDR_PMPORT &&
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14869 pmportinfo->pmport_dev_type != SATA_DTYPE_NONE) {
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14870 /*
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14871 * That's the transition from the "inactive" port state
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14872 * or the active port without a device attached to the
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14873 * active port state with a device attached.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14874 */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14875 sata_log(sata_hba_inst, CE_WARN,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14876 "SATA device detected at port %d:%d",
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14877 cport, pmport);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14878 } else if (qual == SATA_ADDR_CPORT &&
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14879 cportinfo->cport_dev_type != SATA_DTYPE_NONE) {
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14880 /*
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14881 * That's the transition from the "inactive" port state
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14882 * or the active port without a device attached to the
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14883 * active port state with a device attached.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14884 */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14885 if (cportinfo->cport_dev_type != SATA_DTYPE_PMULT) {
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14886 sata_log(sata_hba_inst, CE_WARN,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14887 "SATA device detected at port %d", cport);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14888 } else {
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14889 sata_log(sata_hba_inst, CE_WARN,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14890 "SATA port multiplier detected at port %d",
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14891 cport);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14892 }
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14893 }
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14894 }
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14895 return (0);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14896 }
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14897
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14898
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14899
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14900 /*
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14901 * Process ioctl reset port request.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14902 *
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14903 * NOTE: Port-Multiplier is supported.
5832
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14904 */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14905 static int
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14906 sata_ioctl_reset_port(sata_hba_inst_t *sata_hba_inst,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14907 sata_device_t *sata_device)
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14908 {
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14909 int cport, pmport, qual;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14910 int rv = 0;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14911
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14912 cport = sata_device->satadev_addr.cport;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14913 pmport = sata_device->satadev_addr.pmport;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14914 qual = sata_device->satadev_addr.qual;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14915
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14916 /*
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14917 * The qual translate from ap_id (by SCSI_TO_SATA_ADDR_QUAL())
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14918 * is a device. But what we are dealing with is port/pmport.
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14919 */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14920 if (qual == SATA_ADDR_DCPORT)
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14921 sata_device->satadev_addr.qual = qual = SATA_ADDR_CPORT;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14922 else
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14923 sata_device->satadev_addr.qual = qual = SATA_ADDR_PMPORT;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14924 ASSERT(qual == SATA_ADDR_CPORT || qual == SATA_ADDR_PMPORT);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14925
5832
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14926 /* Sanity check */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14927 if (SATA_RESET_DPORT_FUNC(sata_hba_inst) == NULL) {
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14928 SATA_LOG_D((sata_hba_inst, CE_WARN,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14929 "sata_hba_ioctl: sata_hba_tran missing required "
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14930 "function sata_tran_reset_dport"));
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14931 return (ENOTSUP);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14932 }
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14933
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14934 /* Ask HBA to reset port */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14935 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
14936 sata_device) != SATA_SUCCESS) {
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14937 SATA_LOG_D((sata_hba_inst, CE_WARN,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14938 "sata_hba_ioctl: reset port: failed %d:%d",
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14939 cport, pmport));
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14940 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, cport)->
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14941 cport_mutex);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14942 sata_update_port_info(sata_hba_inst, sata_device);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14943 if (qual == SATA_ADDR_CPORT)
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14944 SATA_CPORT_STATE(sata_hba_inst, cport) =
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14945 SATA_PSTATE_FAILED;
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14946 else {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14947 mutex_enter(&SATA_PMPORT_MUTEX(sata_hba_inst, cport,
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14948 pmport));
5832
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14949 SATA_PMPORT_STATE(sata_hba_inst, cport, pmport) =
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14950 SATA_PSTATE_FAILED;
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14951 mutex_exit(&SATA_PMPORT_MUTEX(sata_hba_inst, cport,
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14952 pmport));
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14953 }
5832
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14954 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14955 cport_mutex);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14956 rv = EIO;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14957 }
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14958 /*
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14959 * Beacuse the port was reset, it should be probed and
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14960 * attached device reinitialized. At this point the
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14961 * port state is unknown - it's state is HBA-specific.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14962 * Re-probe port to get its state.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14963 */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14964 if (sata_reprobe_port(sata_hba_inst, sata_device,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14965 SATA_DEV_IDENTIFY_RETRY) != SATA_SUCCESS) {
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14966 rv = EIO;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14967 }
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14968 return (rv);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14969 }
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14970
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14971 /*
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14972 * Process ioctl reset device request.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14973 *
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14974 * NOTE: Port multiplier is supported.
5832
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14975 */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14976 static int
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14977 sata_ioctl_reset_device(sata_hba_inst_t *sata_hba_inst,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14978 sata_device_t *sata_device)
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14979 {
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14980 sata_drive_info_t *sdinfo = NULL;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14981 sata_pmult_info_t *pmultinfo = NULL;
6539
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
14982 int cport, pmport;
5832
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14983 int rv = 0;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14984
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14985 /* Sanity check */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14986 if (SATA_RESET_DPORT_FUNC(sata_hba_inst) == NULL) {
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14987 SATA_LOG_D((sata_hba_inst, CE_WARN,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14988 "sata_hba_ioctl: sata_hba_tran missing required "
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14989 "function sata_tran_reset_dport"));
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14990 return (ENOTSUP);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14991 }
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14992
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14993 cport = sata_device->satadev_addr.cport;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14994 pmport = sata_device->satadev_addr.pmport;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14995
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
14996 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14997 if (sata_device->satadev_addr.qual == SATA_ADDR_DCPORT) {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14998 if (SATA_CPORT_DEV_TYPE(sata_hba_inst, cport) ==
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
14999 SATA_DTYPE_PMULT)
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
15000 pmultinfo = SATA_CPORT_INFO(sata_hba_inst, cport)->
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
15001 cport_devp.cport_sata_pmult;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
15002 else
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
15003 sdinfo = SATA_CPORT_DRV_INFO(sata_hba_inst,
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
15004 sata_device->satadev_addr.cport);
6539
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
15005 } else { /* port multiplier */
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
15006 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
15007 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
15008 sata_device->satadev_addr.cport,
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
15009 sata_device->satadev_addr.pmport);
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
15010 }
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
15011 if (sdinfo == NULL && pmultinfo == NULL) {
5832
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15012 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15013 return (EINVAL);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15014 }
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15015 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15016
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15017 /* Ask HBA to reset device */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15018 if ((*SATA_RESET_DPORT_FUNC(sata_hba_inst))
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15019 (SATA_DIP(sata_hba_inst), sata_device) != SATA_SUCCESS) {
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15020 SATA_LOG_D((sata_hba_inst, CE_WARN,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15021 "sata_hba_ioctl: reset device: failed at port %d:%d",
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15022 cport, pmport));
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15023 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, cport)->
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15024 cport_mutex);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15025 sata_update_port_info(sata_hba_inst, sata_device);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15026 /*
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15027 * Device info structure remains attached. Another device reset
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15028 * or port disconnect/connect and re-probing is
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15029 * needed to change it's state
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15030 */
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
15031 if (sdinfo != NULL) {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
15032 sdinfo->satadrv_state &= ~SATA_STATE_READY;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
15033 sdinfo->satadrv_state |= SATA_DSTATE_FAILED;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
15034 } else if (pmultinfo != NULL) {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
15035 pmultinfo->pmult_state &= ~SATA_STATE_READY;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
15036 pmultinfo->pmult_state |= SATA_DSTATE_FAILED;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
15037 }
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
15038
5832
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15039 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15040 rv = EIO;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15041 }
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15042 /*
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15043 * If attached device was a port multiplier, some extra processing
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
15044 * may be needed to bring it back. SATA specification requies a
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
15045 * mandatory software reset on host port to reliably enumerate a port
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
15046 * multiplier, the HBA driver should handle that after reset
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
15047 * operation.
5832
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15048 */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15049 return (rv);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15050 }
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15051
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15052
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15053 /*
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15054 * Process ioctl reset all request.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15055 */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15056 static int
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15057 sata_ioctl_reset_all(sata_hba_inst_t *sata_hba_inst)
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15058 {
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15059 sata_device_t sata_device;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15060 int rv = 0;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15061 int tcport;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15062 int tpmport = 0;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15063
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15064 sata_device.satadev_rev = SATA_DEVICE_REV;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15065
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15066 /*
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15067 * There is no protection here for configured devices.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15068 */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15069 /* Sanity check */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15070 if (SATA_RESET_DPORT_FUNC(sata_hba_inst) == NULL) {
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15071 SATA_LOG_D((sata_hba_inst, CE_WARN,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15072 "sata_hba_ioctl: sata_hba_tran missing required "
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15073 "function sata_tran_reset_dport"));
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15074 return (ENOTSUP);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15075 }
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15076
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15077 /*
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15078 * Need to lock all ports, not just one.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15079 * 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
15080 * One port is already locked, but for simplicity lock it again.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15081 */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15082 for (tcport = 0; tcport < SATA_NUM_CPORTS(sata_hba_inst); tcport++) {
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15083 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, tcport)->
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15084 cport_mutex);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15085 if (((SATA_CPORT_INFO(sata_hba_inst, tcport)->
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15086 cport_event_flags) & SATA_EVNT_LOCK_PORT_BUSY) != 0) {
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15087 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, tcport)->
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15088 cport_mutex);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15089 rv = EBUSY;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15090 break;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15091 } else {
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
15092 /*
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
15093 * It is enough to lock cport in command-based
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
15094 * switching mode.
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
15095 */
5832
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15096 SATA_CPORT_INFO(sata_hba_inst, tcport)->
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15097 cport_event_flags |= SATA_APCTL_LOCK_PORT_BUSY;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15098 }
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15099 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, tcport)->
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15100 cport_mutex);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15101 }
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15102
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15103 if (rv == 0) {
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15104 /*
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15105 * All cports were successfully locked.
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
15106 * Reset main SATA controller.
6539
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
15107 * 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
15108 * address.
5832
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15109 */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15110 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
15111 sata_device.satadev_addr.cport = 0;
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
15112 sata_device.satadev_addr.pmport = 0;
5832
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15113
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15114 if ((*SATA_RESET_DPORT_FUNC(sata_hba_inst))
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15115 (SATA_DIP(sata_hba_inst), &sata_device) != SATA_SUCCESS) {
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15116 SATA_LOG_D((sata_hba_inst, CE_WARN,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15117 "sata_hba_ioctl: reset controller failed"));
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15118 return (EIO);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15119 }
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15120 /*
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15121 * Because ports were reset, port states are unknown.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15122 * They should be re-probed to get their state and
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15123 * attached devices should be reinitialized.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15124 */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15125 for (tcport = 0; tcport < SATA_NUM_CPORTS(sata_hba_inst);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15126 tcport++) {
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15127 sata_device.satadev_addr.cport = tcport;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15128 sata_device.satadev_addr.pmport = tpmport;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15129 sata_device.satadev_addr.qual = SATA_ADDR_CPORT;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15130
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
15131 /*
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
15132 * The sata_reprobe_port() will mark a
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
15133 * SATA_EVNT_DEVICE_RESET event on the port
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
15134 * multiplier, all its sub-ports will be probed by
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
15135 * sata daemon afterwards.
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
15136 */
5832
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15137 if (sata_reprobe_port(sata_hba_inst, &sata_device,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15138 SATA_DEV_IDENTIFY_RETRY) != SATA_SUCCESS)
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15139 rv = EIO;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15140 }
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15141 }
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15142 /*
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15143 * Unlock all ports
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15144 */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15145 for (tcport = 0; tcport < SATA_NUM_CPORTS(sata_hba_inst); tcport++) {
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15146 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, tcport)->
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15147 cport_mutex);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15148 SATA_CPORT_INFO(sata_hba_inst, tcport)->
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15149 cport_event_flags &= ~SATA_APCTL_LOCK_PORT_BUSY;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15150 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, tcport)->
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15151 cport_mutex);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15152 }
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15153
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15154 /*
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15155 * 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
15156 * controller failed or a re-probing of any port failed.
5832
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15157 */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15158 return (rv);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15159 }
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15160
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15161
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15162 /*
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15163 * Process ioctl port self test request.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15164 *
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15165 * NOTE: Port multiplier code is not completed nor tested.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15166 */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15167 static int
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15168 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
15169 sata_device_t *sata_device)
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15170 {
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15171 int cport, pmport, qual;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15172 int rv = 0;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15173
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15174 /* Sanity check */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15175 if (SATA_SELFTEST_FUNC(sata_hba_inst) == NULL)
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15176 return (ENOTSUP);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15177
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15178 cport = sata_device->satadev_addr.cport;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15179 pmport = sata_device->satadev_addr.pmport;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15180 qual = sata_device->satadev_addr.qual;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15181
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15182 /*
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15183 * There is no protection here for a configured
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15184 * device attached to this port.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15185 */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15186
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15187 if ((*SATA_SELFTEST_FUNC(sata_hba_inst))
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15188 (SATA_DIP(sata_hba_inst), sata_device) != SATA_SUCCESS) {
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15189 SATA_LOG_D((sata_hba_inst, CE_WARN,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15190 "sata_hba_ioctl: port selftest: "
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15191 "failed port %d:%d", cport, pmport));
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15192 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, cport)->
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15193 cport_mutex);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15194 sata_update_port_info(sata_hba_inst, sata_device);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15195 if (qual == SATA_ADDR_CPORT)
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15196 SATA_CPORT_STATE(sata_hba_inst, cport) =
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15197 SATA_PSTATE_FAILED;
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
15198 else { /* port multiplier device port */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
15199 mutex_enter(&SATA_PMPORT_MUTEX(sata_hba_inst,
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
15200 cport, pmport));
5832
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15201 SATA_PMPORT_STATE(sata_hba_inst, cport, pmport) =
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15202 SATA_PSTATE_FAILED;
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
15203 mutex_exit(&SATA_PMPORT_MUTEX(sata_hba_inst,
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
15204 cport, pmport));
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
15205 }
5832
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15206
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15207 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15208 cport_mutex);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15209 return (EIO);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15210 }
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15211 /*
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15212 * 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
15213 * re-probed and attached device state should be restored. At this
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15214 * 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
15215 * Force port re-probing to get it into a known state.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15216 */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15217 if (sata_reprobe_port(sata_hba_inst, sata_device,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15218 SATA_DEV_IDENTIFY_RETRY) != SATA_SUCCESS)
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15219 rv = EIO;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15220 return (rv);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15221 }
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15222
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
15223
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
15224 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
15225 * sata_cfgadm_state:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
15226 * 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
15227 * the cfgadm_state.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
15228 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
15229 * The port argument is a value with encoded cport,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
15230 * 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
15231 * SCSI_TO_SATA_CPORT macro extracts cport number,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
15232 * SCSI_TO_SATA_PMPORT extracts pmport number and
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
15233 * SCSI_TO_SATA_ADDR_QUAL extracts port mulitplier qualifier flag.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
15234 *
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
15235 * Port multiplier is supported.
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
15236 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
15237
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
15238 static void
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
15239 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
15240 devctl_ap_state_t *ap_state)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
15241 {
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
15242 uint8_t cport, pmport, qual;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
15243 uint32_t port_state, pmult_state;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
15244 uint32_t dev_type;
6539
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
15245 sata_drive_info_t *sdinfo;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
15246
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
15247 cport = SCSI_TO_SATA_CPORT(port);
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
15248 pmport = SCSI_TO_SATA_PMPORT(port);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
15249 qual = SCSI_TO_SATA_ADDR_QUAL(port);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
15250
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
15251 /* Check cport state */
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
15252 port_state = SATA_CPORT_STATE(sata_hba_inst, cport);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
15253 if (port_state & SATA_PSTATE_SHUTDOWN ||
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
15254 port_state & SATA_PSTATE_FAILED) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
15255 ap_state->ap_rstate = AP_RSTATE_DISCONNECTED;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
15256 ap_state->ap_ostate = AP_OSTATE_UNCONFIGURED;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
15257 if (port_state & SATA_PSTATE_FAILED)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
15258 ap_state->ap_condition = AP_COND_FAILED;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
15259 else
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
15260 ap_state->ap_condition = AP_COND_UNKNOWN;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
15261
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
15262 return;
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
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
15265 /* cport state is okay. Now check pmport state */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
15266 if (qual == SATA_ADDR_DPMPORT || qual == SATA_ADDR_PMPORT) {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
15267 /* Sanity check */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
15268 if (SATA_CPORT_DEV_TYPE(sata_hba_inst, cport) !=
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
15269 SATA_DTYPE_PMULT || SATA_PMPORT_INFO(sata_hba_inst,
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
15270 cport, pmport) == NULL)
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
15271 return;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
15272 port_state = SATA_PMPORT_STATE(sata_hba_inst, cport, pmport);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
15273 if (port_state & SATA_PSTATE_SHUTDOWN ||
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
15274 port_state & SATA_PSTATE_FAILED) {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
15275 ap_state->ap_rstate = AP_RSTATE_DISCONNECTED;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
15276 ap_state->ap_ostate = AP_OSTATE_UNCONFIGURED;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
15277 if (port_state & SATA_PSTATE_FAILED)
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
15278 ap_state->ap_condition = AP_COND_FAILED;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
15279 else
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
15280 ap_state->ap_condition = AP_COND_UNKNOWN;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
15281
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
15282 return;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
15283 }
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
15284 }
1258
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 /* Port is enabled and ready */
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
15287 if (qual == SATA_ADDR_DCPORT || qual == SATA_ADDR_CPORT)
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
15288 dev_type = SATA_CPORT_DEV_TYPE(sata_hba_inst, cport);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
15289 else
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
15290 dev_type = SATA_PMPORT_DEV_TYPE(sata_hba_inst, cport, pmport);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
15291
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
15292 switch (dev_type) {
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
15293 case SATA_DTYPE_NONE:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
15294 {
3935
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
15295 ap_state->ap_ostate = AP_OSTATE_UNCONFIGURED;
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
15296 ap_state->ap_condition = AP_COND_OK;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
15297 /* No device attached */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
15298 ap_state->ap_rstate = AP_RSTATE_EMPTY;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
15299 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
15300 }
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
15301 case SATA_DTYPE_PMULT:
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
15302 {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
15303 /* Need to check port multiplier state */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
15304 ASSERT(qual == SATA_ADDR_DCPORT);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
15305 pmult_state = SATA_PMULT_INFO(sata_hba_inst, cport)->
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
15306 pmult_state;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
15307 if (pmult_state & (SATA_PSTATE_SHUTDOWN|SATA_PSTATE_FAILED)) {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
15308 ap_state->ap_rstate = AP_RSTATE_DISCONNECTED;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
15309 ap_state->ap_ostate = AP_OSTATE_UNCONFIGURED;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
15310 if (pmult_state & SATA_PSTATE_FAILED)
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
15311 ap_state->ap_condition = AP_COND_FAILED;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
15312 else
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
15313 ap_state->ap_condition = AP_COND_UNKNOWN;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
15314
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
15315 return;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
15316 }
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
15317
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
15318 /* Port multiplier is not configurable */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
15319 ap_state->ap_ostate = AP_OSTATE_CONFIGURED;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
15320 ap_state->ap_rstate = AP_RSTATE_CONNECTED;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
15321 ap_state->ap_condition = AP_COND_OK;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
15322 break;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
15323 }
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
15324
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
15325 case SATA_DTYPE_ATADISK:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
15326 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
15327 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
15328 case SATA_DTYPE_ATAPIDISK:
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
15329 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
15330 dev_info_t *tdip = NULL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
15331 dev_info_t *dip = NULL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
15332 int circ;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
15333
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
15334 dip = SATA_DIP(sata_hba_inst);
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
15335 tdip = sata_get_target_dip(dip, cport, pmport);
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
15336 ap_state->ap_rstate = AP_RSTATE_CONNECTED;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
15337 if (tdip != NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
15338 ndi_devi_enter(dip, &circ);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
15339 mutex_enter(&(DEVI(tdip)->devi_lock));
3935
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
15340 if (DEVI_IS_DEVICE_REMOVED(tdip)) {
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
15341 /*
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
15342 * There could be the case where previously
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
15343 * configured and opened device was removed
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
15344 * and unknown device was plugged.
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
15345 * 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
15346 * its configured or unconfigured state but
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
15347 * indicate unusable condition untill the
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
15348 * old target node is released and removed.
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
15349 */
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
15350 ap_state->ap_condition = AP_COND_UNUSABLE;
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
15351 } else {
6539
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
15352 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
15353 cport));
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
15354 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
15355 cport);
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
15356 if (sdinfo != NULL) {
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
15357 if ((sdinfo->satadrv_state &
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
15358 SATA_DSTATE_FAILED) != 0)
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
15359 ap_state->ap_condition =
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
15360 AP_COND_FAILED;
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
15361 else
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
15362 ap_state->ap_condition =
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
15363 AP_COND_OK;
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
15364 } else {
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
15365 ap_state->ap_condition =
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
15366 AP_COND_UNKNOWN;
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
15367 }
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
15368 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
15369 cport));
3935
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
15370 }
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
15371 if ((DEVI_IS_DEVICE_OFFLINE(tdip)) ||
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
15372 (DEVI_IS_DEVICE_DOWN(tdip))) {
3935
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
15373 ap_state->ap_ostate =
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
15374 AP_OSTATE_UNCONFIGURED;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
15375 } else {
3935
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
15376 ap_state->ap_ostate =
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
15377 AP_OSTATE_CONFIGURED;
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
15378 }
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
15379 mutex_exit(&(DEVI(tdip)->devi_lock));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
15380 ndi_devi_exit(dip, circ);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
15381 } else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
15382 ap_state->ap_ostate = AP_OSTATE_UNCONFIGURED;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
15383 ap_state->ap_condition = AP_COND_UNKNOWN;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
15384 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
15385 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
15386 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
15387 default:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
15388 ap_state->ap_rstate = AP_RSTATE_CONNECTED;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
15389 ap_state->ap_ostate = AP_OSTATE_UNCONFIGURED;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
15390 ap_state->ap_condition = AP_COND_UNKNOWN;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
15391 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
15392 * 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
15393 * because we have already checked all defined device types.
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 SATA_LOG_D((sata_hba_inst, CE_WARN,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
15396 "sata_cfgadm_state: Internal error: "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
15397 "unknown device type"));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
15398 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
15399 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
15400 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
15401
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
15402
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
15403 /*
5832
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15404 * Process ioctl get device path request.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15405 *
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
15406 * NOTE: Port multiplier has no target dip. Devices connected to port
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
15407 * multiplier have target node attached to the HBA node. The only difference
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
15408 * between them and the directly-attached device node is a target address.
5832
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15409 */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15410 static int
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15411 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
15412 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
15413 {
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15414 char path[MAXPATHLEN];
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15415 uint32_t size;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15416 dev_info_t *tdip;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15417
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15418 (void) strcpy(path, "/devices");
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15419 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
15420 &sata_device->satadev_addr)) == NULL) {
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15421 /*
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15422 * 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
15423 * return EINVAL for non-existing target, because cfgadm
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15424 * will then indicate a meaningless ioctl failure.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15425 * If this is a request for a path, indicate invalid
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15426 * argument.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15427 */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15428 if (ioc->get_size == 0)
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15429 return (EINVAL);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15430 } else {
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15431 (void) ddi_pathname(tdip, path + strlen(path));
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15432 }
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15433 size = strlen(path) + 1;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15434
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15435 if (ioc->get_size != 0) {
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15436 if (ddi_copyout((void *)&size, ioc->buf, ioc->bufsiz,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15437 mode) != 0)
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15438 return (EFAULT);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15439 } else {
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15440 if (ioc->bufsiz != size)
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15441 return (EINVAL);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15442
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15443 else if (ddi_copyout((void *)&path, ioc->buf, ioc->bufsiz,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15444 mode) != 0)
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15445 return (EFAULT);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15446 }
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15447 return (0);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15448 }
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15449
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15450 /*
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15451 * Process ioctl get attachment point type request.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15452 *
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
15453 * NOTE: Port multiplier is supported.
5832
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15454 */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15455 static int
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15456 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
15457 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
15458 {
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15459 uint32_t type_len;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15460 const char *ap_type;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15461 int dev_type;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15462
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
15463 if (sata_device->satadev_addr.qual == SATA_ADDR_DCPORT)
5832
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15464 dev_type = SATA_CPORT_DEV_TYPE(sata_hba_inst,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15465 sata_device->satadev_addr.cport);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15466 else /* pmport */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15467 dev_type = SATA_PMPORT_DEV_TYPE(sata_hba_inst,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15468 sata_device->satadev_addr.cport,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15469 sata_device->satadev_addr.pmport);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15470
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15471 switch (dev_type) {
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15472 case SATA_DTYPE_NONE:
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15473 ap_type = "port";
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15474 break;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15475
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15476 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
15477 case SATA_DTYPE_ATAPIDISK:
5832
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15478 ap_type = "disk";
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15479 break;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15480
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15481 case SATA_DTYPE_ATAPICD:
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15482 ap_type = "cd/dvd";
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15483 break;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15484
8010
95c42a8a213e 6703522 ahci driver needs to support SATA tape
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 7954
diff changeset
15485 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
15486 ap_type = "tape";
95c42a8a213e 6703522 ahci driver needs to support SATA tape
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 7954
diff changeset
15487 break;
95c42a8a213e 6703522 ahci driver needs to support SATA tape
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 7954
diff changeset
15488
5832
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15489 case SATA_DTYPE_PMULT:
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
15490 ap_type = "sata-pmult";
5832
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15491 break;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15492
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15493 case SATA_DTYPE_UNKNOWN:
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15494 ap_type = "unknown";
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15495 break;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15496
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15497 default:
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15498 ap_type = "unsupported";
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15499 break;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15500
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15501 } /* end of dev_type switch */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15502
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15503 type_len = strlen(ap_type) + 1;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15504
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15505 if (ioc->get_size) {
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15506 if (ddi_copyout((void *)&type_len, ioc->buf, ioc->bufsiz,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15507 mode) != 0)
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15508 return (EFAULT);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15509 } else {
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15510 if (ioc->bufsiz != type_len)
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15511 return (EINVAL);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15512
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15513 if (ddi_copyout((void *)ap_type, ioc->buf,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15514 ioc->bufsiz, mode) != 0)
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15515 return (EFAULT);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15516 }
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15517 return (0);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15518
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15519 }
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15520
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15521 /*
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15522 * Process ioctl get device model info request.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15523 * This operation should return to cfgadm the device model
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15524 * information string
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15525 *
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
15526 * NOTE: Port multiplier is supported.
5832
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15527 */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15528 static int
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15529 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
15530 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
15531 {
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15532 sata_drive_info_t *sdinfo;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15533 uint32_t info_len;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15534 char ap_info[SATA_ID_MODEL_LEN + 1];
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15535
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15536 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15537 sata_device->satadev_addr.cport)->cport_mutex);
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
15538 if (sata_device->satadev_addr.qual == SATA_ADDR_DCPORT)
6539
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
15539 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
15540 sata_device->satadev_addr.cport);
5832
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15541 else /* port multiplier */
6539
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
15542 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
15543 sata_device->satadev_addr.cport,
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
15544 sata_device->satadev_addr.pmport);
5832
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15545 if (sdinfo == NULL) {
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15546 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15547 sata_device->satadev_addr.cport)->cport_mutex);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15548 return (EINVAL);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15549 }
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15550
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15551 #ifdef _LITTLE_ENDIAN
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15552 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
15553 #else /* _LITTLE_ENDIAN */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15554 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
15555 #endif /* _LITTLE_ENDIAN */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15556
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15557 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15558 sata_device->satadev_addr.cport)->cport_mutex);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15559
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15560 ap_info[SATA_ID_MODEL_LEN] = '\0';
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15561
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15562 info_len = strlen(ap_info) + 1;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15563
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15564 if (ioc->get_size) {
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15565 if (ddi_copyout((void *)&info_len, ioc->buf, ioc->bufsiz,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15566 mode) != 0)
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15567 return (EFAULT);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15568 } else {
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15569 if (ioc->bufsiz < info_len)
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15570 return (EINVAL);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15571 if (ddi_copyout((void *)ap_info, ioc->buf, ioc->bufsiz,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15572 mode) != 0)
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15573 return (EFAULT);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15574 }
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15575 return (0);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15576 }
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15577
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15578
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15579 /*
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15580 * Process ioctl get device firmware revision info request.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15581 * This operation should return to cfgadm the device firmware revision
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15582 * information string
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15583 *
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
15584 * Port multiplier is supported.
5832
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15585 */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15586 static int
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15587 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
15588 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
15589 {
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15590 sata_drive_info_t *sdinfo;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15591 uint32_t info_len;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15592 char ap_info[SATA_ID_FW_LEN + 1];
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15593
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15594 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15595 sata_device->satadev_addr.cport)->cport_mutex);
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
15596 if (sata_device->satadev_addr.qual == SATA_ADDR_DCPORT)
6539
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
15597 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
15598 sata_device->satadev_addr.cport);
5832
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15599 else /* port multiplier */
6539
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
15600 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
15601 sata_device->satadev_addr.cport,
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
15602 sata_device->satadev_addr.pmport);
5832
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15603 if (sdinfo == NULL) {
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15604 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15605 sata_device->satadev_addr.cport)->cport_mutex);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15606 return (EINVAL);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15607 }
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15608
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15609 #ifdef _LITTLE_ENDIAN
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15610 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
15611 #else /* _LITTLE_ENDIAN */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15612 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
15613 #endif /* _LITTLE_ENDIAN */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15614
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15615 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15616 sata_device->satadev_addr.cport)->cport_mutex);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15617
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15618 ap_info[SATA_ID_FW_LEN] = '\0';
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15619
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15620 info_len = strlen(ap_info) + 1;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15621
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15622 if (ioc->get_size) {
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15623 if (ddi_copyout((void *)&info_len, ioc->buf, ioc->bufsiz,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15624 mode) != 0)
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15625 return (EFAULT);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15626 } else {
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15627 if (ioc->bufsiz < info_len)
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15628 return (EINVAL);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15629 if (ddi_copyout((void *)ap_info, ioc->buf, ioc->bufsiz,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15630 mode) != 0)
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15631 return (EFAULT);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15632 }
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15633 return (0);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15634 }
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15635
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15636
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15637 /*
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15638 * Process ioctl get device serial number info request.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15639 * This operation should return to cfgadm the device serial number string.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15640 *
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
15641 * NOTE: Port multiplier is supported.
5832
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15642 */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15643 static int
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15644 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
15645 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
15646 {
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15647 sata_drive_info_t *sdinfo;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15648 uint32_t info_len;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15649 char ap_info[SATA_ID_SERIAL_LEN + 1];
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15650
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15651 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15652 sata_device->satadev_addr.cport)->cport_mutex);
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
15653 if (sata_device->satadev_addr.qual == SATA_ADDR_DCPORT)
6539
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
15654 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
15655 sata_device->satadev_addr.cport);
5832
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15656 else /* port multiplier */
6539
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
15657 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
15658 sata_device->satadev_addr.cport,
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
15659 sata_device->satadev_addr.pmport);
5832
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15660 if (sdinfo == NULL) {
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15661 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15662 sata_device->satadev_addr.cport)->cport_mutex);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15663 return (EINVAL);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15664 }
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15665
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15666 #ifdef _LITTLE_ENDIAN
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15667 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
15668 #else /* _LITTLE_ENDIAN */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15669 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
15670 #endif /* _LITTLE_ENDIAN */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15671
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15672 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15673 sata_device->satadev_addr.cport)->cport_mutex);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15674
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15675 ap_info[SATA_ID_SERIAL_LEN] = '\0';
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15676
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15677 info_len = strlen(ap_info) + 1;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15678
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15679 if (ioc->get_size) {
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15680 if (ddi_copyout((void *)&info_len, ioc->buf, ioc->bufsiz,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15681 mode) != 0)
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15682 return (EFAULT);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15683 } else {
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15684 if (ioc->bufsiz < info_len)
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15685 return (EINVAL);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15686 if (ddi_copyout((void *)ap_info, ioc->buf, ioc->bufsiz,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15687 mode) != 0)
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15688 return (EFAULT);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15689 }
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15690 return (0);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15691 }
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15692
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15693
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
15694 /*
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
15695 * Preset scsi extended sense data (to NO SENSE)
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
15696 * 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
15697 * with a key NO SENSE data.
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
15698 *
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
15699 * Returns void
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
15700 */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
15701 static void
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
15702 sata_fixed_sense_data_preset(struct scsi_extended_sense *sense)
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
15703 {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
15704 sense->es_valid = 1; /* Valid sense */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
15705 sense->es_class = CLASS_EXTENDED_SENSE; /* 0x70 - current err */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
15706 sense->es_key = KEY_NO_SENSE;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
15707 sense->es_info_1 = 0;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
15708 sense->es_info_2 = 0;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
15709 sense->es_info_3 = 0;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
15710 sense->es_info_4 = 0;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
15711 sense->es_add_len = 10; /* Additional length - replace with a def */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
15712 sense->es_cmd_info[0] = 0;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
15713 sense->es_cmd_info[1] = 0;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
15714 sense->es_cmd_info[2] = 0;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
15715 sense->es_cmd_info[3] = 0;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
15716 sense->es_add_code = 0;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
15717 sense->es_qual_code = 0;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
15718 }
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
15719
4876
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
15720 /*
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
15721 * 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
15722 *
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
15723 * 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
15724 * 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
15725 * 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
15726 * 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
15727 * precedence over the devid generated by sd (target) driver.
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
15728 * 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
15729 */
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
15730 static void
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
15731 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
15732 {
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
15733 char *hwid;
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
15734 int modlen;
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
15735 int serlen;
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
15736 int rval;
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
15737 ddi_devid_t devid;
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
15738
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
15739 /*
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
15740 * 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
15741 */
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
15742 hwid = kmem_zalloc(LEGACY_HWID_LEN, KM_SLEEP);
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
15743 bcopy(&sdinfo->satadrv_id.ai_model, hwid,
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
15744 sizeof (sdinfo->satadrv_id.ai_model));
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
15745 swab(hwid, hwid, sizeof (sdinfo->satadrv_id.ai_model));
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
15746 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
15747 if (modlen == 0)
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
15748 goto err;
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
15749 hwid[modlen++] = '=';
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
15750 bcopy(&sdinfo->satadrv_id.ai_drvser, &hwid[modlen],
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
15751 sizeof (sdinfo->satadrv_id.ai_drvser));
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
15752 swab(&hwid[modlen], &hwid[modlen],
5014
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
15753 sizeof (sdinfo->satadrv_id.ai_drvser));
4876
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
15754 serlen = sata_check_modser(&hwid[modlen],
5014
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
15755 sizeof (sdinfo->satadrv_id.ai_drvser));
4876
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
15756 if (serlen == 0)
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
15757 goto err;
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
15758 hwid[modlen + serlen] = 0; /* terminate the hwid string */
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
15759
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
15760 /* initialize/register devid */
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
15761 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
15762 (ushort_t)(modlen + serlen), hwid, &devid)) == DDI_SUCCESS) {
4876
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
15763 rval = ddi_devid_register(dip, devid);
9704
691bf4370bc1 6826775 devid_str_decode_id leaks
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 9699
diff changeset
15764 /*
691bf4370bc1 6826775 devid_str_decode_id leaks
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 9699
diff changeset
15765 * Free up the allocated devid buffer.
691bf4370bc1 6826775 devid_str_decode_id leaks
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 9699
diff changeset
15766 * NOTE: This doesn't mean unregistering devid.
691bf4370bc1 6826775 devid_str_decode_id leaks
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 9699
diff changeset
15767 */
691bf4370bc1 6826775 devid_str_decode_id leaks
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 9699
diff changeset
15768 ddi_devid_free(devid);
691bf4370bc1 6826775 devid_str_decode_id leaks
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 9699
diff changeset
15769 }
4876
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
15770
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
15771 if (rval != DDI_SUCCESS)
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
15772 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
15773 " on port %d", sdinfo->satadrv_addr.cport);
4876
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
15774 err:
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
15775 kmem_free(hwid, LEGACY_HWID_LEN);
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
15776 }
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
15777
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
15778 /*
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
15779 * 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
15780 * trim trailing spaces/NULLs.
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
15781 */
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
15782 static int
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
15783 sata_check_modser(char *buf, int buf_len)
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
15784 {
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
15785 boolean_t ret;
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
15786 char *s;
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
15787 int i;
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
15788 int tb;
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
15789 char ch;
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
15790
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
15791 ret = B_FALSE;
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
15792 s = buf;
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
15793 for (i = 0; i < buf_len; i++) {
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
15794 ch = *s++;
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
15795 if (ch != ' ' && ch != '\0')
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
15796 tb = i + 1;
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
15797 if (ch != ' ' && ch != '\0' && ch != '0')
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
15798 ret = B_TRUE;
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
15799 }
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
15800
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
15801 if (ret == B_FALSE)
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
15802 return (0); /* invalid string */
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
15803
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
15804 return (tb); /* return length */
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
15805 }
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
15806
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
15807 /*
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
15808 * sata_set_drive_features function compares current device features setting
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
15809 * 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
15810 * it restores device features setting to the previously saved state.
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
15811 * It also arbitrarily tries to select the highest supported DMA mode.
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
15812 * Device Identify or Identify Packet Device data has to be current.
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
15813 * 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
15814 * For atapi devices, Removable Media Status Notification is set in addition
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
15815 * to common features.
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
15816 *
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
15817 * 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
15818 *
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
15819 * The input argument sdinfo should point to the drive info structure
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
15820 * to be updated after features are set. Note, that only
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
15821 * device (packet) identify data is updated, not the flags indicating the
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
15822 * supported features.
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
15823 *
7954
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
15824 * 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
15825 * 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
15826 * 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
15827 *
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
15828 * 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
15829 * 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
15830 *
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
15831 * 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
15832 * DMA mode) but the device identify data was fetched successfully.
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
15833 *
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
15834 * Note: This function may fail the port, making it inaccessible.
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
15835 * In such case the explicit port disconnect/connect or physical device
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
15836 * detach/attach is required to re-evaluate port state again.
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
15837 */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
15838
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
15839 static int
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
15840 sata_set_drive_features(sata_hba_inst_t *sata_hba_inst,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
15841 sata_drive_info_t *sdinfo, int restore)
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
15842 {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
15843 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
15844 int rval_set;
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
15845 sata_drive_info_t new_sdinfo;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
15846 char *finfo = "sata_set_drive_features: cannot";
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
15847 char *finfox;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
15848 int cache_op;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
15849
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
15850 bzero(&new_sdinfo, sizeof (sata_drive_info_t));
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
15851 new_sdinfo.satadrv_addr = sdinfo->satadrv_addr;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
15852 new_sdinfo.satadrv_type = sdinfo->satadrv_type;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
15853 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
15854 /*
7954
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
15855 * Cannot get device identification - caller may retry later
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
15856 */
6539
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
15857 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
15858 "%s fetch device identify data\n", finfo);
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
15859 return (SATA_FAILURE);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
15860 }
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
15861 finfox = (restore != 0) ? " restore device features" :
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
15862 " initialize device features\n";
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
15863
8010
95c42a8a213e 6703522 ahci driver needs to support SATA tape
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 7954
diff changeset
15864 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
15865 case SATA_DTYPE_ATADISK:
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
15866 /* Arbitrarily set UDMA mode */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
15867 if (sata_set_dma_mode(sata_hba_inst, &new_sdinfo) !=
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
15868 SATA_SUCCESS) {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
15869 SATA_LOG_D((sata_hba_inst, CE_WARN,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
15870 "%s set UDMA mode\n", finfo));
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
15871 return (SATA_FAILURE);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
15872 }
8010
95c42a8a213e 6703522 ahci driver needs to support SATA tape
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 7954
diff changeset
15873 break;
95c42a8a213e 6703522 ahci driver needs to support SATA tape
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 7954
diff changeset
15874 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
15875 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
15876 case SATA_DTYPE_ATAPIDISK:
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
15877 /* 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
15878 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
15879 restore != 0) {
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
15880 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
15881 (!SATA_RM_NOTIFIC_ENABLED(new_sdinfo.satadrv_id)))||
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
15882 ((!(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
15883 SATA_RM_NOTIFIC_ENABLED(new_sdinfo.satadrv_id))) {
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
15884 /* Current setting does not match saved one */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
15885 if (sata_set_rmsn(sata_hba_inst, sdinfo,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
15886 sdinfo->satadrv_settings &
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
15887 SATA_DEV_RMSN) != SATA_SUCCESS)
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
15888 rval = SATA_FAILURE;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
15889 }
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
15890 }
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
15891 /*
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
15892 * 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
15893 * we want to use DMA transfer mode whenever possible.
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
15894 * Some devices require explicit setting of the DMA mode.
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
15895 */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
15896 if (new_sdinfo.satadrv_id.ai_cap & SATA_DMA_SUPPORT) {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
15897 /* Set highest supported DMA mode */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
15898 if (sata_set_dma_mode(sata_hba_inst, &new_sdinfo) !=
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
15899 SATA_SUCCESS) {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
15900 SATA_LOG_D((sata_hba_inst, CE_WARN,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
15901 "%s set UDMA mode\n", finfo));
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
15902 rval = SATA_FAILURE;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
15903 }
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
15904 }
8010
95c42a8a213e 6703522 ahci driver needs to support SATA tape
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 7954
diff changeset
15905 break;
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
15906 }
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
15907
9058
a7b4d0b3fd3d 6803930 ahci task file errors on new development box
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 8317
diff changeset
15908 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
15909 !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
15910 /*
a7b4d0b3fd3d 6803930 ahci task file errors on new development box
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 8317
diff changeset
15911 * 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
15912 * - do nothing
a7b4d0b3fd3d 6803930 ahci task file errors on new development box
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 8317
diff changeset
15913 */
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
15914 SATADBG1(SATA_DBG_DEV_SETTINGS, sata_hba_inst,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
15915 "settable features not supported\n", NULL);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
15916 goto update_sdinfo;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
15917 }
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
15918
9058
a7b4d0b3fd3d 6803930 ahci task file errors on new development box
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 8317
diff changeset
15919 if ((SATA_READ_AHEAD_ENABLED(new_sdinfo.satadrv_id) &&
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
15920 (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
15921 (SATA_WRITE_CACHE_ENABLED(new_sdinfo.satadrv_id) &&
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
15922 (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
15923 /*
a7b4d0b3fd3d 6803930 ahci task file errors on new development box
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 8317
diff changeset
15924 * 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
15925 * - 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
15926 */
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
15927 SATADBG1(SATA_DBG_DEV_SETTINGS, sata_hba_inst,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
15928 "no device features to set\n", NULL);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
15929 goto update_sdinfo;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
15930 }
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
15931
9058
a7b4d0b3fd3d 6803930 ahci task file errors on new development box
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 8317
diff changeset
15932 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
15933
a7b4d0b3fd3d 6803930 ahci task file errors on new development box
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 8317
diff changeset
15934 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
15935 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
15936 !SATA_READ_AHEAD_ENABLED(new_sdinfo.satadrv_id)) {
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
15937 /* Enable read ahead / read cache */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
15938 cache_op = SATAC_SF_ENABLE_READ_AHEAD;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
15939 SATADBG1(SATA_DBG_DEV_SETTINGS, sata_hba_inst,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
15940 "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
15941 } 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
15942 SATA_READ_AHEAD_ENABLED(new_sdinfo.satadrv_id)) {
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
15943 /* Disable read ahead / read cache */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
15944 cache_op = SATAC_SF_DISABLE_READ_AHEAD;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
15945 SATADBG1(SATA_DBG_DEV_SETTINGS, sata_hba_inst,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
15946 "disabling read cache\n", NULL);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
15947 }
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
15948
9058
a7b4d0b3fd3d 6803930 ahci task file errors on new development box
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 8317
diff changeset
15949 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
15950 /* 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
15951 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
15952 &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
15953 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
15954 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
15955 }
a7b4d0b3fd3d 6803930 ahci task file errors on new development box
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 8317
diff changeset
15956 }
a7b4d0b3fd3d 6803930 ahci task file errors on new development box
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 8317
diff changeset
15957
a7b4d0b3fd3d 6803930 ahci task file errors on new development box
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 8317
diff changeset
15958 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
15959
a7b4d0b3fd3d 6803930 ahci task file errors on new development box
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 8317
diff changeset
15960 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
15961 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
15962 !SATA_WRITE_CACHE_ENABLED(new_sdinfo.satadrv_id)) {
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
15963 /* Enable write cache */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
15964 cache_op = SATAC_SF_ENABLE_WRITE_CACHE;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
15965 SATADBG1(SATA_DBG_DEV_SETTINGS, sata_hba_inst,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
15966 "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
15967 } 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
15968 SATA_WRITE_CACHE_ENABLED(new_sdinfo.satadrv_id)) {
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
15969 /* Disable write cache */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
15970 cache_op = SATAC_SF_DISABLE_WRITE_CACHE;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
15971 SATADBG1(SATA_DBG_DEV_SETTINGS, sata_hba_inst,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
15972 "disabling write cache\n", NULL);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
15973 }
9058
a7b4d0b3fd3d 6803930 ahci task file errors on new development box
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 8317
diff changeset
15974
a7b4d0b3fd3d 6803930 ahci task file errors on new development box
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 8317
diff changeset
15975 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
15976 /* 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
15977 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
15978 &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
15979 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
15980 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
15981 }
7954
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
15982 }
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
15983 if (rval != SATA_SUCCESS)
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
15984 SATA_LOG_D((sata_hba_inst, CE_WARN,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
15985 "%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
15986
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
15987 update_sdinfo:
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
15988 /*
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
15989 * We need to fetch Device Identify data again
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
15990 */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
15991 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
15992 /*
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
15993 * Cannot get device identification - retry later
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
15994 */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
15995 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
15996 "%s re-fetch device identify data\n", finfo));
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
15997 rval = SATA_FAILURE;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
15998 }
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
15999 /* Copy device sata info. */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16000 sdinfo->satadrv_id = new_sdinfo.satadrv_id;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16001
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16002 return (rval);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16003 }
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16004
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16005
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16006 /*
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16007 *
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16008 * 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
16009 * unable to determine.
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16010 *
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16011 * Cannot be called in an interrupt context.
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16012 *
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16013 * Called by sata_build_lsense_page_2f()
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16014 */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16015
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16016 static int
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16017 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
16018 sata_drive_info_t *sdinfo)
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16019 {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16020 sata_pkt_t *spkt;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16021 sata_cmd_t *scmd;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16022 sata_pkt_txlate_t *spx;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16023 int rval;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16024
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16025 spx = kmem_zalloc(sizeof (sata_pkt_txlate_t), KM_SLEEP);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16026 spx->txlt_sata_hba_inst = sata_hba_inst;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16027 spx->txlt_scsi_pkt = NULL; /* No scsi pkt involved */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16028 spkt = sata_pkt_alloc(spx, SLEEP_FUNC);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16029 if (spkt == NULL) {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16030 kmem_free(spx, sizeof (sata_pkt_txlate_t));
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16031 return (-1);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16032 }
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16033 /* address is needed now */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16034 spkt->satapkt_device.satadev_addr = sdinfo->satadrv_addr;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16035
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16036
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16037 /* Fill sata_pkt */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16038 spkt->satapkt_device.satadev_addr = sdinfo->satadrv_addr;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16039 spkt->satapkt_op_mode = SATA_OPMODE_SYNCH | SATA_OPMODE_INTERRUPTS;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16040 /* Synchronous mode, no callback */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16041 spkt->satapkt_comp = NULL;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16042 /* Timeout 30s */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16043 spkt->satapkt_time = sata_default_pkt_time;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16044
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16045 scmd = &spkt->satapkt_cmd;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16046 scmd->satacmd_flags.sata_special_regs = B_TRUE;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16047 scmd->satacmd_flags.sata_data_direction = SATA_DIR_NODATA_XFER;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16048
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16049 /* Set up which registers need to be returned */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16050 scmd->satacmd_flags.sata_copy_out_lba_mid_lsb = B_TRUE;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16051 scmd->satacmd_flags.sata_copy_out_lba_high_lsb = B_TRUE;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16052
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16053 /* Build SMART_RETURN_STATUS cmd in the sata_pkt */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16054 scmd->satacmd_addr_type = 0; /* N/A */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16055 scmd->satacmd_sec_count_lsb = 0; /* N/A */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16056 scmd->satacmd_lba_low_lsb = 0; /* N/A */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16057 scmd->satacmd_lba_mid_lsb = SMART_MAGIC_VAL_1;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16058 scmd->satacmd_lba_high_lsb = SMART_MAGIC_VAL_2;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16059 scmd->satacmd_features_reg = SATA_SMART_RETURN_STATUS;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16060 scmd->satacmd_device_reg = 0; /* Always device 0 */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16061 scmd->satacmd_cmd_reg = SATAC_SMART;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16062 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16063 sdinfo->satadrv_addr.cport)));
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16064
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16065
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16066 /* Send pkt to SATA HBA driver */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16067 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
16068 SATA_TRAN_ACCEPTED ||
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16069 spkt->satapkt_reason != SATA_PKT_COMPLETED) {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16070 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16071 sdinfo->satadrv_addr.cport)));
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16072 /*
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16073 * Whoops, no SMART RETURN STATUS
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16074 */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16075 rval = -1;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16076 } else {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16077 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16078 sdinfo->satadrv_addr.cport)));
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16079 if (scmd->satacmd_error_reg & SATA_ERROR_ABORT) {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16080 rval = -1;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16081 goto fail;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16082 }
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16083 if (scmd->satacmd_status_reg & SATA_STATUS_ERR) {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16084 rval = -1;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16085 goto fail;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16086 }
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16087 if ((scmd->satacmd_lba_mid_lsb == SMART_MAGIC_VAL_1) &&
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16088 (scmd->satacmd_lba_high_lsb == SMART_MAGIC_VAL_2))
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16089 rval = 0;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16090 else if ((scmd->satacmd_lba_mid_lsb == SMART_MAGIC_VAL_3) &&
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16091 (scmd->satacmd_lba_high_lsb == SMART_MAGIC_VAL_4))
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16092 rval = 1;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16093 else {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16094 rval = -1;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16095 goto fail;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16096 }
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16097 }
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16098 fail:
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16099 /* Free allocated resources */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16100 sata_pkt_free(spx);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16101 kmem_free(spx, sizeof (sata_pkt_txlate_t));
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16102
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16103 return (rval);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16104 }
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16105
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16106 /*
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16107 *
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16108 * Returns 0 if succeeded, -1 otherwise
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16109 *
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16110 * Cannot be called in an interrupt context.
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16111 *
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16112 */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16113 static int
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16114 sata_fetch_smart_data(
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16115 sata_hba_inst_t *sata_hba_inst,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16116 sata_drive_info_t *sdinfo,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16117 struct smart_data *smart_data)
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16118 {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16119 sata_pkt_t *spkt;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16120 sata_cmd_t *scmd;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16121 sata_pkt_txlate_t *spx;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16122 int rval;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16123
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16124 #if ! defined(lint)
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16125 ASSERT(sizeof (struct smart_data) == 512);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16126 #endif
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16127
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16128 spx = kmem_zalloc(sizeof (sata_pkt_txlate_t), KM_SLEEP);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16129 spx->txlt_sata_hba_inst = sata_hba_inst;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16130 spx->txlt_scsi_pkt = NULL; /* No scsi pkt involved */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16131 spkt = sata_pkt_alloc(spx, SLEEP_FUNC);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16132 if (spkt == NULL) {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16133 kmem_free(spx, sizeof (sata_pkt_txlate_t));
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16134 return (-1);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16135 }
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16136 /* address is needed now */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16137 spkt->satapkt_device.satadev_addr = sdinfo->satadrv_addr;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16138
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16139
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16140 /* Fill sata_pkt */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16141 spkt->satapkt_device.satadev_addr = sdinfo->satadrv_addr;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16142 spkt->satapkt_op_mode = SATA_OPMODE_SYNCH | SATA_OPMODE_INTERRUPTS;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16143 /* Synchronous mode, no callback */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16144 spkt->satapkt_comp = NULL;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16145 /* Timeout 30s */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16146 spkt->satapkt_time = sata_default_pkt_time;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16147
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16148 scmd = &spkt->satapkt_cmd;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16149 scmd->satacmd_flags.sata_data_direction = SATA_DIR_READ;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16150
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16151 /*
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16152 * Allocate buffer for SMART data
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16153 */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16154 scmd->satacmd_bp = sata_alloc_local_buffer(spx,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16155 sizeof (struct smart_data));
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16156 if (scmd->satacmd_bp == NULL) {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16157 sata_pkt_free(spx);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16158 kmem_free(spx, sizeof (sata_pkt_txlate_t));
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16159 SATA_LOG_D((sata_hba_inst, CE_WARN,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16160 "sata_fetch_smart_data: "
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16161 "cannot allocate buffer"));
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16162 return (-1);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16163 }
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16164
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16165
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16166 /* Build SMART_READ_DATA cmd in the sata_pkt */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16167 scmd->satacmd_addr_type = 0; /* N/A */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16168 scmd->satacmd_sec_count_lsb = 0; /* N/A */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16169 scmd->satacmd_lba_low_lsb = 0; /* N/A */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16170 scmd->satacmd_lba_mid_lsb = SMART_MAGIC_VAL_1;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16171 scmd->satacmd_lba_high_lsb = SMART_MAGIC_VAL_2;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16172 scmd->satacmd_features_reg = SATA_SMART_READ_DATA;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16173 scmd->satacmd_device_reg = 0; /* Always device 0 */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16174 scmd->satacmd_cmd_reg = SATAC_SMART;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16175 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16176 sdinfo->satadrv_addr.cport)));
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16177
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16178 /* Send pkt to SATA HBA driver */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16179 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
16180 SATA_TRAN_ACCEPTED ||
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16181 spkt->satapkt_reason != SATA_PKT_COMPLETED) {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16182 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16183 sdinfo->satadrv_addr.cport)));
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16184 /*
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16185 * Whoops, no SMART DATA available
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16186 */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16187 rval = -1;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16188 goto fail;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16189 } else {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16190 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16191 sdinfo->satadrv_addr.cport)));
7152
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
16192 if (spx->txlt_buf_dma_handle != NULL) {
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
16193 rval = ddi_dma_sync(spx->txlt_buf_dma_handle, 0, 0,
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
16194 DDI_DMA_SYNC_FORKERNEL);
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
16195 ASSERT(rval == DDI_SUCCESS);
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
16196 }
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16197 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
16198 sizeof (struct smart_data));
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16199 }
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16200
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16201 fail:
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16202 /* Free allocated resources */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16203 sata_free_local_buffer(spx);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16204 sata_pkt_free(spx);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16205 kmem_free(spx, sizeof (sata_pkt_txlate_t));
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16206
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16207 return (rval);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16208 }
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16209
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16210 /*
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16211 * 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
16212 * 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
16213 * Note: cannot be called in the interrupt context.
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16214 *
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16215 * return 0 for success, -1 otherwise
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16216 *
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16217 */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16218 static int
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16219 sata_ext_smart_selftest_read_log(
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16220 sata_hba_inst_t *sata_hba_inst,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16221 sata_drive_info_t *sdinfo,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16222 struct smart_ext_selftest_log *ext_selftest_log,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16223 uint16_t block_num)
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16224 {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16225 sata_pkt_txlate_t *spx;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16226 sata_pkt_t *spkt;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16227 sata_cmd_t *scmd;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16228 int rval;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16229
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16230 #if ! defined(lint)
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16231 ASSERT(sizeof (struct smart_ext_selftest_log) == 512);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16232 #endif
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16233
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16234 spx = kmem_zalloc(sizeof (sata_pkt_txlate_t), KM_SLEEP);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16235 spx->txlt_sata_hba_inst = sata_hba_inst;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16236 spx->txlt_scsi_pkt = NULL; /* No scsi pkt involved */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16237 spkt = sata_pkt_alloc(spx, SLEEP_FUNC);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16238 if (spkt == NULL) {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16239 kmem_free(spx, sizeof (sata_pkt_txlate_t));
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16240 return (-1);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16241 }
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16242 /* address is needed now */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16243 spkt->satapkt_device.satadev_addr = sdinfo->satadrv_addr;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16244
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16245
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16246 /* Fill sata_pkt */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16247 spkt->satapkt_device.satadev_addr = sdinfo->satadrv_addr;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16248 spkt->satapkt_op_mode = SATA_OPMODE_SYNCH | SATA_OPMODE_INTERRUPTS;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16249 /* Synchronous mode, no callback */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16250 spkt->satapkt_comp = NULL;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16251 /* Timeout 30s */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16252 spkt->satapkt_time = sata_default_pkt_time;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16253
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16254 scmd = &spkt->satapkt_cmd;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16255 scmd->satacmd_flags.sata_data_direction = SATA_DIR_READ;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16256
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16257 /*
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16258 * Allocate buffer for SMART extended self-test log
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16259 */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16260 scmd->satacmd_bp = sata_alloc_local_buffer(spx,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16261 sizeof (struct smart_ext_selftest_log));
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16262 if (scmd->satacmd_bp == NULL) {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16263 sata_pkt_free(spx);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16264 kmem_free(spx, sizeof (sata_pkt_txlate_t));
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16265 SATA_LOG_D((sata_hba_inst, CE_WARN,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16266 "sata_ext_smart_selftest_log: "
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16267 "cannot allocate buffer"));
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16268 return (-1);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16269 }
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16270
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16271 /* 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
16272 scmd->satacmd_addr_type = ATA_ADDR_LBA48;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16273 scmd->satacmd_sec_count_lsb = 1; /* One sector of selftest log */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16274 scmd->satacmd_sec_count_msb = 0; /* One sector of selftest log */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16275 scmd->satacmd_lba_low_lsb = EXT_SMART_SELFTEST_LOG_PAGE;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16276 scmd->satacmd_lba_low_msb = 0;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16277 scmd->satacmd_lba_mid_lsb = block_num & 0xff;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16278 scmd->satacmd_lba_mid_msb = block_num >> 8;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16279 scmd->satacmd_device_reg = 0; /* Always device 0 */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16280 scmd->satacmd_cmd_reg = SATAC_READ_LOG_EXT;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16281
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16282 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16283 sdinfo->satadrv_addr.cport)));
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16284
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16285 /* Send pkt to SATA HBA driver */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16286 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
16287 SATA_TRAN_ACCEPTED ||
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16288 spkt->satapkt_reason != SATA_PKT_COMPLETED) {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16289 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16290 sdinfo->satadrv_addr.cport)));
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16291
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16292 /*
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16293 * Whoops, no SMART selftest log info available
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16294 */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16295 rval = -1;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16296 goto fail;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16297 } else {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16298 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16299 sdinfo->satadrv_addr.cport)));
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16300
7152
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
16301 if (spx->txlt_buf_dma_handle != NULL) {
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
16302 rval = ddi_dma_sync(spx->txlt_buf_dma_handle, 0, 0,
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
16303 DDI_DMA_SYNC_FORKERNEL);
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
16304 ASSERT(rval == DDI_SUCCESS);
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
16305 }
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16306 bcopy(scmd->satacmd_bp->b_un.b_addr,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16307 (uint8_t *)ext_selftest_log,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16308 sizeof (struct smart_ext_selftest_log));
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16309 rval = 0;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16310 }
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16311
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16312 fail:
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16313 /* Free allocated resources */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16314 sata_free_local_buffer(spx);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16315 sata_pkt_free(spx);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16316 kmem_free(spx, sizeof (sata_pkt_txlate_t));
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16317
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16318 return (rval);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16319 }
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16320
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16321 /*
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16322 * Returns 0 for success, -1 otherwise
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16323 *
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16324 * 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
16325 */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16326 static int
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16327 sata_smart_selftest_log(
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16328 sata_hba_inst_t *sata_hba_inst,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16329 sata_drive_info_t *sdinfo,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16330 struct smart_selftest_log *selftest_log)
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16331 {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16332 sata_pkt_t *spkt;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16333 sata_cmd_t *scmd;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16334 sata_pkt_txlate_t *spx;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16335 int rval;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16336
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16337 #if ! defined(lint)
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16338 ASSERT(sizeof (struct smart_selftest_log) == 512);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16339 #endif
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16340
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16341 spx = kmem_zalloc(sizeof (sata_pkt_txlate_t), KM_SLEEP);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16342 spx->txlt_sata_hba_inst = sata_hba_inst;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16343 spx->txlt_scsi_pkt = NULL; /* No scsi pkt involved */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16344 spkt = sata_pkt_alloc(spx, SLEEP_FUNC);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16345 if (spkt == NULL) {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16346 kmem_free(spx, sizeof (sata_pkt_txlate_t));
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16347 return (-1);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16348 }
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16349 /* address is needed now */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16350 spkt->satapkt_device.satadev_addr = sdinfo->satadrv_addr;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16351
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16352
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16353 /* Fill sata_pkt */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16354 spkt->satapkt_device.satadev_addr = sdinfo->satadrv_addr;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16355 spkt->satapkt_op_mode = SATA_OPMODE_SYNCH | SATA_OPMODE_INTERRUPTS;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16356 /* Synchronous mode, no callback */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16357 spkt->satapkt_comp = NULL;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16358 /* Timeout 30s */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16359 spkt->satapkt_time = sata_default_pkt_time;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16360
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16361 scmd = &spkt->satapkt_cmd;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16362 scmd->satacmd_flags.sata_data_direction = SATA_DIR_READ;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16363
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16364 /*
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16365 * Allocate buffer for SMART SELFTEST LOG
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16366 */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16367 scmd->satacmd_bp = sata_alloc_local_buffer(spx,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16368 sizeof (struct smart_selftest_log));
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16369 if (scmd->satacmd_bp == NULL) {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16370 sata_pkt_free(spx);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16371 kmem_free(spx, sizeof (sata_pkt_txlate_t));
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16372 SATA_LOG_D((sata_hba_inst, CE_WARN,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16373 "sata_smart_selftest_log: "
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16374 "cannot allocate buffer"));
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16375 return (-1);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16376 }
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16377
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16378 /* Build SMART_READ_LOG cmd in the sata_pkt */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16379 scmd->satacmd_addr_type = 0; /* N/A */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16380 scmd->satacmd_sec_count_lsb = 1; /* One sector of SMART log */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16381 scmd->satacmd_lba_low_lsb = SMART_SELFTEST_LOG_PAGE;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16382 scmd->satacmd_lba_mid_lsb = SMART_MAGIC_VAL_1;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16383 scmd->satacmd_lba_high_lsb = SMART_MAGIC_VAL_2;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16384 scmd->satacmd_features_reg = SATA_SMART_READ_LOG;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16385 scmd->satacmd_device_reg = 0; /* Always device 0 */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16386 scmd->satacmd_cmd_reg = SATAC_SMART;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16387 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16388 sdinfo->satadrv_addr.cport)));
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16389
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16390 /* Send pkt to SATA HBA driver */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16391 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
16392 SATA_TRAN_ACCEPTED ||
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16393 spkt->satapkt_reason != SATA_PKT_COMPLETED) {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16394 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16395 sdinfo->satadrv_addr.cport)));
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16396 /*
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16397 * Whoops, no SMART DATA available
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16398 */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16399 rval = -1;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16400 goto fail;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16401 } else {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16402 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16403 sdinfo->satadrv_addr.cport)));
7152
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
16404 if (spx->txlt_buf_dma_handle != NULL) {
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
16405 rval = ddi_dma_sync(spx->txlt_buf_dma_handle, 0, 0,
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
16406 DDI_DMA_SYNC_FORKERNEL);
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
16407 ASSERT(rval == DDI_SUCCESS);
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
16408 }
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16409 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
16410 sizeof (struct smart_selftest_log));
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16411 rval = 0;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16412 }
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16413
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16414 fail:
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16415 /* Free allocated resources */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16416 sata_free_local_buffer(spx);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16417 sata_pkt_free(spx);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16418 kmem_free(spx, sizeof (sata_pkt_txlate_t));
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16419
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16420 return (rval);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16421 }
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16422
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16423
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16424 /*
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16425 * Returns 0 for success, -1 otherwise
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16426 *
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16427 * 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
16428 */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16429 static int
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16430 sata_smart_read_log(
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16431 sata_hba_inst_t *sata_hba_inst,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16432 sata_drive_info_t *sdinfo,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16433 uint8_t *smart_log, /* where the data should be returned */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16434 uint8_t which_log, /* which log should be returned */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16435 uint8_t log_size) /* # of 512 bytes in log */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16436 {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16437 sata_pkt_t *spkt;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16438 sata_cmd_t *scmd;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16439 sata_pkt_txlate_t *spx;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16440 int rval;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16441
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16442 spx = kmem_zalloc(sizeof (sata_pkt_txlate_t), KM_SLEEP);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16443 spx->txlt_sata_hba_inst = sata_hba_inst;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16444 spx->txlt_scsi_pkt = NULL; /* No scsi pkt involved */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16445 spkt = sata_pkt_alloc(spx, SLEEP_FUNC);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16446 if (spkt == NULL) {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16447 kmem_free(spx, sizeof (sata_pkt_txlate_t));
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16448 return (-1);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16449 }
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16450 /* address is needed now */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16451 spkt->satapkt_device.satadev_addr = sdinfo->satadrv_addr;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16452
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16453
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16454 /* Fill sata_pkt */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16455 spkt->satapkt_device.satadev_addr = sdinfo->satadrv_addr;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16456 spkt->satapkt_op_mode = SATA_OPMODE_SYNCH | SATA_OPMODE_INTERRUPTS;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16457 /* Synchronous mode, no callback */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16458 spkt->satapkt_comp = NULL;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16459 /* Timeout 30s */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16460 spkt->satapkt_time = sata_default_pkt_time;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16461
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16462 scmd = &spkt->satapkt_cmd;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16463 scmd->satacmd_flags.sata_data_direction = SATA_DIR_READ;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16464
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16465 /*
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16466 * Allocate buffer for SMART READ LOG
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16467 */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16468 scmd->satacmd_bp = sata_alloc_local_buffer(spx, log_size * 512);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16469 if (scmd->satacmd_bp == NULL) {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16470 sata_pkt_free(spx);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16471 kmem_free(spx, sizeof (sata_pkt_txlate_t));
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16472 SATA_LOG_D((sata_hba_inst, CE_WARN,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16473 "sata_smart_read_log: " "cannot allocate buffer"));
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16474 return (-1);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16475 }
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16476
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16477 /* Build SMART_READ_LOG cmd in the sata_pkt */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16478 scmd->satacmd_addr_type = 0; /* N/A */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16479 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
16480 scmd->satacmd_lba_low_lsb = which_log; /* which log page */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16481 scmd->satacmd_lba_mid_lsb = SMART_MAGIC_VAL_1;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16482 scmd->satacmd_lba_high_lsb = SMART_MAGIC_VAL_2;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16483 scmd->satacmd_features_reg = SATA_SMART_READ_LOG;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16484 scmd->satacmd_device_reg = 0; /* Always device 0 */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16485 scmd->satacmd_cmd_reg = SATAC_SMART;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16486
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16487 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16488 sdinfo->satadrv_addr.cport)));
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16489
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16490 /* Send pkt to SATA HBA driver */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16491 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
16492 SATA_TRAN_ACCEPTED ||
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16493 spkt->satapkt_reason != SATA_PKT_COMPLETED) {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16494 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16495 sdinfo->satadrv_addr.cport)));
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16496
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16497 /*
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16498 * Whoops, no SMART DATA available
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16499 */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16500 rval = -1;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16501 goto fail;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16502 } else {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16503 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16504 sdinfo->satadrv_addr.cport)));
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16505
7152
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
16506 if (spx->txlt_buf_dma_handle != NULL) {
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
16507 rval = ddi_dma_sync(spx->txlt_buf_dma_handle, 0, 0,
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
16508 DDI_DMA_SYNC_FORKERNEL);
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
16509 ASSERT(rval == DDI_SUCCESS);
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
16510 }
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16511 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
16512 rval = 0;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16513 }
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16514
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16515 fail:
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16516 /* Free allocated resources */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16517 sata_free_local_buffer(spx);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16518 sata_pkt_free(spx);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16519 kmem_free(spx, sizeof (sata_pkt_txlate_t));
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16520
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16521 return (rval);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16522 }
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16523
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16524 /*
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16525 * Used by LOG SENSE page 0x10
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16526 *
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16527 * return 0 for success, -1 otherwise
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16528 *
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16529 */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16530 static int
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16531 sata_read_log_ext_directory(
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16532 sata_hba_inst_t *sata_hba_inst,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16533 sata_drive_info_t *sdinfo,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16534 struct read_log_ext_directory *logdir)
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16535 {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16536 sata_pkt_txlate_t *spx;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16537 sata_pkt_t *spkt;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16538 sata_cmd_t *scmd;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16539 int rval;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16540
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16541 #if ! defined(lint)
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16542 ASSERT(sizeof (struct read_log_ext_directory) == 512);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16543 #endif
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16544
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16545 spx = kmem_zalloc(sizeof (sata_pkt_txlate_t), KM_SLEEP);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16546 spx->txlt_sata_hba_inst = sata_hba_inst;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16547 spx->txlt_scsi_pkt = NULL; /* No scsi pkt involved */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16548 spkt = sata_pkt_alloc(spx, SLEEP_FUNC);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16549 if (spkt == NULL) {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16550 kmem_free(spx, sizeof (sata_pkt_txlate_t));
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16551 return (-1);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16552 }
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16553
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16554 /* Fill sata_pkt */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16555 spkt->satapkt_device.satadev_addr = sdinfo->satadrv_addr;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16556 spkt->satapkt_op_mode = SATA_OPMODE_SYNCH | SATA_OPMODE_INTERRUPTS;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16557 /* Synchronous mode, no callback */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16558 spkt->satapkt_comp = NULL;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16559 /* Timeout 30s */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16560 spkt->satapkt_time = sata_default_pkt_time;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16561
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16562 scmd = &spkt->satapkt_cmd;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16563 scmd->satacmd_flags.sata_data_direction = SATA_DIR_READ;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16564
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16565 /*
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16566 * Allocate buffer for SMART READ LOG EXTENDED command
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16567 */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16568 scmd->satacmd_bp = sata_alloc_local_buffer(spx,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16569 sizeof (struct read_log_ext_directory));
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16570 if (scmd->satacmd_bp == NULL) {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16571 sata_pkt_free(spx);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16572 kmem_free(spx, sizeof (sata_pkt_txlate_t));
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16573 SATA_LOG_D((sata_hba_inst, CE_WARN,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16574 "sata_read_log_ext_directory: "
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16575 "cannot allocate buffer"));
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16576 return (-1);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16577 }
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16578
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16579 /* 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
16580 scmd->satacmd_addr_type = ATA_ADDR_LBA48;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16581 scmd->satacmd_sec_count_lsb = 1; /* One sector of directory */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16582 scmd->satacmd_sec_count_msb = 0; /* One sector of directory */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16583 scmd->satacmd_lba_low_lsb = READ_LOG_EXT_LOG_DIRECTORY;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16584 scmd->satacmd_lba_low_msb = 0;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16585 scmd->satacmd_lba_mid_lsb = 0;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16586 scmd->satacmd_lba_mid_msb = 0;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16587 scmd->satacmd_device_reg = 0; /* Always device 0 */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16588 scmd->satacmd_cmd_reg = SATAC_READ_LOG_EXT;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16589
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16590 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16591 sdinfo->satadrv_addr.cport)));
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16592
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16593 /* Send pkt to SATA HBA driver */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16594 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
16595 SATA_TRAN_ACCEPTED ||
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16596 spkt->satapkt_reason != SATA_PKT_COMPLETED) {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16597 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16598 sdinfo->satadrv_addr.cport)));
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16599 /*
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16600 * Whoops, no SMART selftest log info available
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16601 */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16602 rval = -1;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16603 goto fail;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16604 } else {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16605 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16606 sdinfo->satadrv_addr.cport)));
7152
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
16607 if (spx->txlt_buf_dma_handle != NULL) {
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
16608 rval = ddi_dma_sync(spx->txlt_buf_dma_handle, 0, 0,
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
16609 DDI_DMA_SYNC_FORKERNEL);
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
16610 ASSERT(rval == DDI_SUCCESS);
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
16611 }
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16612 bcopy(scmd->satacmd_bp->b_un.b_addr, (uint8_t *)logdir,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16613 sizeof (struct read_log_ext_directory));
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16614 rval = 0;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16615 }
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16616
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16617 fail:
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16618 /* Free allocated resources */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16619 sata_free_local_buffer(spx);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16620 sata_pkt_free(spx);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16621 kmem_free(spx, sizeof (sata_pkt_txlate_t));
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16622
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16623 return (rval);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16624 }
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16625
5225
92c1b014785f 6508467 ahci driver should use the common definitions defined in sata_defs.h
yt160523
parents: 5014
diff changeset
16626 /*
92c1b014785f 6508467 ahci driver should use the common definitions defined in sata_defs.h
yt160523
parents: 5014
diff changeset
16627 * 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
16628 * recovery.
92c1b014785f 6508467 ahci driver should use the common definitions defined in sata_defs.h
yt160523
parents: 5014
diff changeset
16629 *
92c1b014785f 6508467 ahci driver should use the common definitions defined in sata_defs.h
yt160523
parents: 5014
diff changeset
16630 * 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
16631 * returns SATA_FAILURE otherwise.
92c1b014785f 6508467 ahci driver should use the common definitions defined in sata_defs.h
yt160523
parents: 5014
diff changeset
16632 */
92c1b014785f 6508467 ahci driver should use the common definitions defined in sata_defs.h
yt160523
parents: 5014
diff changeset
16633 static int
92c1b014785f 6508467 ahci driver should use the common definitions defined in sata_defs.h
yt160523
parents: 5014
diff changeset
16634 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
16635 {
92c1b014785f 6508467 ahci driver should use the common definitions defined in sata_defs.h
yt160523
parents: 5014
diff changeset
16636 #ifndef __lock_lint
92c1b014785f 6508467 ahci driver should use the common definitions defined in sata_defs.h
yt160523
parents: 5014
diff changeset
16637 _NOTE(ARGUNUSED(sdinfo))
92c1b014785f 6508467 ahci driver should use the common definitions defined in sata_defs.h
yt160523
parents: 5014
diff changeset
16638 #endif
92c1b014785f 6508467 ahci driver should use the common definitions defined in sata_defs.h
yt160523
parents: 5014
diff changeset
16639
92c1b014785f 6508467 ahci driver should use the common definitions defined in sata_defs.h
yt160523
parents: 5014
diff changeset
16640 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
16641 sata_cmd_t *scmd;
92c1b014785f 6508467 ahci driver should use the common definitions defined in sata_defs.h
yt160523
parents: 5014
diff changeset
16642 struct buf *bp;
92c1b014785f 6508467 ahci driver should use the common definitions defined in sata_defs.h
yt160523
parents: 5014
diff changeset
16643
92c1b014785f 6508467 ahci driver should use the common definitions defined in sata_defs.h
yt160523
parents: 5014
diff changeset
16644 /* 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
16645 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
16646
92c1b014785f 6508467 ahci driver should use the common definitions defined in sata_defs.h
yt160523
parents: 5014
diff changeset
16647 /* 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
16648 spkt->satapkt_comp = NULL;
92c1b014785f 6508467 ahci driver should use the common definitions defined in sata_defs.h
yt160523
parents: 5014
diff changeset
16649 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
16650
92c1b014785f 6508467 ahci driver should use the common definitions defined in sata_defs.h
yt160523
parents: 5014
diff changeset
16651 scmd = &spkt->satapkt_cmd;
92c1b014785f 6508467 ahci driver should use the common definitions defined in sata_defs.h
yt160523
parents: 5014
diff changeset
16652 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
16653 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
16654
92c1b014785f 6508467 ahci driver should use the common definitions defined in sata_defs.h
yt160523
parents: 5014
diff changeset
16655 /*
92c1b014785f 6508467 ahci driver should use the common definitions defined in sata_defs.h
yt160523
parents: 5014
diff changeset
16656 * 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
16657 * 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
16658 * attributes.
92c1b014785f 6508467 ahci driver should use the common definitions defined in sata_defs.h
yt160523
parents: 5014
diff changeset
16659 */
92c1b014785f 6508467 ahci driver should use the common definitions defined in sata_defs.h
yt160523
parents: 5014
diff changeset
16660 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
16661 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
16662 if (bp == NULL)
92c1b014785f 6508467 ahci driver should use the common definitions defined in sata_defs.h
yt160523
parents: 5014
diff changeset
16663 return (SATA_FAILURE);
92c1b014785f 6508467 ahci driver should use the common definitions defined in sata_defs.h
yt160523
parents: 5014
diff changeset
16664
92c1b014785f 6508467 ahci driver should use the common definitions defined in sata_defs.h
yt160523
parents: 5014
diff changeset
16665 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
16666 scmd->satacmd_bp = bp;
92c1b014785f 6508467 ahci driver should use the common definitions defined in sata_defs.h
yt160523
parents: 5014
diff changeset
16667
92c1b014785f 6508467 ahci driver should use the common definitions defined in sata_defs.h
yt160523
parents: 5014
diff changeset
16668 /*
92c1b014785f 6508467 ahci driver should use the common definitions defined in sata_defs.h
yt160523
parents: 5014
diff changeset
16669 * 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
16670 * 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
16671 */
92c1b014785f 6508467 ahci driver should use the common definitions defined in sata_defs.h
yt160523
parents: 5014
diff changeset
16672 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
16673
92c1b014785f 6508467 ahci driver should use the common definitions defined in sata_defs.h
yt160523
parents: 5014
diff changeset
16674 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
16675 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
16676
92c1b014785f 6508467 ahci driver should use the common definitions defined in sata_defs.h
yt160523
parents: 5014
diff changeset
16677 return (SATA_SUCCESS);
92c1b014785f 6508467 ahci driver should use the common definitions defined in sata_defs.h
yt160523
parents: 5014
diff changeset
16678 }
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16679
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16680 /*
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16681 * sata_xlate_errors() is used to translate (S)ATA error
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16682 * information to SCSI information returned in the SCSI
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16683 * packet.
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16684 */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16685 static void
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16686 sata_xlate_errors(sata_pkt_txlate_t *spx)
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16687 {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16688 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16689 struct scsi_extended_sense *sense;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16690
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16691 scsipkt->pkt_reason = CMD_INCOMPLETE;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16692 *scsipkt->pkt_scbp = STATUS_CHECK;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16693 sense = sata_arq_sense(spx);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16694
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16695 switch (spx->txlt_sata_pkt->satapkt_reason) {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16696 case SATA_PKT_PORT_ERROR:
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16697 /*
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16698 * We have no device data. Assume no data transfered.
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16699 */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16700 sense->es_key = KEY_HARDWARE_ERROR;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16701 break;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16702
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16703 case SATA_PKT_DEV_ERROR:
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16704 if (spx->txlt_sata_pkt->satapkt_cmd.satacmd_status_reg &
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16705 SATA_STATUS_ERR) {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16706 /*
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16707 * determine dev error reason from error
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16708 * reg content
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16709 */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16710 sata_decode_device_error(spx, sense);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16711 break;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16712 }
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16713 /* No extended sense key - no info available */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16714 break;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16715
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16716 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
16717 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
16718 scsipkt->pkt_statistics |= STAT_TIMEOUT | STAT_DEV_RESET;
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16719 /* No extended sense key */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16720 break;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16721
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16722 case SATA_PKT_ABORTED:
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16723 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
16724 scsipkt->pkt_statistics |= STAT_ABORTED;
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16725 /* No extended sense key */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16726 break;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16727
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16728 case SATA_PKT_RESET:
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16729 /*
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16730 * pkt aborted either by an explicit reset request from
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16731 * a host, or due to error recovery
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16732 */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16733 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
16734 scsipkt->pkt_statistics |= STAT_DEV_RESET;
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16735 break;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16736
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16737 default:
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16738 scsipkt->pkt_reason = CMD_TRAN_ERR;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16739 break;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16740 }
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16741 }
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16742
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16743
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16744
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16745
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16746 /*
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16747 * Log sata message
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16748 * dev pathname msg line preceeds the logged message.
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16749 */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16750
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16751 static void
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16752 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
16753 {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16754 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
16755 dev_info_t *dip = NULL;
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16756 va_list ap;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16757
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16758 mutex_enter(&sata_log_mutex);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16759
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16760 va_start(ap, fmt);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16761 (void) vsprintf(sata_log_buf, fmt, ap);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16762 va_end(ap);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16763
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16764 if (sata_hba_inst != NULL) {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16765 dip = SATA_DIP(sata_hba_inst);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16766 (void) ddi_pathname(dip, pathname);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16767 } else {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16768 pathname[0] = 0;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16769 }
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16770 if (level == CE_CONT) {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16771 if (sata_debug_flags == 0)
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16772 cmn_err(level, "?%s:\n %s\n", pathname, sata_log_buf);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16773 else
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16774 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
16775 } else {
46361481707a 6630713 x4500: Multiple (sdxx), "Error for Command", and "Error Block" errors seen in messages file.
ls24207
parents: 5832
diff changeset
16776 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
16777 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
16778 } 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
16779 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
16780 sata_log_buf);
46361481707a 6630713 x4500: Multiple (sdxx), "Error for Command", and "Error Block" errors seen in messages file.
ls24207
parents: 5832
diff changeset
16781 }
46361481707a 6630713 x4500: Multiple (sdxx), "Error for Command", and "Error Block" errors seen in messages file.
ls24207
parents: 5832
diff changeset
16782 }
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16783
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
16784 /* 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
16785 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
16786
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16787 mutex_exit(&sata_log_mutex);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16788 }
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16789
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16790
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16791 /* ******** Asynchronous HBA events handling & hotplugging support ******** */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
16792
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
16793 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
16794 * Start or terminate the thread, depending on flag arg and current state
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
16795 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
16796 static void
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
16797 sata_event_thread_control(int startstop)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
16798 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
16799 static int sata_event_thread_terminating = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
16800 static int sata_event_thread_starting = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
16801 int i;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
16802
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
16803 mutex_enter(&sata_event_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
16804
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
16805 if (startstop == 0 && (sata_event_thread_starting == 1 ||
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
16806 sata_event_thread_terminating == 1)) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
16807 mutex_exit(&sata_event_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
16808 return;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
16809 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
16810 if (startstop == 1 && sata_event_thread_starting == 1) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
16811 mutex_exit(&sata_event_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
16812 return;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
16813 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
16814 if (startstop == 1 && sata_event_thread_terminating == 1) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
16815 sata_event_thread_starting = 1;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
16816 /* wait til terminate operation completes */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
16817 i = SATA_EVNT_DAEMON_TERM_WAIT/SATA_EVNT_DAEMON_TERM_TIMEOUT;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
16818 while (sata_event_thread_terminating == 1) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
16819 if (i-- <= 0) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
16820 sata_event_thread_starting = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
16821 mutex_exit(&sata_event_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
16822 #ifdef SATA_DEBUG
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
16823 cmn_err(CE_WARN, "sata_event_thread_control: "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
16824 "timeout waiting for thread to terminate");
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
16825 #endif
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
16826 return;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
16827 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
16828 mutex_exit(&sata_event_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
16829 delay(drv_usectohz(SATA_EVNT_DAEMON_TERM_TIMEOUT));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
16830 mutex_enter(&sata_event_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
16831 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
16832 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
16833 if (startstop == 1) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
16834 if (sata_event_thread == NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
16835 sata_event_thread = thread_create(NULL, 0,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
16836 (void (*)())sata_event_daemon,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
16837 &sata_hba_list, 0, &p0, TS_RUN, minclsyspri);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
16838 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
16839 sata_event_thread_starting = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
16840 mutex_exit(&sata_event_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
16841 return;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
16842 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
16843
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
16844 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
16845 * If we got here, thread may need to be terminated
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
16846 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
16847 if (sata_event_thread != NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
16848 int i;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
16849 /* Signal event thread to go away */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
16850 sata_event_thread_terminating = 1;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
16851 sata_event_thread_terminate = 1;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
16852 cv_signal(&sata_event_cv);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
16853 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
16854 * Wait til daemon terminates.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
16855 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
16856 i = SATA_EVNT_DAEMON_TERM_WAIT/SATA_EVNT_DAEMON_TERM_TIMEOUT;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
16857 while (sata_event_thread_terminate == 1) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
16858 mutex_exit(&sata_event_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
16859 if (i-- <= 0) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
16860 /* Daemon did not go away !!! */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
16861 #ifdef SATA_DEBUG
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
16862 cmn_err(CE_WARN, "sata_event_thread_control: "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
16863 "cannot terminate event daemon thread");
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
16864 #endif
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
16865 mutex_enter(&sata_event_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
16866 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
16867 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
16868 delay(drv_usectohz(SATA_EVNT_DAEMON_TERM_TIMEOUT));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
16869 mutex_enter(&sata_event_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
16870 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
16871 sata_event_thread_terminating = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
16872 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
16873 ASSERT(sata_event_thread_terminating == 0);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
16874 ASSERT(sata_event_thread_starting == 0);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
16875 mutex_exit(&sata_event_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
16876 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
16877
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
16878
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
16879 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
16880 * SATA HBA event notification function.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
16881 * 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
16882 * a port and/or device state or a controller itself.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
16883 * Events for different addresses/addr types cannot be combined.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
16884 * A warning message is generated for each event type.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
16885 * Events are not processed by this function, so only the
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
16886 * 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
16887 * waken up. Event daemon thread processes all events.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
16888 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
16889 * 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
16890 * cannot determine a sequence of events when opposite event are reported, eg.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
16891 * LINK_LOST and LINK_ESTABLISHED. Actual port status during event processing
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
16892 * is taking precedence over reported events, i.e. may cause ignoring some
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
16893 * events.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
16894 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
16895 #define SATA_EVENT_MAX_MSG_LENGTH 79
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
16896
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
16897 void
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
16898 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
16899 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
16900 sata_hba_inst_t *sata_hba_inst = NULL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
16901 sata_address_t *saddr;
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
16902 sata_pmult_info_t *pmultinfo;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
16903 sata_drive_info_t *sdinfo;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
16904 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
16905 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
16906 sata_pmport_info_t *pmportinfo;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
16907 int cport, pmport;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
16908 char buf1[SATA_EVENT_MAX_MSG_LENGTH + 1];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
16909 char buf2[SATA_EVENT_MAX_MSG_LENGTH + 1];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
16910 char *lcp;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
16911 static char *err_msg_evnt_1 =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
16912 "sata_hba_event_notify: invalid port event 0x%x ";
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
16913 static char *err_msg_evnt_2 =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
16914 "sata_hba_event_notify: invalid device event 0x%x ";
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
16915 int linkevent;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
16916
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
16917 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
16918 * 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
16919 * 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
16920 * to process events until HBA is detached.
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
16921 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
16922 mutex_enter(&sata_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
16923 for (sata_hba_inst = sata_hba_list; sata_hba_inst != NULL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
16924 sata_hba_inst = sata_hba_inst->satahba_next) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
16925 if (SATA_DIP(sata_hba_inst) == dip)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
16926 if (sata_hba_inst->satahba_attached == 1)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
16927 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
16928 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
16929 mutex_exit(&sata_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
16930 if (sata_hba_inst == NULL)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
16931 /* HBA not attached */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
16932 return;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
16933
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
16934 ASSERT(sata_device != NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
16935
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
16936 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
16937 * Validate address before - do not proceed with invalid address.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
16938 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
16939 saddr = &sata_device->satadev_addr;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
16940 if (saddr->cport >= SATA_NUM_CPORTS(sata_hba_inst))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
16941 return;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
16942
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
16943 cport = saddr->cport;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
16944 pmport = saddr->pmport;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
16945
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
16946 buf1[0] = buf2[0] = '\0';
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
16947
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
16948 /*
7954
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
16949 * 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
16950 * 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
16951 */
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
16952 if ((saddr->qual & (SATA_ADDR_CPORT | SATA_ADDR_PMPORT |
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
16953 SATA_ADDR_DCPORT | SATA_ADDR_DPMPORT | SATA_ADDR_PMULT)) != 0) {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
16954 mutex_enter(&sata_hba_inst->satahba_mutex);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
16955 cportinfo = SATA_CPORT_INFO(sata_hba_inst, cport);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
16956 mutex_exit(&sata_hba_inst->satahba_mutex);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
16957 if (cportinfo == NULL || cportinfo->cport_state == 0)
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
16958 return;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
16959 }
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
16960
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
16961 if ((saddr->qual & (SATA_ADDR_PMULT | SATA_ADDR_PMPORT |
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
16962 SATA_ADDR_DPMPORT)) != 0) {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
16963 if (cportinfo->cport_dev_type != SATA_DTYPE_PMULT) {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
16964 SATA_LOG_D((sata_hba_inst, CE_WARN,
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
16965 "sata_hba_event_notify: Non-pmult device (0x%x)"
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
16966 "is attached to port %d, ignore pmult/pmport "
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
16967 "event 0x%x", cportinfo->cport_dev_type,
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
16968 cport, event));
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
16969 return;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
16970 }
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
16971
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
16972 mutex_enter(&cportinfo->cport_mutex);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
16973 pmultinfo = SATA_PMULT_INFO(sata_hba_inst, cport);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
16974 mutex_exit(&cportinfo->cport_mutex);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
16975
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
16976 /*
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
16977 * The daemon might be processing attachment of port
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
16978 * multiplier, in that case we should ignore events on its
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
16979 * sub-devices.
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
16980 *
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
16981 * NOTE: Only pmult_state is checked in sata_hba_event_notify.
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
16982 * The pmport_state is checked by sata daemon.
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
16983 */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
16984 if (pmultinfo == NULL ||
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
16985 pmultinfo->pmult_state == SATA_STATE_UNKNOWN) {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
16986 SATA_LOG_D((sata_hba_inst, CE_WARN,
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
16987 "sata_hba_event_notify: pmult is not"
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
16988 "available at port %d:%d, ignore event 0x%x",
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
16989 cport, pmport, event));
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
16990 return;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
16991 }
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
16992 }
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
16993
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
16994 if ((saddr->qual &
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
16995 (SATA_ADDR_PMPORT | SATA_ADDR_DPMPORT)) != 0) {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
16996
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
16997 mutex_enter(&cportinfo->cport_mutex);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
16998 if (pmport > SATA_NUM_PMPORTS(sata_hba_inst, cport)) {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
16999 SATA_LOG_D((sata_hba_inst, CE_WARN,
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17000 "sata_hba_event_notify: invalid/"
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17001 "un-implemented port %d:%d (%d ports), "
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17002 "ignore event 0x%x", cport, pmport,
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17003 SATA_NUM_PMPORTS(sata_hba_inst, cport), event));
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17004 mutex_exit(&cportinfo->cport_mutex);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17005 return;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17006 }
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17007 mutex_exit(&cportinfo->cport_mutex);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17008
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17009 mutex_enter(&sata_hba_inst->satahba_mutex);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17010 pmportinfo = SATA_PMPORT_INFO(sata_hba_inst,
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17011 cport, pmport);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17012 mutex_exit(&sata_hba_inst->satahba_mutex);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17013
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17014 /* pmport is implemented/valid? */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17015 if (pmportinfo == NULL) {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17016 SATA_LOG_D((sata_hba_inst, CE_WARN,
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17017 "sata_hba_event_notify: invalid/"
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17018 "un-implemented port %d:%d, ignore "
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17019 "event 0x%x", cport, pmport, event));
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17020 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
17021 }
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
17022 }
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
17023
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
17024 /*
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17025 * Events refer to devices, ports and controllers - each has
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17026 * unique address. Events for different addresses cannot be combined.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17027 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17028 if (saddr->qual & (SATA_ADDR_CPORT | SATA_ADDR_PMPORT)) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17029
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17030 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17031
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17032 /* qualify this event(s) */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17033 if ((event & SATA_EVNT_PORT_EVENTS) == 0) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17034 /* Invalid event for the device port */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17035 (void) sprintf(buf2, err_msg_evnt_1,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17036 event & SATA_EVNT_PORT_EVENTS);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17037 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17038 goto event_info;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17039 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17040 if (saddr->qual == SATA_ADDR_CPORT) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17041 /* Controller's device port event */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17042
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17043 (SATA_CPORT_INFO(sata_hba_inst, cport))->
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17044 cport_event_flags |=
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17045 event & SATA_EVNT_PORT_EVENTS;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17046 pstats =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17047 &(SATA_CPORT_INFO(sata_hba_inst, cport))->
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17048 cport_stats;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17049 } else {
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17050 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17051 mutex_enter(&pmportinfo->pmport_mutex);
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17052 /* Port multiplier's device port event */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17053 (SATA_PMPORT_INFO(sata_hba_inst, cport, pmport))->
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17054 pmport_event_flags |=
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17055 event & SATA_EVNT_PORT_EVENTS;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17056 pstats =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17057 &(SATA_PMPORT_INFO(sata_hba_inst, cport, pmport))->
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17058 pmport_stats;
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17059 mutex_exit(&pmportinfo->pmport_mutex);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17060 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17061 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17062
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17063 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17064 * Add to statistics and log the message. We have to do it
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17065 * here rather than in the event daemon, because there may be
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17066 * multiple events occuring before they are processed.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17067 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17068 linkevent = event &
4582
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
17069 (SATA_EVNT_LINK_LOST | SATA_EVNT_LINK_ESTABLISHED);
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17070 if (linkevent) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17071 if (linkevent == (SATA_EVNT_LINK_LOST |
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17072 SATA_EVNT_LINK_ESTABLISHED)) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17073 /* This is likely event combination */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17074 (void) strlcat(buf1, "link lost/established, ",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17075 SATA_EVENT_MAX_MSG_LENGTH);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17076
1781
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
17077 if (pstats->link_lost < 0xffffffffffffffffULL)
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17078 pstats->link_lost++;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17079 if (pstats->link_established <
1781
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
17080 0xffffffffffffffffULL)
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17081 pstats->link_established++;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17082 linkevent = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17083 } else if (linkevent & SATA_EVNT_LINK_LOST) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17084 (void) strlcat(buf1, "link lost, ",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17085 SATA_EVENT_MAX_MSG_LENGTH);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17086
1781
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
17087 if (pstats->link_lost < 0xffffffffffffffffULL)
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17088 pstats->link_lost++;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17089 } else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17090 (void) strlcat(buf1, "link established, ",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17091 SATA_EVENT_MAX_MSG_LENGTH);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17092 if (pstats->link_established <
1781
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
17093 0xffffffffffffffffULL)
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17094 pstats->link_established++;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17095 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17096 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17097 if (event & SATA_EVNT_DEVICE_ATTACHED) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17098 (void) strlcat(buf1, "device attached, ",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17099 SATA_EVENT_MAX_MSG_LENGTH);
1781
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
17100 if (pstats->device_attached < 0xffffffffffffffffULL)
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17101 pstats->device_attached++;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17102 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17103 if (event & SATA_EVNT_DEVICE_DETACHED) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17104 (void) strlcat(buf1, "device detached, ",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17105 SATA_EVENT_MAX_MSG_LENGTH);
1781
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
17106 if (pstats->device_detached < 0xffffffffffffffffULL)
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17107 pstats->device_detached++;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17108 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17109 if (event & SATA_EVNT_PWR_LEVEL_CHANGED) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17110 SATADBG1(SATA_DBG_EVENTS, sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17111 "port %d power level changed", cport);
1781
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
17112 if (pstats->port_pwr_changed < 0xffffffffffffffffULL)
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17113 pstats->port_pwr_changed++;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17114 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17115
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17116 if ((event & ~SATA_EVNT_PORT_EVENTS) != 0) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17117 /* There should be no other events for this address */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17118 (void) sprintf(buf2, err_msg_evnt_1,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17119 event & ~SATA_EVNT_PORT_EVENTS);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17120 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17121 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17122
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17123 } else if (saddr->qual & (SATA_ADDR_DCPORT | SATA_ADDR_DPMPORT)) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17124 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17125
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17126 /* qualify this event */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17127 if ((event & SATA_EVNT_DEVICE_RESET) == 0) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17128 /* Invalid event for a device */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17129 (void) sprintf(buf2, err_msg_evnt_2,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17130 event & SATA_EVNT_DEVICE_RESET);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17131 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17132 goto event_info;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17133 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17134 /* drive event */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17135 sdinfo = sata_get_device_info(sata_hba_inst, sata_device);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17136 if (sdinfo != NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17137 if (event & SATA_EVNT_DEVICE_RESET) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17138 (void) strlcat(buf1, "device reset, ",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17139 SATA_EVENT_MAX_MSG_LENGTH);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17140 if (sdinfo->satadrv_stats.drive_reset <
1781
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
17141 0xffffffffffffffffULL)
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17142 sdinfo->satadrv_stats.drive_reset++;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17143 sdinfo->satadrv_event_flags |=
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17144 SATA_EVNT_DEVICE_RESET;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17145 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17146 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17147 if ((event & ~SATA_EVNT_DEVICE_RESET) != 0) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17148 /* Invalid event for a device */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17149 (void) sprintf(buf2, err_msg_evnt_2,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17150 event & ~SATA_EVNT_DRIVE_EVENTS);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17151 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17152 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17153 } else if (saddr->qual == SATA_ADDR_PMULT) {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17154 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17155
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17156 /* qualify this event */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17157 if ((event & (SATA_EVNT_DEVICE_RESET |
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17158 SATA_EVNT_PMULT_LINK_CHANGED)) == 0) {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17159 /* Invalid event for a port multiplier */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17160 (void) sprintf(buf2, err_msg_evnt_2,
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17161 event & SATA_EVNT_DEVICE_RESET);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17162 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17163 goto event_info;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17164 }
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17165
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17166 pmultinfo = SATA_PMULT_INFO(sata_hba_inst, cport);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17167
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17168 if (event & SATA_EVNT_DEVICE_RESET) {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17169
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17170 SATADBG1(SATA_DBG_PMULT, sata_hba_inst,
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17171 "[Reset] port-mult on cport %d", cport);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17172 pmultinfo->pmult_event_flags |=
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17173 SATA_EVNT_DEVICE_RESET;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17174 (void) strlcat(buf1, "pmult reset, ",
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17175 SATA_EVENT_MAX_MSG_LENGTH);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17176 }
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17177
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17178 if (event & SATA_EVNT_PMULT_LINK_CHANGED) {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17179
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17180 SATADBG1(SATA_DBG_PMULT, sata_hba_inst,
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17181 "pmult link changed on cport %d", cport);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17182 pmultinfo->pmult_event_flags |=
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17183 SATA_EVNT_PMULT_LINK_CHANGED;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17184 (void) strlcat(buf1, "pmult link changed, ",
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17185 SATA_EVENT_MAX_MSG_LENGTH);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17186 }
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17187 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17188
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17189 } else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17190 if (saddr->qual != SATA_ADDR_NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17191 /* Wrong address qualifier */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17192 SATA_LOG_D((sata_hba_inst, CE_WARN,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17193 "sata_hba_event_notify: invalid address 0x%x",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17194 *(uint32_t *)saddr));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17195 return;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17196 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17197 if ((event & SATA_EVNT_CONTROLLER_EVENTS) == 0 ||
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17198 (event & ~SATA_EVNT_CONTROLLER_EVENTS) != 0) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17199 /* Invalid event for the controller */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17200 SATA_LOG_D((sata_hba_inst, CE_WARN,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17201 "sata_hba_event_notify: invalid event 0x%x for "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17202 "controller",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17203 event & SATA_EVNT_CONTROLLER_EVENTS));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17204 return;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17205 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17206 buf1[0] = '\0';
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17207 /* This may be a frequent and not interesting event */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17208 SATADBG1(SATA_DBG_EVENTS, sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17209 "controller power level changed\n", NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17210
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17211 mutex_enter(&sata_hba_inst->satahba_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17212 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
17213 0xffffffffffffffffULL)
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17214 sata_hba_inst->satahba_stats.ctrl_pwr_change++;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17215
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17216 sata_hba_inst->satahba_event_flags |=
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17217 SATA_EVNT_PWR_LEVEL_CHANGED;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17218 mutex_exit(&sata_hba_inst->satahba_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17219 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17220 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17221 * If we got here, there is something to do with this HBA
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17222 * instance.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17223 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17224 mutex_enter(&sata_hba_inst->satahba_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17225 sata_hba_inst->satahba_event_flags |= SATA_EVNT_MAIN;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17226 mutex_exit(&sata_hba_inst->satahba_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17227 mutex_enter(&sata_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17228 sata_event_pending |= SATA_EVNT_MAIN; /* global event indicator */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17229 mutex_exit(&sata_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17230
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17231 /* Tickle event thread */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17232 mutex_enter(&sata_event_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17233 if (sata_event_thread_active == 0)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17234 cv_signal(&sata_event_cv);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17235 mutex_exit(&sata_event_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17236
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17237 event_info:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17238 if (buf1[0] != '\0') {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17239 lcp = strrchr(buf1, ',');
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17240 if (lcp != NULL)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17241 *lcp = '\0';
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17242 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17243 if (saddr->qual == SATA_ADDR_CPORT ||
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17244 saddr->qual == SATA_ADDR_DCPORT) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17245 if (buf1[0] != '\0') {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17246 sata_log(sata_hba_inst, CE_NOTE, "port %d: %s\n",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17247 cport, buf1);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17248 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17249 if (buf2[0] != '\0') {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17250 sata_log(sata_hba_inst, CE_NOTE, "port %d: %s\n",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17251 cport, buf2);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17252 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17253 } else if (saddr->qual == SATA_ADDR_PMPORT ||
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17254 saddr->qual == SATA_ADDR_DPMPORT) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17255 if (buf1[0] != '\0') {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17256 sata_log(sata_hba_inst, CE_NOTE,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17257 "port %d pmport %d: %s\n", cport, pmport, buf1);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17258 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17259 if (buf2[0] != '\0') {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17260 sata_log(sata_hba_inst, CE_NOTE,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17261 "port %d pmport %d: %s\n", cport, pmport, buf2);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17262 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17263 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17264 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17265
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17266
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17267 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17268 * Event processing thread.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17269 * Arg is a pointer to the sata_hba_list pointer.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17270 * 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
17271 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17272 static void
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17273 sata_event_daemon(void *arg)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17274 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17275 #ifndef __lock_lint
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17276 _NOTE(ARGUNUSED(arg))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17277 #endif
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17278 sata_hba_inst_t *sata_hba_inst;
11066
cebb50cbe4f9 PSARC/2009/396 Tickless Kernel Architecture / lbolt decoupling
Rafael Vanoni <rafael.vanoni@sun.com>
parents: 10696
diff changeset
17279 clock_t delta;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17280
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17281 SATADBG1(SATA_DBG_EVENTS_DAEMON, NULL,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17282 "SATA event daemon started\n", NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17283 loop:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17284 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17285 * Process events here. Walk through all registered HBAs
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17286 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17287 mutex_enter(&sata_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17288 for (sata_hba_inst = sata_hba_list; sata_hba_inst != NULL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17289 sata_hba_inst = sata_hba_inst->satahba_next) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17290 ASSERT(sata_hba_inst != NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17291 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
17292 if (sata_hba_inst->satahba_attached == 0 ||
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17293 (sata_hba_inst->satahba_event_flags &
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17294 SATA_EVNT_SKIP) != 0) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17295 mutex_exit(&sata_hba_inst->satahba_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17296 continue;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17297 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17298 if (sata_hba_inst->satahba_event_flags & SATA_EVNT_MAIN) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17299 sata_hba_inst->satahba_event_flags |= SATA_EVNT_SKIP;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17300 mutex_exit(&sata_hba_inst->satahba_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17301 mutex_exit(&sata_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17302 /* Got the controller with pending event */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17303 sata_process_controller_events(sata_hba_inst);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17304 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17305 * Since global mutex was released, there is a
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17306 * possibility that HBA list has changed, so start
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17307 * over from the top. Just processed controller
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17308 * will be passed-over because of the SKIP flag.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17309 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17310 goto loop;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17311 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17312 mutex_exit(&sata_hba_inst->satahba_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17313 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17314 /* Clear SKIP flag in all controllers */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17315 for (sata_hba_inst = sata_hba_list; sata_hba_inst != NULL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17316 sata_hba_inst = sata_hba_inst->satahba_next) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17317 mutex_enter(&sata_hba_inst->satahba_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17318 sata_hba_inst->satahba_event_flags &= ~SATA_EVNT_SKIP;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17319 mutex_exit(&sata_hba_inst->satahba_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17320 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17321 mutex_exit(&sata_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17322
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17323 SATADBG1(SATA_DBG_EVENTS_DAEMON, NULL,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17324 "SATA EVENT DAEMON suspending itself", NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17325
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17326 #ifdef SATA_DEBUG
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17327 if ((sata_func_enable & SATA_ENABLE_PROCESS_EVENTS) == 0) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17328 sata_log(sata_hba_inst, CE_WARN,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17329 "SATA EVENTS PROCESSING DISABLED\n");
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17330 thread_exit(); /* Daemon will not run again */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17331 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17332 #endif
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17333 mutex_enter(&sata_event_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17334 sata_event_thread_active = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17335 mutex_exit(&sata_event_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17336 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17337 * 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
17338 * wait timeout. Exit if there is a termination request (driver
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17339 * unload).
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17340 */
11066
cebb50cbe4f9 PSARC/2009/396 Tickless Kernel Architecture / lbolt decoupling
Rafael Vanoni <rafael.vanoni@sun.com>
parents: 10696
diff changeset
17341 delta = drv_usectohz(SATA_EVNT_DAEMON_SLEEP_TIME);
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17342 do {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17343 mutex_enter(&sata_event_mutex);
11066
cebb50cbe4f9 PSARC/2009/396 Tickless Kernel Architecture / lbolt decoupling
Rafael Vanoni <rafael.vanoni@sun.com>
parents: 10696
diff changeset
17344 (void) cv_reltimedwait(&sata_event_cv, &sata_event_mutex,
cebb50cbe4f9 PSARC/2009/396 Tickless Kernel Architecture / lbolt decoupling
Rafael Vanoni <rafael.vanoni@sun.com>
parents: 10696
diff changeset
17345 delta, TR_CLOCK_TICK);
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17346
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17347 if (sata_event_thread_active != 0) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17348 mutex_exit(&sata_event_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17349 continue;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17350 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17351
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17352 /* Check if it is time to go away */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17353 if (sata_event_thread_terminate == 1) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17354 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17355 * It is up to the thread setting above flag to make
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17356 * sure that this thread is not killed prematurely.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17357 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17358 sata_event_thread_terminate = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17359 sata_event_thread = NULL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17360 mutex_exit(&sata_event_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17361 SATADBG1(SATA_DBG_EVENTS_DAEMON, NULL,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17362 "SATA_EVENT_DAEMON_TERMINATING", NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17363 thread_exit(); { _NOTE(NOT_REACHED) }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17364 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17365 mutex_exit(&sata_event_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17366 } while (!(sata_event_pending & SATA_EVNT_MAIN));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17367
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17368 mutex_enter(&sata_event_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17369 sata_event_thread_active = 1;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17370 mutex_exit(&sata_event_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17371
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17372 mutex_enter(&sata_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17373 sata_event_pending &= ~SATA_EVNT_MAIN;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17374 mutex_exit(&sata_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17375
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17376 SATADBG1(SATA_DBG_EVENTS_DAEMON, NULL,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17377 "SATA EVENT DAEMON READY TO PROCESS EVENT", NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17378
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17379 goto loop;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17380 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17381
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17382 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17383 * Specific HBA instance event processing.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17384 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17385 * NOTE: At the moment, device event processing is limited to hard disks
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17386 * only.
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17387 * Port multiplier is supported now.
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17388 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17389 static void
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17390 sata_process_controller_events(sata_hba_inst_t *sata_hba_inst)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17391 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17392 int ncport;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17393 uint32_t event_flags;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17394 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
17395 sata_cport_info_t *cportinfo;
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17396 sata_pmult_info_t *pmultinfo;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17397
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17398 SATADBG1(SATA_DBG_EVENTS_CNTRL, sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17399 "Processing controller %d event(s)",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17400 ddi_get_instance(SATA_DIP(sata_hba_inst)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17401
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17402 mutex_enter(&sata_hba_inst->satahba_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17403 sata_hba_inst->satahba_event_flags &= ~SATA_EVNT_MAIN;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17404 event_flags = sata_hba_inst->satahba_event_flags;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17405 mutex_exit(&sata_hba_inst->satahba_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17406 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17407 * Process controller power change first
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17408 * HERE
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17409 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17410 if (event_flags & SATA_EVNT_PWR_LEVEL_CHANGED)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17411 sata_process_cntrl_pwr_level_change(sata_hba_inst);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17412
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17413 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17414 * Search through ports/devices to identify affected port/device.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17415 * We may have to process events for more than one port/device.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17416 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17417 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
17418 /*
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
17419 * 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
17420 * 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
17421 */
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
17422 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
17423 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
17424 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
17425 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
17426 continue;
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
17427
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
17428 /* We have initialized controller port info */
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17429 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst, ncport)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17430 event_flags = (SATA_CPORT_INFO(sata_hba_inst, ncport))->
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17431 cport_event_flags;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17432 /* Check if port was locked by IOCTL processing */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17433 if (event_flags & SATA_APCTL_LOCK_PORT_BUSY) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17434 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17435 * We ignore port events because port is busy
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17436 * with AP control processing. Set again
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17437 * controller and main event flag, so that
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17438 * events may be processed by the next daemon
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17439 * run.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17440 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17441 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, ncport)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17442 mutex_enter(&sata_hba_inst->satahba_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17443 sata_hba_inst->satahba_event_flags |= SATA_EVNT_MAIN;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17444 mutex_exit(&sata_hba_inst->satahba_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17445 mutex_enter(&sata_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17446 sata_event_pending |= SATA_EVNT_MAIN;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17447 mutex_exit(&sata_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17448 SATADBG1(SATA_DBG_EVENTS_PROCPST, sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17449 "Event processing postponed until "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17450 "AP control processing completes",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17451 NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17452 /* Check other ports */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17453 continue;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17454 } else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17455 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17456 * Set BSY flag so that AP control would not
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17457 * interfere with events processing for
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17458 * this port.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17459 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17460 (SATA_CPORT_INFO(sata_hba_inst, ncport))->
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17461 cport_event_flags |= SATA_EVNT_LOCK_PORT_BUSY;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17462 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17463 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, ncport)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17464
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17465 saddr = &(SATA_CPORT_INFO(sata_hba_inst, ncport))->cport_addr;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17466
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17467 if ((event_flags &
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17468 (SATA_EVNT_PORT_EVENTS | SATA_EVNT_DRIVE_EVENTS)) != 0) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17469 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17470 * Got port event.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17471 * We need some hierarchy of event processing as they
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17472 * are affecting each other:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17473 * 1. port failed
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17474 * 2. device detached/attached
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17475 * 3. link events - link events may trigger device
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17476 * detached or device attached events in some
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17477 * circumstances.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17478 * 4. port power level changed
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17479 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17480 if (event_flags & SATA_EVNT_PORT_FAILED) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17481 sata_process_port_failed_event(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17482 saddr);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17483 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17484 if (event_flags & SATA_EVNT_DEVICE_DETACHED) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17485 sata_process_device_detached(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17486 saddr);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17487 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17488 if (event_flags & SATA_EVNT_DEVICE_ATTACHED) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17489 sata_process_device_attached(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17490 saddr);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17491 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17492 if (event_flags &
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17493 (SATA_EVNT_LINK_ESTABLISHED |
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17494 SATA_EVNT_LINK_LOST)) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17495 sata_process_port_link_events(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17496 saddr);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17497 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17498 if (event_flags & SATA_EVNT_PWR_LEVEL_CHANGED) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17499 sata_process_port_pwr_change(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17500 saddr);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17501 }
3935
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
17502 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
17503 sata_process_target_node_cleanup(
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
17504 sata_hba_inst, saddr);
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
17505 }
5832
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
17506 if (event_flags & SATA_EVNT_AUTOONLINE_DEVICE) {
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
17507 sata_process_device_autoonline(
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
17508 sata_hba_inst, saddr);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
17509 }
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17510 }
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17511
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17512
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17513 /*
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17514 * Scan port multiplier and all its sub-ports event flags.
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17515 * The events are marked by
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17516 * (1) sata_pmult_info.pmult_event_flags
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17517 * (2) sata_pmport_info.pmport_event_flags
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17518 */
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17519 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst, ncport)));
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17520 if (cportinfo->cport_dev_type == SATA_DTYPE_PMULT) {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17521 /*
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17522 * There should be another extra check: this
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17523 * port multiplier still exists?
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17524 */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17525 pmultinfo = SATA_PMULT_INFO(sata_hba_inst,
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17526 ncport);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17527
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17528 if (pmultinfo != NULL) {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17529 mutex_exit(&(SATA_CPORT_MUTEX(
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17530 sata_hba_inst, ncport)));
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17531 sata_process_pmult_events(
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17532 sata_hba_inst, ncport);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17533 mutex_enter(&(SATA_CPORT_MUTEX(
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17534 sata_hba_inst, ncport)));
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17535 } else {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17536 SATADBG1(SATA_DBG_PMULT, sata_hba_inst,
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17537 "Port-multiplier is gone. "
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17538 "Ignore all sub-device events "
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17539 "at port %d.", ncport);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17540 }
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17541 }
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17542
6539
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
17543 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
17544 SATA_DTYPE_NONE) &&
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
17545 (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
17546 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
17547 satadrv_event_flags &
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
17548 (SATA_EVNT_DEVICE_RESET |
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
17549 SATA_EVNT_INPROC_DEVICE_RESET)) {
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
17550 /* Have device event */
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
17551 sata_process_device_reset(sata_hba_inst,
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
17552 saddr);
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
17553 }
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
17554 }
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17555 /* Release PORT_BUSY flag */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17556 (SATA_CPORT_INFO(sata_hba_inst, ncport))->
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17557 cport_event_flags &= ~SATA_EVNT_LOCK_PORT_BUSY;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17558 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, ncport)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17559
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17560 } /* End of loop through the controller SATA ports */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17561 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17562
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17563 /*
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17564 * Specific port multiplier instance event processing. At the moment, device
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17565 * event processing is limited to link/attach event only.
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17566 *
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17567 * NOTE: power management event is not supported yet.
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17568 */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17569 static void
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17570 sata_process_pmult_events(sata_hba_inst_t *sata_hba_inst, uint8_t cport)
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17571 {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17572 sata_cport_info_t *cportinfo = SATA_CPORT_INFO(sata_hba_inst, cport);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17573 sata_pmult_info_t *pmultinfo;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17574 sata_pmport_info_t *pmportinfo;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17575 sata_address_t *saddr;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17576 sata_device_t sata_device;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17577 uint32_t event_flags;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17578 int npmport;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17579 int rval;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17580
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17581 SATADBG2(SATA_DBG_EVENTS_CNTRL|SATA_DBG_PMULT, sata_hba_inst,
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17582 "Processing pmult event(s) on cport %d of controller %d",
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17583 cport, ddi_get_instance(SATA_DIP(sata_hba_inst)));
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17584
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17585 /* First process events on port multiplier */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17586 mutex_enter(&cportinfo->cport_mutex);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17587 pmultinfo = SATA_PMULT_INFO(sata_hba_inst, cport);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17588 event_flags = pmultinfo->pmult_event_flags;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17589
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17590 /*
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17591 * Reset event (of port multiplier) has higher priority because the
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17592 * port multiplier itself might be failed or removed after reset.
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17593 */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17594 if (event_flags & SATA_EVNT_DEVICE_RESET) {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17595 /*
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17596 * The status of the sub-links are uncertain,
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17597 * so mark all sub-ports as RESET
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17598 */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17599 for (npmport = 0; npmport < SATA_NUM_PMPORTS(
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17600 sata_hba_inst, cport); npmport ++) {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17601 pmportinfo = SATA_PMPORT_INFO(sata_hba_inst,
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17602 cport, npmport);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17603 if (pmportinfo == NULL) {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17604 /* That's weird. */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17605 SATA_LOG_D((sata_hba_inst, CE_WARN,
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17606 "sata_hba_event_notify: "
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17607 "invalid/un-implemented "
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17608 "port %d:%d (%d ports), ",
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17609 cport, npmport, SATA_NUM_PMPORTS(
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17610 sata_hba_inst, cport)));
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17611 continue;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17612 }
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17613
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17614 mutex_enter(&pmportinfo->pmport_mutex);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17615
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17616 /* Mark all pmport to unknow state. */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17617 pmportinfo->pmport_state = SATA_STATE_UNKNOWN;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17618 /* Mark all pmports with link events. */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17619 pmportinfo->pmport_event_flags =
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17620 (SATA_EVNT_LINK_ESTABLISHED|SATA_EVNT_LINK_LOST);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17621 mutex_exit(&pmportinfo->pmport_mutex);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17622 }
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17623
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17624 } else if (event_flags & SATA_EVNT_PMULT_LINK_CHANGED) {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17625 /*
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17626 * We need probe the port multiplier to know what has
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17627 * happened.
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17628 */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17629 bzero(&sata_device, sizeof (sata_device_t));
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17630 sata_device.satadev_rev = SATA_DEVICE_REV;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17631 sata_device.satadev_addr.cport = cport;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17632 sata_device.satadev_addr.pmport = SATA_PMULT_HOSTPORT;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17633 sata_device.satadev_addr.qual = SATA_ADDR_PMULT;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17634
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17635 mutex_exit(&cportinfo->cport_mutex);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17636 rval = (*SATA_PROBE_PORT_FUNC(sata_hba_inst))
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17637 (SATA_DIP(sata_hba_inst), &sata_device);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17638 mutex_enter(&cportinfo->cport_mutex);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17639 if (rval != SATA_SUCCESS) {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17640 /* Something went wrong? Fail the port */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17641 cportinfo->cport_state = SATA_PSTATE_FAILED;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17642 mutex_exit(&cportinfo->cport_mutex);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17643 SATA_LOG_D((sata_hba_inst, CE_WARN,
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17644 "SATA port %d probing failed", cport));
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17645
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17646 /* PMult structure must be released. */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17647 sata_free_pmult(sata_hba_inst, &sata_device);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17648 return;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17649 }
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17650
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17651 sata_update_port_info(sata_hba_inst, &sata_device);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17652
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17653 /*
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17654 * Sanity check - Port is active? Is the link active?
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17655 * The device is still a port multiplier?
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17656 */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17657 if ((cportinfo->cport_state &
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17658 (SATA_PSTATE_SHUTDOWN | SATA_PSTATE_FAILED)) ||
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17659 ((cportinfo->cport_scr.sstatus &
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17660 SATA_PORT_DEVLINK_UP_MASK) != SATA_PORT_DEVLINK_UP) ||
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17661 (cportinfo->cport_dev_type != SATA_DTYPE_PMULT)) {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17662 mutex_exit(&cportinfo->cport_mutex);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17663
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17664 /* PMult structure must be released. */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17665 sata_free_pmult(sata_hba_inst, &sata_device);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17666 return;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17667 }
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17668
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17669 /* Probed succeed, set port ready. */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17670 cportinfo->cport_state |=
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17671 SATA_STATE_PROBED | SATA_STATE_READY;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17672 }
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17673
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17674 /* Release port multiplier event flags. */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17675 pmultinfo->pmult_event_flags &=
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17676 ~(SATA_EVNT_DEVICE_RESET|SATA_EVNT_PMULT_LINK_CHANGED);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17677 mutex_exit(&cportinfo->cport_mutex);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17678
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17679 /*
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17680 * Check all sub-links.
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17681 */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17682 for (npmport = 0; npmport < SATA_NUM_PMPORTS(sata_hba_inst, cport);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17683 npmport ++) {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17684 pmportinfo = SATA_PMPORT_INFO(sata_hba_inst, cport, npmport);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17685 mutex_enter(&pmportinfo->pmport_mutex);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17686 event_flags = pmportinfo->pmport_event_flags;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17687 mutex_exit(&pmportinfo->pmport_mutex);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17688 saddr = &pmportinfo->pmport_addr;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17689
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17690 if ((event_flags &
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17691 (SATA_EVNT_PORT_EVENTS | SATA_EVNT_DRIVE_EVENTS)) != 0) {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17692 /*
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17693 * Got port multiplier port event.
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17694 * We need some hierarchy of event processing as they
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17695 * are affecting each other:
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17696 * 1. device detached/attached
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17697 * 2. link events - link events may trigger device
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17698 * detached or device attached events in some
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17699 * circumstances.
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17700 */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17701 if (event_flags & SATA_EVNT_DEVICE_DETACHED) {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17702 sata_process_pmdevice_detached(sata_hba_inst,
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17703 saddr);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17704 }
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17705 if (event_flags & SATA_EVNT_DEVICE_ATTACHED) {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17706 sata_process_pmdevice_attached(sata_hba_inst,
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17707 saddr);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17708 }
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17709 if (event_flags & SATA_EVNT_LINK_ESTABLISHED ||
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17710 event_flags & SATA_EVNT_LINK_LOST) {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17711 sata_process_pmport_link_events(sata_hba_inst,
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17712 saddr);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17713 }
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17714 if (event_flags & SATA_EVNT_TARGET_NODE_CLEANUP) {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17715 sata_process_target_node_cleanup(
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17716 sata_hba_inst, saddr);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17717 }
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17718 }
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17719
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17720 /* Checking drive event(s). */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17721 mutex_enter(&pmportinfo->pmport_mutex);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17722 if (pmportinfo->pmport_dev_type != SATA_DTYPE_NONE &&
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17723 pmportinfo->pmport_sata_drive != NULL) {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17724 event_flags = pmportinfo->pmport_sata_drive->
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17725 satadrv_event_flags;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17726 if (event_flags & (SATA_EVNT_DEVICE_RESET |
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17727 SATA_EVNT_INPROC_DEVICE_RESET)) {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17728
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17729 /* Have device event */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17730 sata_process_pmdevice_reset(sata_hba_inst,
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17731 saddr);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17732 }
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17733 }
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17734 mutex_exit(&pmportinfo->pmport_mutex);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17735
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17736 /* Release PORT_BUSY flag */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17737 mutex_enter(&cportinfo->cport_mutex);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17738 cportinfo->cport_event_flags &= ~SATA_EVNT_LOCK_PORT_BUSY;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17739 mutex_exit(&cportinfo->cport_mutex);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17740 }
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17741
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17742 SATADBG2(SATA_DBG_EVENTS_CNTRL|SATA_DBG_PMULT, sata_hba_inst,
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17743 "[DONE] pmult event(s) on cport %d of controller %d",
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17744 cport, ddi_get_instance(SATA_DIP(sata_hba_inst)));
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17745 }
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17746
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17747 /*
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17748 * Process HBA power level change reported by HBA driver.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17749 * Not implemented at this time - event is ignored.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17750 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17751 static void
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17752 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
17753 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17754 SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17755 "Processing controller power level change", NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17756
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17757 /* Ignoring it for now */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17758 mutex_enter(&sata_hba_inst->satahba_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17759 sata_hba_inst->satahba_event_flags &= ~SATA_EVNT_PWR_LEVEL_CHANGED;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17760 mutex_exit(&sata_hba_inst->satahba_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17761 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17762
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17763 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17764 * Process port power level change reported by HBA driver.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17765 * Not implemented at this time - event is ignored.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17766 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17767 static void
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17768 sata_process_port_pwr_change(sata_hba_inst_t *sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17769 sata_address_t *saddr)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17770 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17771 sata_cport_info_t *cportinfo;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17772
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17773 SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17774 "Processing port power level change", NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17775
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17776 cportinfo = SATA_CPORT_INFO(sata_hba_inst, saddr->cport);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17777 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17778 /* Reset event flag */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17779 cportinfo->cport_event_flags &= ~SATA_EVNT_PWR_LEVEL_CHANGED;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17780 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17781 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17782
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17783 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17784 * Process port failure reported by HBA driver.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17785 * cports support only - no pmports.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17786 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17787 static void
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17788 sata_process_port_failed_event(sata_hba_inst_t *sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17789 sata_address_t *saddr)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17790 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17791 sata_cport_info_t *cportinfo;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17792
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17793 cportinfo = SATA_CPORT_INFO(sata_hba_inst, saddr->cport);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17794 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17795 /* Reset event flag first */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17796 cportinfo->cport_event_flags &= ~SATA_EVNT_PORT_FAILED;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17797 /* If the port is in SHUTDOWN or FAILED state, ignore this event. */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17798 if ((cportinfo->cport_state &
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17799 (SATA_PSTATE_SHUTDOWN | SATA_PSTATE_FAILED)) == 0) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17800 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17801 cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17802 return;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17803 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17804 /* Fail the port */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17805 cportinfo->cport_state = SATA_PSTATE_FAILED;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17806 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
17807 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
17808 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17809
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17810 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17811 * Device Reset Event processing.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17812 * The seqeunce is managed by 3 stage flags:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17813 * - reset event reported,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17814 * - reset event being processed,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17815 * - request to clear device reset state.
6539
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
17816 *
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
17817 * 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
17818 * mutex held as well, but can release mutex during the processing.
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17819 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17820 static void
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17821 sata_process_device_reset(sata_hba_inst_t *sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17822 sata_address_t *saddr)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17823 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17824 sata_drive_info_t old_sdinfo; /* local copy of the drive info */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17825 sata_drive_info_t *sdinfo;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17826 sata_cport_info_t *cportinfo;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17827 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
17828 int rval_probe, rval_set;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17829
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17830 /* We only care about host sata cport for now */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17831 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
17832 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
17833 /*
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
17834 * 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
17835 * state, ignore reset event.
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
17836 */
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
17837 if (((cportinfo->cport_state &
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
17838 (SATA_PSTATE_SHUTDOWN | SATA_PSTATE_FAILED)) != 0) ||
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
17839 (sdinfo->satadrv_state & SATA_DSTATE_FAILED) != 0) {
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
17840 sdinfo->satadrv_event_flags &=
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
17841 ~(SATA_EVNT_DEVICE_RESET | SATA_EVNT_INPROC_DEVICE_RESET);
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17842 return;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17843 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17844
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17845 if ((SATA_CPORT_DEV_TYPE(sata_hba_inst, saddr->cport) ==
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17846 SATA_DTYPE_PMULT)) {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17847 /*
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17848 * Should not happened: this is already handled in
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17849 * sata_hba_event_notify()
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17850 */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17851 mutex_exit(&cportinfo->cport_mutex);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17852 goto done;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17853 }
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
17854
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17855 if ((SATA_CPORT_DEV_TYPE(sata_hba_inst, saddr->cport) &
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17856 SATA_VALID_DEV_TYPE) == 0) {
6539
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
17857 /*
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
17858 * This should not happen - coding error.
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
17859 * 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
17860 * 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
17861 */
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
17862 #ifdef SATA_DEBUG
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
17863 sata_log(sata_hba_inst, CE_WARN,
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
17864 "sata_process_device_reset: "
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
17865 "Invalid device type with sdinfo!", NULL);
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
17866 #endif
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
17867 sdinfo->satadrv_event_flags = 0;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17868 return;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17869 }
6539
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
17870
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
17871 #ifdef SATA_DEBUG
3935
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
17872 if ((sdinfo->satadrv_event_flags &
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
17873 (SATA_EVNT_DEVICE_RESET | SATA_EVNT_INPROC_DEVICE_RESET)) == 0) {
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17874 /* Nothing to do */
6539
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
17875 /* 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
17876 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
17877 "No device reset event!!!!", NULL);
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
17878
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17879 return;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17880 }
3935
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
17881 if ((sdinfo->satadrv_event_flags &
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
17882 (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
17883 (SATA_EVNT_DEVICE_RESET | SATA_EVNT_INPROC_DEVICE_RESET)) {
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17884 /* Something is weird - new device reset event */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17885 SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17886 "Overlapping device reset events!", NULL);
3935
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
17887 }
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
17888 #endif
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
17889 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
17890 "Processing port %d device reset", saddr->cport);
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17891
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17892 /* Clear event flag */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17893 sdinfo->satadrv_event_flags &= ~SATA_EVNT_DEVICE_RESET;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17894
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17895 /* It seems that we always need to check the port state first */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17896 sata_device.satadev_rev = SATA_DEVICE_REV;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17897 sata_device.satadev_addr = *saddr;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17898 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17899 * We have to exit mutex, because the HBA probe port function may
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17900 * block on its own mutex.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17901 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17902 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
17903 rval_probe = (*SATA_PROBE_PORT_FUNC(sata_hba_inst))
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17904 (SATA_DIP(sata_hba_inst), &sata_device);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17905 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17906 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
17907 if (rval_probe != SATA_SUCCESS) {
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17908 /* Something went wrong? Fail the port */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17909 cportinfo->cport_state = SATA_PSTATE_FAILED;
6539
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
17910 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
17911 if (sdinfo != NULL)
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
17912 sdinfo->satadrv_event_flags = 0;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17913 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17914 cport_mutex);
3935
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
17915 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
17916 "SATA port %d probing failed",
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17917 saddr->cport));
6539
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
17918 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
17919 saddr->cport)->cport_mutex);
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17920 return;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17921 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17922 if ((sata_device.satadev_scr.sstatus &
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17923 SATA_PORT_DEVLINK_UP_MASK) !=
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17924 SATA_PORT_DEVLINK_UP ||
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17925 sata_device.satadev_type == SATA_DTYPE_NONE) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17926 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17927 * No device to process, anymore. Some other event processing
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17928 * would or have already performed port info cleanup.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17929 * To be safe (HBA may need it), request clearing device
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17930 * reset condition.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17931 */
6539
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
17932 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
17933 if (sdinfo != NULL) {
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
17934 sdinfo->satadrv_event_flags &=
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
17935 ~SATA_EVNT_INPROC_DEVICE_RESET;
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
17936 sdinfo->satadrv_event_flags |=
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
17937 SATA_EVNT_CLEAR_DEVICE_RESET;
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
17938 }
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17939 return;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17940 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17941
6539
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
17942 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
17943 if (sdinfo == NULL) {
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
17944 return;
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
17945 }
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
17946 if ((sdinfo->satadrv_event_flags &
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
17947 SATA_EVNT_INPROC_DEVICE_RESET) == 0) {
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
17948 /*
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
17949 * 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
17950 * identification. Save current time (lbolt value).
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
17951 */
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
17952 sdinfo->satadrv_reset_time = ddi_get_lbolt();
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
17953 }
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17954 /* Mark device reset processing as active */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17955 sdinfo->satadrv_event_flags |= SATA_EVNT_INPROC_DEVICE_RESET;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17956
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17957 old_sdinfo = *sdinfo; /* local copy of the drive info */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17958 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17959
7954
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
17960 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
17961
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
17962 if (rval_set != SATA_SUCCESS) {
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17963 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17964 * Restoring drive setting failed.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17965 * Probe the port first, to check if the port state has changed
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17966 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17967 sata_device.satadev_rev = SATA_DEVICE_REV;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17968 sata_device.satadev_addr = *saddr;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17969 sata_device.satadev_addr.qual = SATA_ADDR_CPORT;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17970 /* 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
17971 rval_probe = (*SATA_PROBE_PORT_FUNC(sata_hba_inst))
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17972 (SATA_DIP(sata_hba_inst), &sata_device);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17973 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17974 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
17975 if (rval_probe == SATA_SUCCESS &&
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17976 (sata_device.satadev_state &
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17977 (SATA_PSTATE_SHUTDOWN | SATA_PSTATE_FAILED)) == 0 &&
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17978 (sata_device.satadev_scr.sstatus &
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17979 SATA_PORT_DEVLINK_UP_MASK) == SATA_PORT_DEVLINK_UP &&
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
17980 sata_device.satadev_type != SATA_DTYPE_NONE) {
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17981 /*
3935
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
17982 * We may retry this a bit later - in-process reset
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
17983 * condition should be already set.
6539
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
17984 * Track retry time for device identification.
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17985 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17986 if ((cportinfo->cport_dev_type &
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
17987 SATA_VALID_DEV_TYPE) != 0 &&
6539
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
17988 SATA_CPORTINFO_DRV_INFO(cportinfo) != NULL &&
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
17989 sdinfo->satadrv_reset_time != 0) {
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
17990 clock_t cur_time = ddi_get_lbolt();
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
17991 /*
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
17992 * If the retry time limit was not
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
17993 * exceeded, retry.
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
17994 */
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
17995 if ((cur_time - sdinfo->satadrv_reset_time) <
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
17996 drv_usectohz(SATA_DEV_REPROBE_TIMEOUT)) {
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
17997 mutex_enter(
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
17998 &sata_hba_inst->satahba_mutex);
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
17999 sata_hba_inst->satahba_event_flags |=
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
18000 SATA_EVNT_MAIN;
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
18001 mutex_exit(
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
18002 &sata_hba_inst->satahba_mutex);
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
18003 mutex_enter(&sata_mutex);
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
18004 sata_event_pending |= SATA_EVNT_MAIN;
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
18005 mutex_exit(&sata_mutex);
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
18006 return;
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
18007 }
7954
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
18008 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
18009 /*
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
18010 * 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
18011 * 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
18012 * 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
18013 * return.
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
18014 */
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
18015 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
18016 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
18017 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
18018 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
18019 }
6539
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
18020 }
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
18021 /* Fail the drive */
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
18022 sdinfo->satadrv_state = SATA_DSTATE_FAILED;
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
18023
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
18024 sata_log(sata_hba_inst, CE_WARN,
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
18025 "SATA device at port %d - device failed",
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
18026 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
18027 }
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
18028 /*
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
18029 * 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
18030 * 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
18031 * 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
18032 * 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
18033 */
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
18034 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
18035 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
18036 sdinfo->satadrv_reset_time = 0;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18037 return;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18038 }
7954
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
18039 done:
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
18040 /*
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
18041 * 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
18042 * 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
18043 */
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
18044 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
18045 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
18046 "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
18047 "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
18048 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
18049 }
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18050 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18051 * Raise the flag indicating that the next sata command could
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18052 * 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
18053 * reset is reported.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18054 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18055 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
18056 if (SATA_CPORTINFO_DRV_INFO(cportinfo) != NULL) {
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
18057 sdinfo->satadrv_reset_time = 0;
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
18058 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
18059 sdinfo = SATA_CPORTINFO_DRV_INFO(cportinfo);
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
18060 sdinfo->satadrv_event_flags &=
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
18061 ~SATA_EVNT_INPROC_DEVICE_RESET;
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
18062 sdinfo->satadrv_event_flags |=
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
18063 SATA_EVNT_CLEAR_DEVICE_RESET;
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
18064 }
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
18065 }
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18066 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18067
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18068
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18069 /*
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18070 * Port Multiplier Port Device Reset Event processing.
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18071 *
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18072 * NOTE: This function has to be entered with pmport mutex held. It exits with
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18073 * mutex held as well, but can release mutex during the processing.
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18074 */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18075 static void
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18076 sata_process_pmdevice_reset(sata_hba_inst_t *sata_hba_inst,
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18077 sata_address_t *saddr)
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18078 {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18079 sata_drive_info_t old_sdinfo; /* local copy of the drive info */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18080 sata_drive_info_t *sdinfo = NULL;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18081 sata_cport_info_t *cportinfo = NULL;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18082 sata_pmport_info_t *pmportinfo = NULL;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18083 sata_pmult_info_t *pminfo = NULL;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18084 sata_device_t sata_device;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18085 uint8_t cport = saddr->cport;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18086 uint8_t pmport = saddr->pmport;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18087 int rval;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18088
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18089 SATADBG2(SATA_DBG_EVENTS_PROC, sata_hba_inst,
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18090 "Processing drive reset at port %d:%d", cport, pmport);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18091
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18092 cportinfo = SATA_CPORT_INFO(sata_hba_inst, cport);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18093 pmportinfo = SATA_PMPORT_INFO(sata_hba_inst, cport, pmport);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18094 sdinfo = SATA_PMPORT_DRV_INFO(sata_hba_inst, cport, pmport);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18095
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18096 /*
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18097 * If the port is in SHUTDOWN or FAILED state, or device is in FAILED
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18098 * state, ignore reset event.
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18099 */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18100 if (((cportinfo->cport_state &
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18101 (SATA_PSTATE_SHUTDOWN | SATA_PSTATE_FAILED)) != 0) ||
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18102 (sdinfo->satadrv_state & SATA_DSTATE_FAILED) != 0) {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18103 sdinfo->satadrv_event_flags &=
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18104 ~(SATA_EVNT_DEVICE_RESET | SATA_EVNT_INPROC_DEVICE_RESET);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18105 return;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18106 }
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18107
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18108 if ((pmportinfo->pmport_dev_type & SATA_VALID_DEV_TYPE) == 0) {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18109 /*
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18110 * This should not happen - coding error.
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18111 * But we can recover, so do not panic, just clean up
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18112 * and if in debug mode, log the message.
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18113 */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18114 #ifdef SATA_DEBUG
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18115 sata_log(sata_hba_inst, CE_WARN,
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18116 "sata_process_pmdevice_reset: "
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18117 "Invalid device type with sdinfo!", NULL);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18118 #endif
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18119 sdinfo->satadrv_event_flags = 0;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18120 return;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18121 }
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18122
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18123 #ifdef SATA_DEBUG
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18124 if ((sdinfo->satadrv_event_flags &
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18125 (SATA_EVNT_DEVICE_RESET | SATA_EVNT_INPROC_DEVICE_RESET)) == 0) {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18126 /* Nothing to do */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18127 /* Something is weird - why we are processing dev reset? */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18128 SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18129 "No device reset event!!!!", NULL);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18130
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18131 return;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18132 }
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18133 if ((sdinfo->satadrv_event_flags &
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18134 (SATA_EVNT_DEVICE_RESET | SATA_EVNT_INPROC_DEVICE_RESET)) ==
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18135 (SATA_EVNT_DEVICE_RESET | SATA_EVNT_INPROC_DEVICE_RESET)) {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18136 /* Something is weird - new device reset event */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18137 SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18138 "Overlapping device reset events!", NULL);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18139 }
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18140 #endif
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18141 SATADBG2(SATA_DBG_EVENTS_PROC, sata_hba_inst,
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18142 "Processing port %d:%d device reset", cport, pmport);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18143
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18144 /* Clear event flag */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18145 sdinfo->satadrv_event_flags &= ~SATA_EVNT_DEVICE_RESET;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18146
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18147 /* It seems that we always need to check the port state first */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18148 sata_device.satadev_rev = SATA_DEVICE_REV;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18149 sata_device.satadev_addr = *saddr;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18150 /*
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18151 * We have to exit mutex, because the HBA probe port function may
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18152 * block on its own mutex.
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18153 */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18154 mutex_exit(&pmportinfo->pmport_mutex);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18155 rval = (*SATA_PROBE_PORT_FUNC(sata_hba_inst))
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18156 (SATA_DIP(sata_hba_inst), &sata_device);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18157 mutex_enter(&pmportinfo->pmport_mutex);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18158
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18159 sata_update_pmport_info(sata_hba_inst, &sata_device);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18160 if (rval != SATA_SUCCESS) {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18161 /* Something went wrong? Fail the port */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18162 pmportinfo->pmport_state = SATA_PSTATE_FAILED;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18163 sdinfo = SATA_PMPORT_DRV_INFO(sata_hba_inst, saddr->cport,
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18164 saddr->pmport);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18165 if (sdinfo != NULL)
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18166 sdinfo->satadrv_event_flags = 0;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18167 mutex_exit(&pmportinfo->pmport_mutex);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18168 SATA_LOG_D((sata_hba_inst, CE_WARN,
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18169 "SATA port %d:%d probing failed",
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18170 saddr->cport, saddr->pmport));
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18171 mutex_enter(&pmportinfo->pmport_mutex);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18172 return;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18173 }
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18174 if ((sata_device.satadev_scr.sstatus &
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18175 SATA_PORT_DEVLINK_UP_MASK) !=
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18176 SATA_PORT_DEVLINK_UP ||
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18177 sata_device.satadev_type == SATA_DTYPE_NONE) {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18178 /*
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18179 * No device to process, anymore. Some other event processing
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18180 * would or have already performed port info cleanup.
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18181 * To be safe (HBA may need it), request clearing device
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18182 * reset condition.
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18183 */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18184 sdinfo = SATA_PMPORT_DRV_INFO(sata_hba_inst, saddr->cport,
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18185 saddr->pmport);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18186 if (sdinfo != NULL) {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18187 sdinfo->satadrv_event_flags &=
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18188 ~SATA_EVNT_INPROC_DEVICE_RESET;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18189 /* must clear flags on cport */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18190 pminfo = SATA_PMULT_INFO(sata_hba_inst,
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18191 saddr->cport);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18192 pminfo->pmult_event_flags |=
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18193 SATA_EVNT_CLEAR_DEVICE_RESET;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18194 }
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18195 return;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18196 }
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18197
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18198 sdinfo = SATA_PMPORT_DRV_INFO(sata_hba_inst, saddr->cport,
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18199 saddr->pmport);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18200 if (sdinfo == NULL) {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18201 return;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18202 }
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18203 if ((sdinfo->satadrv_event_flags &
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18204 SATA_EVNT_INPROC_DEVICE_RESET) == 0) {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18205 /*
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18206 * Start tracking time for device feature restoration and
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18207 * identification. Save current time (lbolt value).
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18208 */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18209 sdinfo->satadrv_reset_time = ddi_get_lbolt();
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18210 }
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18211 /* Mark device reset processing as active */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18212 sdinfo->satadrv_event_flags |= SATA_EVNT_INPROC_DEVICE_RESET;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18213
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18214 old_sdinfo = *sdinfo; /* local copy of the drive info */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18215 mutex_exit(&pmportinfo->pmport_mutex);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18216
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18217 if (sata_set_drive_features(sata_hba_inst, &old_sdinfo, 1) ==
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18218 SATA_FAILURE) {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18219 /*
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18220 * Restoring drive setting failed.
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18221 * Probe the port first, to check if the port state has changed
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18222 */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18223 sata_device.satadev_rev = SATA_DEVICE_REV;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18224 sata_device.satadev_addr = *saddr;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18225 sata_device.satadev_addr.qual = SATA_ADDR_PMPORT;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18226
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18227 /* probe port */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18228 rval = (*SATA_PROBE_PORT_FUNC(sata_hba_inst))
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18229 (SATA_DIP(sata_hba_inst), &sata_device);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18230 mutex_enter(&pmportinfo->pmport_mutex);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18231 if (rval == SATA_SUCCESS &&
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18232 (sata_device.satadev_state &
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18233 (SATA_PSTATE_SHUTDOWN | SATA_PSTATE_FAILED)) == 0 &&
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18234 (sata_device.satadev_scr.sstatus &
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18235 SATA_PORT_DEVLINK_UP_MASK) == SATA_PORT_DEVLINK_UP &&
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18236 sata_device.satadev_type != SATA_DTYPE_NONE) {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18237 /*
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18238 * We may retry this a bit later - in-process reset
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18239 * condition should be already set.
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18240 * Track retry time for device identification.
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18241 */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18242 if ((pmportinfo->pmport_dev_type &
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18243 SATA_VALID_DEV_TYPE) != 0 &&
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18244 SATA_PMPORTINFO_DRV_INFO(pmportinfo) != NULL &&
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18245 sdinfo->satadrv_reset_time != 0) {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18246 clock_t cur_time = ddi_get_lbolt();
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18247 /*
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18248 * If the retry time limit was not
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18249 * exceeded, retry.
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18250 */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18251 if ((cur_time - sdinfo->satadrv_reset_time) <
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18252 drv_usectohz(SATA_DEV_REPROBE_TIMEOUT)) {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18253 mutex_enter(
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18254 &sata_hba_inst->satahba_mutex);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18255 sata_hba_inst->satahba_event_flags |=
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18256 SATA_EVNT_MAIN;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18257 mutex_exit(
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18258 &sata_hba_inst->satahba_mutex);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18259 mutex_enter(&sata_mutex);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18260 sata_event_pending |= SATA_EVNT_MAIN;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18261 mutex_exit(&sata_mutex);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18262 return;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18263 }
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18264 }
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18265 /* Fail the drive */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18266 sdinfo->satadrv_state = SATA_DSTATE_FAILED;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18267
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18268 sata_log(sata_hba_inst, CE_WARN,
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18269 "SATA device at port %d:%d - device failed",
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18270 saddr->cport, saddr->pmport);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18271 } else {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18272 /*
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18273 * No point of retrying - some other event processing
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18274 * would or already did port info cleanup.
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18275 * To be safe (HBA may need it),
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18276 * request clearing device reset condition.
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18277 */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18278 sdinfo->satadrv_event_flags |=
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18279 SATA_EVNT_CLEAR_DEVICE_RESET;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18280 }
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18281 sdinfo->satadrv_event_flags &= ~SATA_EVNT_INPROC_DEVICE_RESET;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18282 sdinfo->satadrv_reset_time = 0;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18283 return;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18284 }
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18285 /*
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18286 * Raise the flag indicating that the next sata command could
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18287 * be sent with SATA_CLEAR_DEV_RESET_STATE flag, if no new device
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18288 * reset is reported.
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18289 */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18290 mutex_enter(&pmportinfo->pmport_mutex);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18291 if (SATA_PMPORTINFO_DRV_INFO(pmportinfo) != NULL) {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18292 sdinfo->satadrv_reset_time = 0;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18293 if (pmportinfo->pmport_dev_type & SATA_VALID_DEV_TYPE) {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18294 sdinfo = SATA_PMPORTINFO_DRV_INFO(pmportinfo);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18295 sdinfo->satadrv_event_flags &=
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18296 ~SATA_EVNT_INPROC_DEVICE_RESET;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18297 /* must clear flags on cport */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18298 pminfo = SATA_PMULT_INFO(sata_hba_inst,
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18299 saddr->cport);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18300 pminfo->pmult_event_flags |=
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18301 SATA_EVNT_CLEAR_DEVICE_RESET;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18302 }
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18303 }
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18304 }
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18305
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18306 /*
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18307 * Port Link Events processing.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18308 * Every link established event may involve device reset (due to
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18309 * COMRESET signal, equivalent of the hard reset) so arbitrarily
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18310 * set device reset event for an attached device (if any).
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18311 * If the port is in SHUTDOWN or FAILED state, ignore link events.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18312 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18313 * The link established event processing varies, depending on the state
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18314 * of the target node, HBA hotplugging capabilities, state of the port.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18315 * If the link is not active, the link established event is ignored.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18316 * If HBA cannot detect device attachment and there is no target node,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18317 * the link established event triggers device attach event processing.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18318 * Else, link established event triggers device reset event processing.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18319 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18320 * The link lost event processing varies, depending on a HBA hotplugging
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18321 * capability and the state of the port (link active or not active).
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18322 * If the link is active, the lost link event is ignored.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18323 * If HBA cannot detect device removal, the lost link event triggers
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18324 * device detached event processing after link lost timeout.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18325 * Else, the event is ignored.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18326 *
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18327 * NOTE: Port multiplier ports events are handled by
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18328 * sata_process_pmport_link_events();
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18329 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18330 static void
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18331 sata_process_port_link_events(sata_hba_inst_t *sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18332 sata_address_t *saddr)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18333 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18334 sata_device_t sata_device;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18335 sata_cport_info_t *cportinfo;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18336 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
18337 uint32_t event_flags;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18338 int rval;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18339
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18340 SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18341 "Processing port %d link event(s)", saddr->cport);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18342
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18343 cportinfo = SATA_CPORT_INFO(sata_hba_inst, saddr->cport);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18344 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18345 event_flags = cportinfo->cport_event_flags;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18346
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18347 /* Reset event flags first */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18348 cportinfo->cport_event_flags &=
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18349 ~(SATA_EVNT_LINK_ESTABLISHED | SATA_EVNT_LINK_LOST);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18350
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18351 /* If the port is in SHUTDOWN or FAILED state, ignore link events. */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18352 if ((cportinfo->cport_state &
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18353 (SATA_PSTATE_SHUTDOWN | SATA_PSTATE_FAILED)) != 0) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18354 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18355 cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18356 return;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18357 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18358
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18359 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18360 * For the sanity sake get current port state.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18361 * Set device address only. Other sata_device fields should be
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18362 * set by HBA driver.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18363 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18364 sata_device.satadev_rev = SATA_DEVICE_REV;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18365 sata_device.satadev_addr = *saddr;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18366 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18367 * We have to exit mutex, because the HBA probe port function may
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18368 * block on its own mutex.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18369 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18370 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18371 rval = (*SATA_PROBE_PORT_FUNC(sata_hba_inst))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18372 (SATA_DIP(sata_hba_inst), &sata_device);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18373 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18374 sata_update_port_info(sata_hba_inst, &sata_device);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18375 if (rval != SATA_SUCCESS) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18376 /* Something went wrong? Fail the port */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18377 cportinfo->cport_state = SATA_PSTATE_FAILED;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18378 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18379 cport_mutex);
3935
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
18380 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
18381 "SATA port %d probing failed",
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18382 saddr->cport));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18383 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18384 * We may want to release device info structure, but
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18385 * it is not necessary.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18386 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18387 return;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18388 } else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18389 /* port probed successfully */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18390 cportinfo->cport_state |= SATA_STATE_PROBED | SATA_STATE_READY;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18391 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18392 if (event_flags & SATA_EVNT_LINK_ESTABLISHED) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18393
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18394 if ((sata_device.satadev_scr.sstatus &
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18395 SATA_PORT_DEVLINK_UP_MASK) != SATA_PORT_DEVLINK_UP) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18396 /* Ignore event */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18397 SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18398 "Ignoring port %d link established event - "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18399 "link down",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18400 saddr->cport);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18401 goto linklost;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18402 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18403
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18404 SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18405 "Processing port %d link established event",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18406 saddr->cport);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18407
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18408 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18409 * For the sanity sake check if a device is attached - check
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18410 * return state of a port probing.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18411 */
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18412 if (sata_device.satadev_type != SATA_DTYPE_NONE) {
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18413 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18414 * HBA port probe indicated that there is a device
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18415 * attached. Check if the framework had device info
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18416 * structure attached for this device.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18417 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18418 if (cportinfo->cport_dev_type != SATA_DTYPE_NONE) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18419 ASSERT(SATA_CPORTINFO_DRV_INFO(cportinfo) !=
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18420 NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18421
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18422 sdinfo = SATA_CPORTINFO_DRV_INFO(cportinfo);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18423 if ((sdinfo->satadrv_type &
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18424 SATA_VALID_DEV_TYPE) != 0) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18425 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18426 * Dev info structure is present.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18427 * If dev_type is set to known type in
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18428 * the framework's drive info struct
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18429 * then the device existed before and
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18430 * the link was probably lost
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18431 * momentarily - in such case
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18432 * we may want to check device
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18433 * identity.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18434 * Identity check is not supported now.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18435 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18436 * Link established event
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18437 * triggers device reset event.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18438 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18439 (SATA_CPORTINFO_DRV_INFO(cportinfo))->
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18440 satadrv_event_flags |=
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18441 SATA_EVNT_DEVICE_RESET;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18442 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18443 } else if (cportinfo->cport_dev_type ==
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18444 SATA_DTYPE_NONE) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18445 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18446 * We got new device attached! If HBA does not
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18447 * generate device attached events, trigger it
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18448 * here.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18449 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18450 if (!(SATA_FEATURES(sata_hba_inst) &
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18451 SATA_CTLF_HOTPLUG)) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18452 cportinfo->cport_event_flags |=
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18453 SATA_EVNT_DEVICE_ATTACHED;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18454 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18455 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18456 /* Reset link lost timeout */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18457 cportinfo->cport_link_lost_time = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18458 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18459 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18460 linklost:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18461 if (event_flags & SATA_EVNT_LINK_LOST) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18462 if ((sata_device.satadev_scr.sstatus &
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18463 SATA_PORT_DEVLINK_UP_MASK) == SATA_PORT_DEVLINK_UP) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18464 /* Ignore event */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18465 SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18466 "Ignoring port %d link lost event - link is up",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18467 saddr->cport);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18468 goto done;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18469 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18470 #ifdef SATA_DEBUG
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18471 if (cportinfo->cport_link_lost_time == 0) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18472 SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18473 "Processing port %d link lost event",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18474 saddr->cport);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18475 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18476 #endif
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18477 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18478 * When HBA cannot generate device attached/detached events,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18479 * we need to track link lost time and eventually generate
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18480 * device detach event.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18481 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18482 if (!(SATA_FEATURES(sata_hba_inst) & SATA_CTLF_HOTPLUG)) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18483 /* We are tracking link lost time */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18484 if (cportinfo->cport_link_lost_time == 0) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18485 /* save current time (lbolt value) */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18486 cportinfo->cport_link_lost_time =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18487 ddi_get_lbolt();
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18488 /* just keep link lost event */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18489 cportinfo->cport_event_flags |=
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18490 SATA_EVNT_LINK_LOST;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18491 } else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18492 clock_t cur_time = ddi_get_lbolt();
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18493 if ((cur_time -
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18494 cportinfo->cport_link_lost_time) >=
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18495 drv_usectohz(
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18496 SATA_EVNT_LINK_LOST_TIMEOUT)) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18497 /* trigger device detach event */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18498 cportinfo->cport_event_flags |=
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18499 SATA_EVNT_DEVICE_DETACHED;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18500 cportinfo->cport_link_lost_time = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18501 SATADBG1(SATA_DBG_EVENTS,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18502 sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18503 "Triggering port %d "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18504 "device detached event",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18505 saddr->cport);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18506 } else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18507 /* keep link lost event */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18508 cportinfo->cport_event_flags |=
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18509 SATA_EVNT_LINK_LOST;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18510 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18511 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18512 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18513 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18514 * We could change port state to disable/delay access to
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18515 * the attached device until the link is recovered.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18516 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18517 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18518 done:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18519 event_flags = cportinfo->cport_event_flags;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18520 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18521 if (event_flags != 0) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18522 mutex_enter(&sata_hba_inst->satahba_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18523 sata_hba_inst->satahba_event_flags |= SATA_EVNT_MAIN;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18524 mutex_exit(&sata_hba_inst->satahba_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18525 mutex_enter(&sata_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18526 sata_event_pending |= SATA_EVNT_MAIN;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18527 mutex_exit(&sata_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18528 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18529 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18530
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18531 /*
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18532 * Port Multiplier Port Link Events processing.
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18533 */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18534 static void
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18535 sata_process_pmport_link_events(sata_hba_inst_t *sata_hba_inst,
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18536 sata_address_t *saddr)
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18537 {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18538 sata_device_t sata_device;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18539 sata_pmport_info_t *pmportinfo = NULL;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18540 sata_drive_info_t *sdinfo = NULL;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18541 uint32_t event_flags;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18542 uint8_t cport = saddr->cport;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18543 uint8_t pmport = saddr->pmport;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18544 int rval;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18545
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18546 SATADBG2(SATA_DBG_EVENTS_PROC, sata_hba_inst,
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18547 "Processing port %d:%d link event(s)",
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18548 cport, pmport);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18549
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18550 pmportinfo = SATA_PMPORT_INFO(sata_hba_inst, cport, pmport);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18551 mutex_enter(&pmportinfo->pmport_mutex);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18552 event_flags = pmportinfo->pmport_event_flags;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18553
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18554 /* Reset event flags first */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18555 pmportinfo->pmport_event_flags &=
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18556 ~(SATA_EVNT_LINK_ESTABLISHED | SATA_EVNT_LINK_LOST);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18557
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18558 /* If the port is in SHUTDOWN or FAILED state, ignore link events. */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18559 if ((pmportinfo->pmport_state &
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18560 (SATA_PSTATE_SHUTDOWN | SATA_PSTATE_FAILED)) != 0) {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18561 mutex_exit(&pmportinfo->pmport_mutex);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18562 return;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18563 }
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18564
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18565 /*
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18566 * For the sanity sake get current port state.
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18567 * Set device address only. Other sata_device fields should be
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18568 * set by HBA driver.
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18569 */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18570 sata_device.satadev_rev = SATA_DEVICE_REV;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18571 sata_device.satadev_addr = *saddr;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18572 /*
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18573 * We have to exit mutex, because the HBA probe port function may
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18574 * block on its own mutex.
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18575 */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18576 mutex_exit(&SATA_PMPORT_MUTEX(sata_hba_inst, saddr->cport,
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18577 saddr->pmport));
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18578 rval = (*SATA_PROBE_PORT_FUNC(sata_hba_inst))
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18579 (SATA_DIP(sata_hba_inst), &sata_device);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18580 mutex_enter(&SATA_PMPORT_MUTEX(sata_hba_inst, saddr->cport,
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18581 saddr->pmport));
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18582 sata_update_pmport_info(sata_hba_inst, &sata_device);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18583 if (rval != SATA_SUCCESS) {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18584 /* Something went wrong? Fail the port */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18585 pmportinfo->pmport_state = SATA_PSTATE_FAILED;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18586 mutex_exit(&SATA_PMPORT_MUTEX(sata_hba_inst, saddr->cport,
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18587 saddr->pmport));
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18588 SATA_LOG_D((sata_hba_inst, CE_WARN,
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18589 "SATA port %d:%d probing failed",
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18590 saddr->cport, saddr->pmport));
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18591 /*
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18592 * We may want to release device info structure, but
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18593 * it is not necessary.
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18594 */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18595 return;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18596 } else {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18597 /* port probed successfully */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18598 pmportinfo->pmport_state |=
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18599 SATA_STATE_PROBED | SATA_STATE_READY;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18600 }
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18601 mutex_exit(&SATA_PMPORT_MUTEX(sata_hba_inst,
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18602 saddr->cport, saddr->pmport));
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18603 mutex_enter(&SATA_PMPORT_MUTEX(sata_hba_inst,
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18604 saddr->cport, saddr->pmport));
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18605 if (event_flags & SATA_EVNT_LINK_ESTABLISHED) {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18606
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18607 if ((sata_device.satadev_scr.sstatus &
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18608 SATA_PORT_DEVLINK_UP_MASK) != SATA_PORT_DEVLINK_UP) {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18609 /* Ignore event */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18610 SATADBG2(SATA_DBG_EVENTS_PROC, sata_hba_inst,
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18611 "Ignoring port %d:%d link established event - "
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18612 "link down",
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18613 saddr->cport, saddr->pmport);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18614 goto linklost;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18615 }
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18616
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18617 SATADBG2(SATA_DBG_EVENTS_PROC, sata_hba_inst,
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18618 "Processing port %d:%d link established event",
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18619 cport, pmport);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18620
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18621 /*
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18622 * For the sanity sake check if a device is attached - check
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18623 * return state of a port probing.
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18624 */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18625 if (sata_device.satadev_type != SATA_DTYPE_NONE &&
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18626 sata_device.satadev_type != SATA_DTYPE_PMULT) {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18627 /*
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18628 * HBA port probe indicated that there is a device
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18629 * attached. Check if the framework had device info
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18630 * structure attached for this device.
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18631 */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18632 if (pmportinfo->pmport_dev_type != SATA_DTYPE_NONE) {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18633 ASSERT(SATA_PMPORTINFO_DRV_INFO(pmportinfo) !=
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18634 NULL);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18635
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18636 sdinfo = SATA_PMPORTINFO_DRV_INFO(pmportinfo);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18637 if ((sdinfo->satadrv_type &
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18638 SATA_VALID_DEV_TYPE) != 0) {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18639 /*
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18640 * Dev info structure is present.
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18641 * If dev_type is set to known type in
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18642 * the framework's drive info struct
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18643 * then the device existed before and
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18644 * the link was probably lost
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18645 * momentarily - in such case
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18646 * we may want to check device
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18647 * identity.
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18648 * Identity check is not supported now.
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18649 *
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18650 * Link established event
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18651 * triggers device reset event.
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18652 */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18653 (SATA_PMPORTINFO_DRV_INFO(pmportinfo))->
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18654 satadrv_event_flags |=
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18655 SATA_EVNT_DEVICE_RESET;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18656 }
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18657 } else if (pmportinfo->pmport_dev_type ==
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18658 SATA_DTYPE_NONE) {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18659 /*
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18660 * We got new device attached! If HBA does not
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18661 * generate device attached events, trigger it
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18662 * here.
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18663 */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18664 if (!(SATA_FEATURES(sata_hba_inst) &
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18665 SATA_CTLF_HOTPLUG)) {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18666 pmportinfo->pmport_event_flags |=
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18667 SATA_EVNT_DEVICE_ATTACHED;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18668 }
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18669 }
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18670 /* Reset link lost timeout */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18671 pmportinfo->pmport_link_lost_time = 0;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18672 }
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18673 }
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18674 linklost:
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18675 if (event_flags & SATA_EVNT_LINK_LOST) {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18676 #ifdef SATA_DEBUG
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18677 if (pmportinfo->pmport_link_lost_time == 0) {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18678 SATADBG2(SATA_DBG_EVENTS_PROC, sata_hba_inst,
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18679 "Processing port %d:%d link lost event",
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18680 saddr->cport, saddr->pmport);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18681 }
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18682 #endif
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18683 if ((sata_device.satadev_scr.sstatus &
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18684 SATA_PORT_DEVLINK_UP_MASK) == SATA_PORT_DEVLINK_UP) {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18685 /* Ignore event */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18686 SATADBG2(SATA_DBG_EVENTS_PROC, sata_hba_inst,
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18687 "Ignoring port %d:%d link lost event - link is up",
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18688 saddr->cport, saddr->pmport);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18689 goto done;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18690 }
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18691 /*
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18692 * When HBA cannot generate device attached/detached events,
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18693 * we need to track link lost time and eventually generate
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18694 * device detach event.
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18695 */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18696 if (!(SATA_FEATURES(sata_hba_inst) & SATA_CTLF_HOTPLUG)) {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18697 /* We are tracking link lost time */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18698 if (pmportinfo->pmport_link_lost_time == 0) {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18699 /* save current time (lbolt value) */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18700 pmportinfo->pmport_link_lost_time =
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18701 ddi_get_lbolt();
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18702 /* just keep link lost event */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18703 pmportinfo->pmport_event_flags |=
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18704 SATA_EVNT_LINK_LOST;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18705 } else {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18706 clock_t cur_time = ddi_get_lbolt();
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18707 if ((cur_time -
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18708 pmportinfo->pmport_link_lost_time) >=
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18709 drv_usectohz(
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18710 SATA_EVNT_LINK_LOST_TIMEOUT)) {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18711 /* trigger device detach event */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18712 pmportinfo->pmport_event_flags |=
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18713 SATA_EVNT_DEVICE_DETACHED;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18714 pmportinfo->pmport_link_lost_time = 0;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18715 SATADBG2(SATA_DBG_EVENTS,
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18716 sata_hba_inst,
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18717 "Triggering port %d:%d "
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18718 "device detached event",
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18719 saddr->cport, saddr->pmport);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18720 } else {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18721 /* keep link lost event */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18722 pmportinfo->pmport_event_flags |=
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18723 SATA_EVNT_LINK_LOST;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18724 }
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18725 }
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18726 }
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18727 /*
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18728 * We could change port state to disable/delay access to
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18729 * the attached device until the link is recovered.
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18730 */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18731 }
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18732 done:
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18733 event_flags = pmportinfo->pmport_event_flags;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18734 mutex_exit(&SATA_PMPORT_MUTEX(sata_hba_inst, saddr->cport,
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18735 saddr->pmport));
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18736 if (event_flags != 0) {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18737 mutex_enter(&sata_hba_inst->satahba_mutex);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18738 sata_hba_inst->satahba_event_flags |= SATA_EVNT_MAIN;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18739 mutex_exit(&sata_hba_inst->satahba_mutex);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18740 mutex_enter(&sata_mutex);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18741 sata_event_pending |= SATA_EVNT_MAIN;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18742 mutex_exit(&sata_mutex);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18743 }
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18744 }
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18745
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18746 /*
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18747 * Device Detached Event processing.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18748 * 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
18749 * the device info structure is detached from the SATA port info structure
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18750 * and released.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18751 * Port status is updated.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18752 *
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18753 * NOTE: Port multiplier ports events are handled by
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18754 * sata_process_pmdevice_detached()
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18755 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18756 static void
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18757 sata_process_device_detached(sata_hba_inst_t *sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18758 sata_address_t *saddr)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18759 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18760 sata_cport_info_t *cportinfo;
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18761 sata_pmport_info_t *pmportinfo;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18762 sata_drive_info_t *sdevinfo;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18763 sata_device_t sata_device;
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18764 sata_address_t pmport_addr;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18765 char name[16];
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18766 uint8_t cport = saddr->cport;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18767 int npmport;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18768 int rval;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18769
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18770 SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18771 "Processing port %d device detached", saddr->cport);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18772
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18773 cportinfo = SATA_CPORT_INFO(sata_hba_inst, saddr->cport);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18774 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18775 /* Clear event flag */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18776 cportinfo->cport_event_flags &= ~SATA_EVNT_DEVICE_DETACHED;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18777
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18778 /* If the port is in SHUTDOWN or FAILED state, ignore detach event. */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18779 if ((cportinfo->cport_state &
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18780 (SATA_PSTATE_SHUTDOWN | SATA_PSTATE_FAILED)) != 0) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18781 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18782 cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18783 return;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18784 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18785 /* For sanity, re-probe the port */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18786 sata_device.satadev_rev = SATA_DEVICE_REV;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18787 sata_device.satadev_addr = *saddr;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18788
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18789 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18790 * We have to exit mutex, because the HBA probe port function may
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18791 * block on its own mutex.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18792 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18793 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18794 rval = (*SATA_PROBE_PORT_FUNC(sata_hba_inst))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18795 (SATA_DIP(sata_hba_inst), &sata_device);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18796 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18797 sata_update_port_info(sata_hba_inst, &sata_device);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18798 if (rval != SATA_SUCCESS) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18799 /* Something went wrong? Fail the port */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18800 cportinfo->cport_state = SATA_PSTATE_FAILED;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18801 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18802 cport_mutex);
3935
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
18803 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
18804 "SATA port %d probing failed",
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18805 saddr->cport));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18806 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18807 * We may want to release device info structure, but
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18808 * it is not necessary.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18809 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18810 return;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18811 } else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18812 /* port probed successfully */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18813 cportinfo->cport_state |= SATA_STATE_PROBED | SATA_STATE_READY;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18814 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18815 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18816 * Check if a device is still attached. For sanity, check also
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18817 * link status - if no link, there is no device.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18818 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18819 if ((sata_device.satadev_scr.sstatus & SATA_PORT_DEVLINK_UP_MASK) ==
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18820 SATA_PORT_DEVLINK_UP && sata_device.satadev_type !=
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18821 SATA_DTYPE_NONE) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18822 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18823 * Device is still attached - ignore detach event.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18824 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18825 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18826 cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18827 SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18828 "Ignoring detach - device still attached to port %d",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18829 sata_device.satadev_addr.cport);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18830 return;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18831 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18832 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18833 * We need to detach and release device info structure here
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
18834 */
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18835 if (cportinfo->cport_dev_type == SATA_DTYPE_PMULT) {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18836 /*
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18837 * A port-multiplier is removed.
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18838 *
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18839 * Calling sata_process_pmdevice_detached() does not work
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18840 * here. The port multiplier is gone, so we cannot probe
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18841 * sub-port any more and all pmult-related data structure must
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18842 * be de-allocated immediately. Following structure of every
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18843 * implemented sub-port behind the pmult are required to
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18844 * released.
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18845 *
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18846 * - attachment point
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18847 * - target node
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18848 * - sata_drive_info
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18849 * - sata_pmport_info
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18850 */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18851 for (npmport = 0; npmport < SATA_NUM_PMPORTS(sata_hba_inst,
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18852 cport); npmport ++) {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18853 SATADBG2(SATA_DBG_PMULT|SATA_DBG_EVENTS_PROC,
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18854 sata_hba_inst,
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18855 "Detaching target node at port %d:%d",
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18856 cport, npmport);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18857
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18858 mutex_exit(&SATA_CPORT_MUTEX(sata_hba_inst, cport));
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18859
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18860 /* Remove attachment point. */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18861 name[0] = '\0';
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18862 (void) sprintf(name, "%d.%d", cport, npmport);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18863 ddi_remove_minor_node(SATA_DIP(sata_hba_inst), name);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18864 sata_log(sata_hba_inst, CE_NOTE,
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18865 "Remove attachment point of port %d:%d",
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18866 cport, npmport);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18867
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18868 /* Remove target node */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18869 pmport_addr.cport = cport;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18870 pmport_addr.pmport = (uint8_t)npmport;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18871 pmport_addr.qual = SATA_ADDR_PMPORT;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18872 sata_remove_target_node(sata_hba_inst, &pmport_addr);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18873
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18874 mutex_enter(&SATA_CPORT_MUTEX(sata_hba_inst, cport));
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18875
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18876 /* Release sata_pmport_info & sata_drive_info. */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18877 pmportinfo = SATA_PMPORT_INFO(sata_hba_inst,
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18878 cport, npmport);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18879 ASSERT(pmportinfo != NULL);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18880
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18881 sdevinfo = SATA_PMPORTINFO_DRV_INFO(pmportinfo);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18882 if (sdevinfo != NULL) {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18883 (void) kmem_free((void *) sdevinfo,
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18884 sizeof (sata_drive_info_t));
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18885 }
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18886
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18887 /* Release sata_pmport_info at last */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18888 (void) kmem_free((void *) pmportinfo,
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18889 sizeof (sata_pmport_info_t));
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18890 }
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18891
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18892 /* Finally, release sata_pmult_info */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18893 (void) kmem_free((void *)
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18894 SATA_CPORTINFO_PMULT_INFO(cportinfo),
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18895 sizeof (sata_pmult_info_t));
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18896 SATA_CPORTINFO_PMULT_INFO(cportinfo) = NULL;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18897
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18898 sata_log(sata_hba_inst, CE_WARN,
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18899 "SATA port-multiplier detached at port %d", cport);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18900
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18901 cportinfo->cport_dev_type = SATA_DTYPE_NONE;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18902 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18903 saddr->cport)->cport_mutex);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18904 } else {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18905 if (SATA_CPORTINFO_DRV_INFO(cportinfo) != NULL) {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18906 sdevinfo = SATA_CPORTINFO_DRV_INFO(cportinfo);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18907 SATA_CPORTINFO_DRV_INFO(cportinfo) = NULL;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18908 (void) kmem_free((void *)sdevinfo,
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18909 sizeof (sata_drive_info_t));
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18910 }
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18911 sata_log(sata_hba_inst, CE_WARN,
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18912 "SATA device detached at port %d", cport);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18913
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18914 cportinfo->cport_dev_type = SATA_DTYPE_NONE;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18915 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18916 saddr->cport)->cport_mutex);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18917
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18918 /*
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18919 * Try to offline a device and remove target node
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18920 * if it still exists
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18921 */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18922 sata_remove_target_node(sata_hba_inst, saddr);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18923 }
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18924
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18925
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18926 /*
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18927 * Generate sysevent - EC_DR / ESC_DR_AP_STATE_CHANGE
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18928 * with the hint: SE_HINT_REMOVE
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18929 */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18930 sata_gen_sysevent(sata_hba_inst, saddr, SE_HINT_REMOVE);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18931 }
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18932
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18933 /*
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18934 * Port Multiplier Port Device Deattached Event processing.
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18935 *
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18936 * NOTE: No Mutex should be hold.
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18937 */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18938 static void
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18939 sata_process_pmdevice_detached(sata_hba_inst_t *sata_hba_inst,
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18940 sata_address_t *saddr)
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18941 {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18942 sata_pmport_info_t *pmportinfo;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18943 sata_drive_info_t *sdevinfo;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18944 sata_device_t sata_device;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18945 int rval;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18946 uint8_t cport, pmport;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18947
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18948 cport = saddr->cport;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18949 pmport = saddr->pmport;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18950
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18951 SATADBG2(SATA_DBG_EVENTS_PROC, sata_hba_inst,
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18952 "Processing port %d:%d device detached",
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18953 cport, pmport);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18954
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18955 pmportinfo = SATA_PMPORT_INFO(sata_hba_inst, cport, pmport);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18956 mutex_enter(&SATA_PMPORT_MUTEX(sata_hba_inst, cport, pmport));
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18957
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18958 /* Clear event flag */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18959 pmportinfo->pmport_event_flags &= ~SATA_EVNT_DEVICE_DETACHED;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18960
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18961 /* If the port is in SHUTDOWN or FAILED state, ignore detach event. */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18962 if ((pmportinfo->pmport_state &
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18963 (SATA_PSTATE_SHUTDOWN | SATA_PSTATE_FAILED)) != 0) {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18964 mutex_exit(&SATA_PMPORT_MUTEX(sata_hba_inst, cport, pmport));
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18965 return;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18966 }
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18967 /* For sanity, re-probe the port */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18968 sata_device.satadev_rev = SATA_DEVICE_REV;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18969 sata_device.satadev_addr = *saddr;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18970
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18971 /*
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18972 * We have to exit mutex, because the HBA probe port function may
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18973 * block on its own mutex.
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18974 */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18975 mutex_exit(&SATA_PMPORT_MUTEX(sata_hba_inst, cport, pmport));
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18976 rval = (*SATA_PROBE_PORT_FUNC(sata_hba_inst))
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18977 (SATA_DIP(sata_hba_inst), &sata_device);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18978 mutex_enter(&SATA_PMPORT_MUTEX(sata_hba_inst, cport, pmport));
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18979 sata_update_pmport_info(sata_hba_inst, &sata_device);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18980 if (rval != SATA_SUCCESS) {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18981 /* Something went wrong? Fail the port */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18982 pmportinfo->pmport_state = SATA_PSTATE_FAILED;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18983 mutex_exit(&SATA_PMPORT_MUTEX(sata_hba_inst, cport, pmport));
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18984 SATA_LOG_D((sata_hba_inst, CE_WARN,
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18985 "SATA port %d:%d probing failed",
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18986 saddr->pmport));
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18987 /*
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18988 * We may want to release device info structure, but
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18989 * it is not necessary.
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18990 */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18991 return;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18992 } else {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18993 /* port probed successfully */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18994 pmportinfo->pmport_state |=
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18995 SATA_STATE_PROBED | SATA_STATE_READY;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18996 }
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18997 /*
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18998 * Check if a device is still attached. For sanity, check also
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
18999 * link status - if no link, there is no device.
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19000 */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19001 if ((sata_device.satadev_scr.sstatus & SATA_PORT_DEVLINK_UP_MASK) ==
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19002 SATA_PORT_DEVLINK_UP && sata_device.satadev_type !=
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19003 SATA_DTYPE_NONE) {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19004 /*
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19005 * Device is still attached - ignore detach event.
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19006 */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19007 mutex_exit(&SATA_PMPORT_MUTEX(sata_hba_inst, cport, pmport));
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19008 SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19009 "Ignoring detach - device still attached to port %d",
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19010 sata_device.satadev_addr.pmport);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19011 return;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19012 }
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19013 /*
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19014 * We need to detach and release device info structure here
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19015 */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19016 if (SATA_PMPORTINFO_DRV_INFO(pmportinfo) != NULL) {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19017 sdevinfo = SATA_PMPORTINFO_DRV_INFO(pmportinfo);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19018 SATA_PMPORTINFO_DRV_INFO(pmportinfo) = NULL;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
19019 (void) kmem_free((void *)sdevinfo,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
19020 sizeof (sata_drive_info_t));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
19021 }
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19022 pmportinfo->pmport_dev_type = SATA_DTYPE_NONE;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
19023 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
19024 * Device cannot be reached anymore, even if the target node may be
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
19025 * still present.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
19026 */
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19027 mutex_exit(&SATA_PMPORT_MUTEX(sata_hba_inst, cport, pmport));
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
19028
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
19029 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
19030 * 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
19031 */
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19032 sata_remove_target_node(sata_hba_inst, saddr);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19033
1529
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
19034 /*
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
19035 * 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
19036 * with the hint: SE_HINT_REMOVE
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
19037 */
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
19038 sata_gen_sysevent(sata_hba_inst, saddr, SE_HINT_REMOVE);
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
19039 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
19040
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
19041
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
19042 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
19043 * Device Attached Event processing.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
19044 * 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
19045 * 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
19046 * structure.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
19047 *
2960
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
19048 * 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
19049 * 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
19050 * 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
19051 * (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
19052 *
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
19053 * This function cannot be called in interrupt context (it may sleep).
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
19054 *
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19055 * NOTE: Port multiplier ports events are handled by
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19056 * sata_process_pmdevice_attached()
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
19057 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
19058 static void
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
19059 sata_process_device_attached(sata_hba_inst_t *sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
19060 sata_address_t *saddr)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
19061 {
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19062 sata_cport_info_t *cportinfo = NULL;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19063 sata_drive_info_t *sdevinfo = NULL;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19064 sata_pmult_info_t *pmultinfo = NULL;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19065 sata_pmport_info_t *pmportinfo = NULL;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
19066 sata_device_t sata_device;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
19067 dev_info_t *tdip;
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19068 uint32_t event_flags = 0, pmult_event_flags = 0;
1529
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
19069 int rval;
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19070 int npmport;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
19071
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
19072 SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
19073 "Processing port %d device attached", saddr->cport);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
19074
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
19075 cportinfo = SATA_CPORT_INFO(sata_hba_inst, saddr->cport);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
19076 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
19077
3935
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
19078 /* Clear attach event flag first */
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
19079 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
19080
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
19081 /* If the port is in SHUTDOWN or FAILED state, ignore event. */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
19082 if ((cportinfo->cport_state &
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
19083 (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
19084 cportinfo->cport_dev_attach_time = 0;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
19085 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
19086 cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
19087 return;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
19088 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
19089
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
19090 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
19091 * 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
19092 * 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
19093 * 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
19094 * Arbitrarily release device info structure.
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
19095 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
19096 if (SATA_CPORTINFO_DRV_INFO(cportinfo) != NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
19097 sdevinfo = SATA_CPORTINFO_DRV_INFO(cportinfo);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
19098 SATA_CPORTINFO_DRV_INFO(cportinfo) = NULL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
19099 (void) kmem_free((void *)sdevinfo,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
19100 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
19101 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
19102 "Arbitrarily detaching old device info.", NULL);
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
19103 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
19104 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
19105
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
19106 /* For sanity, re-probe the port */
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
19107 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
19108 sata_device.satadev_addr = *saddr;
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
19109
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
19110 /*
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
19111 * 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
19112 * block on its own mutex.
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
19113 */
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
19114 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
19115 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
19116 (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
19117 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
19118 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
19119 if (rval != SATA_SUCCESS) {
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
19120 /* Something went wrong? Fail the port */
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
19121 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
19122 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
19123 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
19124 cport_mutex);
3935
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
19125 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
19126 "SATA port %d probing failed",
1529
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
19127 saddr->cport));
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
19128 return;
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
19129 } else {
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
19130 /* port probed successfully */
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
19131 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
19132 }
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
19133 /*
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
19134 * 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
19135 * 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
19136 */
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
19137 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
19138 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
19139 SATA_DTYPE_NONE) {
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
19140 /*
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
19141 * No device - ignore attach event.
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
19142 */
2960
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
19143 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
19144 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
19145 cport_mutex);
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
19146 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
19147 "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
19148 sata_device.satadev_addr.cport);
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
19149 return;
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
19150 }
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
19151
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
19152 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
19153 /*
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
19154 * 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
19155 * with the hint: SE_HINT_INSERT
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
19156 */
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
19157 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
19158
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
19159 /*
3935
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
19160 * 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
19161 * info structure and determination of the device type.
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
19162 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
19163 sata_device.satadev_addr = *saddr;
3935
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
19164 (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
19165 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
19166
3935
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
19167 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
19168 cport_mutex);
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
19169 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
19170 (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
19171 /* 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
19172 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
19173 /*
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
19174 * 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
19175 * 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
19176 */
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
19177 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
19178 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
19179 /*
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
19180 * 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
19181 * 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
19182 */
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
19183 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
19184 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
19185 drv_usectohz(
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
19186 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
19187 /* 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
19188 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
19189 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
19190 } else {
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
19191 /* 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
19192 cportinfo->cport_dev_attach_time = 0;
3935
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
19193 sata_log(sata_hba_inst,
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
19194 CE_WARN,
6539
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
19195 "Could not identify SATA device "
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
19196 "at port %d",
3935
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
19197 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
19198 }
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
19199 } else {
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
19200 /*
3935
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
19201 * Start tracking time for device
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
19202 * identification.
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
19203 * 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
19204 */
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
19205 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
19206 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
19207 /* 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
19208 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
19209 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
19210 }
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19211 } else if (cportinfo->cport_dev_type == SATA_DTYPE_PMULT) {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19212 cportinfo->cport_dev_attach_time = 0;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19213 sata_log(sata_hba_inst, CE_NOTE,
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19214 "SATA port-multiplier detected at port %d",
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19215 saddr->cport);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19216
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19217 if (SATA_CPORTINFO_PMULT_INFO(cportinfo) != NULL) {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19218 /* Log the info of new port multiplier */
10663
4d59e1faf654 6881565 sata hba interfaces need to keep backward compatibility
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10427
diff changeset
19219 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
4d59e1faf654 6881565 sata hba interfaces need to keep backward compatibility
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10427
diff changeset
19220 saddr->cport)->cport_mutex);
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19221 sata_show_pmult_info(sata_hba_inst,
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19222 &sata_device);
10663
4d59e1faf654 6881565 sata hba interfaces need to keep backward compatibility
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10427
diff changeset
19223 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst,
4d59e1faf654 6881565 sata hba interfaces need to keep backward compatibility
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10427
diff changeset
19224 saddr->cport)->cport_mutex);
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19225 }
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19226
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19227 ASSERT(SATA_CPORTINFO_PMULT_INFO(cportinfo) != NULL);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19228 pmultinfo = SATA_CPORTINFO_PMULT_INFO(cportinfo);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19229 for (npmport = 0; npmport <
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19230 pmultinfo->pmult_num_dev_ports; npmport++) {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19231 pmportinfo = SATA_PMPORT_INFO(sata_hba_inst,
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19232 saddr->cport, npmport);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19233 ASSERT(pmportinfo != NULL);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19234
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19235 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19236 saddr->cport)->cport_mutex);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19237 mutex_enter(&pmportinfo->pmport_mutex);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19238 /* Marked all pmports with link events. */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19239 pmportinfo->pmport_event_flags =
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19240 SATA_EVNT_LINK_ESTABLISHED;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19241 pmult_event_flags |=
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19242 pmportinfo->pmport_event_flags;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19243 mutex_exit(&pmportinfo->pmport_mutex);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19244 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst,
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19245 saddr->cport)->cport_mutex);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19246 }
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19247 /* Auto-online is not available for PMult now. */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19248
2960
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
19249 } else {
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
19250 /*
5832
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
19251 * If device was successfully attached, the subsequent
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
19252 * action depends on a state of the
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
19253 * sata_auto_online variable. If it is set to zero.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
19254 * an explicit 'configure' command will be needed to
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
19255 * configure it. If its value is non-zero, we will
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
19256 * attempt to online (configure) the device.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
19257 * 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
19258 * 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
19259 */
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
19260 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
19261 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
19262 "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
19263
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
19264 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
19265 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
19266
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
19267 /* Log device info data */
3935
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
19268 new_sdinfo = *(SATA_CPORTINFO_DRV_INFO(
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
19269 cportinfo));
2960
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
19270 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
19271 &new_sdinfo);
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
19272 }
3935
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
19273
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
19274 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
19275 saddr->cport)->cport_mutex);
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
19276
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
19277 /*
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
19278 * 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
19279 * 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
19280 * 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
19281 * device was detached.
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
19282 */
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
19283 tdip = sata_get_target_dip(SATA_DIP(sata_hba_inst),
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19284 saddr->cport, saddr->pmport);
3935
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
19285 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
19286 saddr->cport)->cport_mutex);
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
19287 if (tdip != NULL) {
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
19288
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
19289 #ifdef SATA_DEBUG
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
19290 if ((cportinfo->cport_event_flags &
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
19291 SATA_EVNT_TARGET_NODE_CLEANUP) == 0)
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
19292 sata_log(sata_hba_inst, CE_WARN,
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
19293 "sata_process_device_attached: "
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
19294 "old device target node exists!");
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
19295 #endif
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
19296 /*
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
19297 * target node exists - try to unconfigure
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
19298 * device and remove the node.
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
19299 */
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
19300 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
19301 saddr->cport)->cport_mutex);
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
19302 rval = ndi_devi_offline(tdip,
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
19303 NDI_DEVI_REMOVE);
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
19304 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
19305 saddr->cport)->cport_mutex);
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
19306
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
19307 if (rval == NDI_SUCCESS) {
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
19308 cportinfo->cport_event_flags &=
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
19309 ~SATA_EVNT_TARGET_NODE_CLEANUP;
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
19310 cportinfo->cport_tgtnode_clean = B_TRUE;
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
19311 } else {
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
19312 /*
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
19313 * PROBLEM - the target node remained
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
19314 * and it belongs to a previously
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
19315 * attached device.
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
19316 * This happens when the file was open
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
19317 * or the node was waiting for
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
19318 * resources at the time the
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
19319 * associated device was removed.
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
19320 * Instruct event daemon to retry the
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
19321 * cleanup later.
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
19322 */
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
19323 sata_log(sata_hba_inst,
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
19324 CE_WARN,
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
19325 "Application(s) accessing "
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
19326 "previously attached SATA "
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
19327 "device have to release "
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
19328 "it before newly inserted "
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
19329 "device can be made accessible.",
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
19330 saddr->cport);
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
19331 cportinfo->cport_event_flags |=
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
19332 SATA_EVNT_TARGET_NODE_CLEANUP;
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
19333 cportinfo->cport_tgtnode_clean =
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
19334 B_FALSE;
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
19335 }
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
19336 }
5832
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
19337 if (sata_auto_online != 0) {
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
19338 cportinfo->cport_event_flags |=
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
19339 SATA_EVNT_AUTOONLINE_DEVICE;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
19340 }
3935
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
19341
2960
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
19342 }
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
19343 } else {
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
19344 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
19345 }
3935
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
19346
2960
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
19347 event_flags = cportinfo->cport_event_flags;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
19348 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19349 if (event_flags != 0 || pmult_event_flags != 0) {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19350 mutex_enter(&sata_hba_inst->satahba_mutex);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19351 sata_hba_inst->satahba_event_flags |= SATA_EVNT_MAIN;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19352 mutex_exit(&sata_hba_inst->satahba_mutex);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19353 mutex_enter(&sata_mutex);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19354 sata_event_pending |= SATA_EVNT_MAIN;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19355 mutex_exit(&sata_mutex);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19356 }
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19357 }
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19358
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19359 /*
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19360 * Port Multiplier Port Device Attached Event processing.
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19361 *
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19362 * NOTE: No Mutex should be hold.
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19363 */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19364 static void
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19365 sata_process_pmdevice_attached(sata_hba_inst_t *sata_hba_inst,
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19366 sata_address_t *saddr)
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19367 {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19368 sata_pmport_info_t *pmportinfo;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19369 sata_drive_info_t *sdinfo;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19370 sata_device_t sata_device;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19371 dev_info_t *tdip;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19372 uint32_t event_flags;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19373 uint8_t cport = saddr->cport;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19374 uint8_t pmport = saddr->pmport;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19375 int rval;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19376
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19377 SATADBG2(SATA_DBG_EVENTS_PROC, sata_hba_inst,
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19378 "Processing port %d:%d device attached", cport, pmport);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19379
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19380 pmportinfo = SATA_PMPORT_INFO(sata_hba_inst, cport, pmport);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19381
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19382 mutex_enter(&pmportinfo->pmport_mutex);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19383
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19384 /* Clear attach event flag first */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19385 pmportinfo->pmport_event_flags &= ~SATA_EVNT_DEVICE_ATTACHED;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19386
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19387 /* If the port is in SHUTDOWN or FAILED state, ignore event. */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19388 if ((pmportinfo->pmport_state &
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19389 (SATA_PSTATE_SHUTDOWN | SATA_PSTATE_FAILED)) != 0) {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19390 pmportinfo->pmport_dev_attach_time = 0;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19391 mutex_exit(&pmportinfo->pmport_mutex);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19392 return;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19393 }
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19394
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19395 /*
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19396 * If the sata_drive_info structure is found attached to the port info,
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19397 * despite the fact the device was removed and now it is re-attached,
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19398 * the old drive info structure was not removed.
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19399 * Arbitrarily release device info structure.
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19400 */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19401 if (SATA_PMPORTINFO_DRV_INFO(pmportinfo) != NULL) {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19402 sdinfo = SATA_PMPORTINFO_DRV_INFO(pmportinfo);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19403 SATA_PMPORTINFO_DRV_INFO(pmportinfo) = NULL;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19404 (void) kmem_free((void *)sdinfo,
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19405 sizeof (sata_drive_info_t));
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19406 SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19407 "Arbitrarily detaching old device info.", NULL);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19408 }
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19409 pmportinfo->pmport_dev_type = SATA_DTYPE_NONE;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19410
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19411 /* For sanity, re-probe the port */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19412 sata_device.satadev_rev = SATA_DEVICE_REV;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19413 sata_device.satadev_addr = *saddr;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19414
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19415 /*
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19416 * We have to exit mutex, because the HBA probe port function may
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19417 * block on its own mutex.
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19418 */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19419 mutex_exit(&pmportinfo->pmport_mutex);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19420 rval = (*SATA_PROBE_PORT_FUNC(sata_hba_inst))
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19421 (SATA_DIP(sata_hba_inst), &sata_device);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19422 mutex_enter(&pmportinfo->pmport_mutex);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19423
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19424 sata_update_pmport_info(sata_hba_inst, &sata_device);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19425 if (rval != SATA_SUCCESS) {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19426 /* Something went wrong? Fail the port */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19427 pmportinfo->pmport_state = SATA_PSTATE_FAILED;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19428 pmportinfo->pmport_dev_attach_time = 0;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19429 mutex_exit(&pmportinfo->pmport_mutex);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19430 SATA_LOG_D((sata_hba_inst, CE_WARN,
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19431 "SATA port %d:%d probing failed", cport, pmport));
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19432 return;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19433 } else {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19434 /* pmport probed successfully */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19435 pmportinfo->pmport_state |=
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19436 SATA_STATE_PROBED | SATA_STATE_READY;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19437 }
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19438 /*
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19439 * Check if a device is still attached. For sanity, check also
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19440 * link status - if no link, there is no device.
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19441 */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19442 if ((sata_device.satadev_scr.sstatus & SATA_PORT_DEVLINK_UP_MASK) !=
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19443 SATA_PORT_DEVLINK_UP || sata_device.satadev_type ==
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19444 SATA_DTYPE_NONE) {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19445 /*
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19446 * No device - ignore attach event.
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19447 */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19448 pmportinfo->pmport_dev_attach_time = 0;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19449 mutex_exit(&pmportinfo->pmport_mutex);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19450 SATADBG2(SATA_DBG_EVENTS_PROC, sata_hba_inst,
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19451 "Ignoring attach - no device connected to port %d:%d",
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19452 cport, pmport);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19453 return;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19454 }
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19455
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19456 mutex_exit(&pmportinfo->pmport_mutex);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19457 /*
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19458 * Generate sysevent - EC_DR / ESC_DR_AP_STATE_CHANGE
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19459 * with the hint: SE_HINT_INSERT
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19460 */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19461 sata_gen_sysevent(sata_hba_inst, saddr, SE_HINT_INSERT);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19462
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19463 /*
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19464 * Port reprobing will take care of the creation of the device
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19465 * info structure and determination of the device type.
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19466 */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19467 sata_device.satadev_addr = *saddr;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19468 (void) sata_reprobe_port(sata_hba_inst, &sata_device,
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19469 SATA_DEV_IDENTIFY_NORETRY);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19470
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19471 mutex_enter(&pmportinfo->pmport_mutex);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19472 if ((pmportinfo->pmport_state & SATA_STATE_READY) &&
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19473 (pmportinfo->pmport_dev_type != SATA_DTYPE_NONE)) {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19474 /* Some device is attached to the port */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19475 if (pmportinfo->pmport_dev_type == SATA_DTYPE_UNKNOWN) {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19476 /*
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19477 * A device was not successfully attached.
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19478 * Track retry time for device identification.
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19479 */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19480 if (pmportinfo->pmport_dev_attach_time != 0) {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19481 clock_t cur_time = ddi_get_lbolt();
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19482 /*
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19483 * If the retry time limit was not exceeded,
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19484 * reinstate attach event.
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19485 */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19486 if ((cur_time -
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19487 pmportinfo->pmport_dev_attach_time) <
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19488 drv_usectohz(
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19489 SATA_DEV_IDENTIFY_TIMEOUT)) {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19490 /* OK, restore attach event */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19491 pmportinfo->pmport_event_flags |=
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19492 SATA_EVNT_DEVICE_ATTACHED;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19493 } else {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19494 /* Timeout - cannot identify device */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19495 pmportinfo->pmport_dev_attach_time = 0;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19496 sata_log(sata_hba_inst, CE_WARN,
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19497 "Could not identify SATA device "
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19498 "at port %d:%d",
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19499 cport, pmport);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19500 }
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19501 } else {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19502 /*
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19503 * Start tracking time for device
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19504 * identification.
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19505 * Save current time (lbolt value).
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19506 */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19507 pmportinfo->pmport_dev_attach_time =
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19508 ddi_get_lbolt();
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19509 /* Restore attach event */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19510 pmportinfo->pmport_event_flags |=
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19511 SATA_EVNT_DEVICE_ATTACHED;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19512 }
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19513 } else {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19514 /*
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19515 * If device was successfully attached, the subsequent
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19516 * action depends on a state of the
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19517 * sata_auto_online variable. If it is set to zero.
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19518 * an explicit 'configure' command will be needed to
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19519 * configure it. If its value is non-zero, we will
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19520 * attempt to online (configure) the device.
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19521 * First, log the message indicating that a device
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19522 * was attached.
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19523 */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19524 pmportinfo->pmport_dev_attach_time = 0;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19525 sata_log(sata_hba_inst, CE_WARN,
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19526 "SATA device detected at port %d:%d",
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19527 cport, pmport);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19528
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19529 if (SATA_PMPORTINFO_DRV_INFO(pmportinfo) != NULL) {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19530 sata_drive_info_t new_sdinfo;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19531
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19532 /* Log device info data */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19533 new_sdinfo = *(SATA_PMPORTINFO_DRV_INFO(
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19534 pmportinfo));
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19535 sata_show_drive_info(sata_hba_inst,
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19536 &new_sdinfo);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19537 }
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19538
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19539 mutex_exit(&pmportinfo->pmport_mutex);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19540
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19541 /*
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19542 * Make sure that there is no target node for that
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19543 * device. If so, release it. It should not happen,
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19544 * unless we had problem removing the node when
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19545 * device was detached.
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19546 */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19547 tdip = sata_get_target_dip(SATA_DIP(sata_hba_inst),
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19548 saddr->cport, saddr->pmport);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19549 mutex_enter(&pmportinfo->pmport_mutex);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19550 if (tdip != NULL) {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19551
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19552 #ifdef SATA_DEBUG
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19553 if ((pmportinfo->pmport_event_flags &
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19554 SATA_EVNT_TARGET_NODE_CLEANUP) == 0)
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19555 sata_log(sata_hba_inst, CE_WARN,
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19556 "sata_process_device_attached: "
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19557 "old device target node exists!");
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19558 #endif
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19559 /*
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19560 * target node exists - try to unconfigure
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19561 * device and remove the node.
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19562 */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19563 mutex_exit(&pmportinfo->pmport_mutex);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19564 rval = ndi_devi_offline(tdip,
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19565 NDI_DEVI_REMOVE);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19566 mutex_enter(&pmportinfo->pmport_mutex);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19567
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19568 if (rval == NDI_SUCCESS) {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19569 pmportinfo->pmport_event_flags &=
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19570 ~SATA_EVNT_TARGET_NODE_CLEANUP;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19571 pmportinfo->pmport_tgtnode_clean =
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19572 B_TRUE;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19573 } else {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19574 /*
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19575 * PROBLEM - the target node remained
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19576 * and it belongs to a previously
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19577 * attached device.
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19578 * This happens when the file was open
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19579 * or the node was waiting for
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19580 * resources at the time the
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19581 * associated device was removed.
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19582 * Instruct event daemon to retry the
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19583 * cleanup later.
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19584 */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19585 sata_log(sata_hba_inst,
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19586 CE_WARN,
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19587 "Application(s) accessing "
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19588 "previously attached SATA "
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19589 "device have to release "
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19590 "it before newly inserted "
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19591 "device can be made accessible."
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19592 "at port %d:%d",
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19593 cport, pmport);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19594 pmportinfo->pmport_event_flags |=
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19595 SATA_EVNT_TARGET_NODE_CLEANUP;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19596 pmportinfo->pmport_tgtnode_clean =
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19597 B_FALSE;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19598 }
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19599 }
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19600 if (sata_auto_online != 0) {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19601 pmportinfo->pmport_event_flags |=
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19602 SATA_EVNT_AUTOONLINE_DEVICE;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19603 }
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19604
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19605 }
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19606 } else {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19607 pmportinfo->pmport_dev_attach_time = 0;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19608 }
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19609
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19610 event_flags = pmportinfo->pmport_event_flags;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19611 mutex_exit(&pmportinfo->pmport_mutex);
2960
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
19612 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
19613 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
19614 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
19615 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
19616 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
19617 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
19618 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
19619 }
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19620
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19621 /* clear the reset_in_progress events */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19622 if (SATA_PMPORTINFO_DRV_INFO(pmportinfo) != NULL) {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19623 if (pmportinfo->pmport_dev_type & SATA_VALID_DEV_TYPE) {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19624 /* must clear flags on cport */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19625 sata_pmult_info_t *pminfo =
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19626 SATA_PMULT_INFO(sata_hba_inst,
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19627 saddr->cport);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19628 pminfo->pmult_event_flags |=
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19629 SATA_EVNT_CLEAR_DEVICE_RESET;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19630 }
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19631 }
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19632 }
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
19633
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
19634 /*
3935
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
19635 * Device Target Node Cleanup Event processing.
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
19636 * 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
19637 * 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
19638 * 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
19639 * 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
19640 *
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
19641 * 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
19642 *
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
19643 * 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
19644 */
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
19645 static void
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
19646 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
19647 sata_address_t *saddr)
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
19648 {
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
19649 sata_cport_info_t *cportinfo;
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
19650 dev_info_t *tdip;
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
19651
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
19652 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
19653 "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
19654
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
19655 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
19656
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
19657 /*
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
19658 * 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
19659 * 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
19660 */
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19661 tdip = sata_get_target_dip(SATA_DIP(sata_hba_inst), saddr->cport,
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19662 saddr->pmport);
3935
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
19663 if (tdip != NULL) {
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
19664 /*
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
19665 * 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
19666 * a removed device.
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
19667 */
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
19668 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
19669 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
19670 "sata_process_target_node_cleanup: "
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
19671 "old device target node exists!", NULL);
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
19672 /*
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
19673 * Unconfigure and remove the target node
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
19674 */
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
19675 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
19676 NDI_SUCCESS) {
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
19677 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
19678 saddr->cport)->cport_mutex);
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
19679 cportinfo->cport_event_flags &=
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
19680 ~SATA_EVNT_TARGET_NODE_CLEANUP;
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
19681 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
19682 saddr->cport)->cport_mutex);
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
19683 return;
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
19684 }
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
19685 /*
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
19686 * Event daemon will retry the cleanup later.
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
19687 */
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
19688 mutex_enter(&sata_hba_inst->satahba_mutex);
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
19689 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
19690 mutex_exit(&sata_hba_inst->satahba_mutex);
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
19691 mutex_enter(&sata_mutex);
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
19692 sata_event_pending |= SATA_EVNT_MAIN;
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
19693 mutex_exit(&sata_mutex);
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
19694 }
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
19695 } else {
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19696 if (saddr->qual == SATA_ADDR_CPORT ||
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19697 saddr->qual == SATA_ADDR_DCPORT) {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19698 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst,
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19699 saddr->cport)->cport_mutex);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19700 cportinfo->cport_event_flags &=
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19701 ~SATA_EVNT_TARGET_NODE_CLEANUP;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19702 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19703 saddr->cport)->cport_mutex);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19704 } else {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19705 /* sanity check */
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19706 if (SATA_CPORT_DEV_TYPE(sata_hba_inst, saddr->cport) !=
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19707 SATA_DTYPE_PMULT || SATA_PMULT_INFO(sata_hba_inst,
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19708 saddr->cport) == NULL)
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19709 return;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19710 if (SATA_PMPORT_INFO(sata_hba_inst, saddr->cport,
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19711 saddr->pmport) == NULL)
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19712 return;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19713
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19714 mutex_enter(&SATA_PMPORT_INFO(sata_hba_inst,
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19715 saddr->cport, saddr->pmport)->pmport_mutex);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19716 SATA_PMPORT_INFO(sata_hba_inst, saddr->cport,
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19717 saddr->pmport)->pmport_event_flags &=
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19718 ~SATA_EVNT_TARGET_NODE_CLEANUP;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19719 mutex_exit(&SATA_PMPORT_INFO(sata_hba_inst,
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19720 saddr->cport, saddr->pmport)->pmport_mutex);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19721 }
3935
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
19722 }
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
19723 }
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
19724
5832
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
19725 /*
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
19726 * Device AutoOnline Event processing.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
19727 * 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
19728 * 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
19729 * 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
19730 * so that event daemon may re-run this function later.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
19731 *
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
19732 * This function cannot be called in interrupt context (it may sleep).
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
19733 *
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
19734 * NOTE: Processes cport events only, not port multiplier ports.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
19735 */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
19736 static void
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
19737 sata_process_device_autoonline(sata_hba_inst_t *sata_hba_inst,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
19738 sata_address_t *saddr)
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
19739 {
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
19740 sata_cport_info_t *cportinfo;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
19741 sata_drive_info_t *sdinfo;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
19742 sata_device_t sata_device;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
19743 dev_info_t *tdip;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
19744
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
19745 SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
19746 "Processing port %d attached device auto-onlining", saddr->cport);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
19747
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
19748 cportinfo = SATA_CPORT_INFO(sata_hba_inst, saddr->cport);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
19749
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
19750 /*
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
19751 * Check if device is present and recognized. If not, reset event.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
19752 */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
19753 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
19754 if ((cportinfo->cport_dev_type & SATA_VALID_DEV_TYPE) == 0) {
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
19755 /* Nothing to online */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
19756 cportinfo->cport_event_flags &= ~SATA_EVNT_AUTOONLINE_DEVICE;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
19757 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
19758 saddr->cport)->cport_mutex);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
19759 return;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
19760 }
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
19761 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
19762
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
19763 /*
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
19764 * 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
19765 * DEVI_DEVICE_REMOVED state. If so, abort onlining but keep
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
19766 * the event for later processing.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
19767 */
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19768 tdip = sata_get_target_dip(SATA_DIP(sata_hba_inst), saddr->cport,
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19769 saddr->pmport);
5832
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
19770 if (tdip != NULL) {
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
19771 /*
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
19772 * target node exists - check if it is target node of
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
19773 * a removed device.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
19774 */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
19775 if (sata_check_device_removed(tdip) == B_TRUE) {
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
19776 SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
19777 "sata_process_device_autoonline: "
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
19778 "old device target node exists!", NULL);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
19779 /*
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
19780 * Event daemon will retry device onlining later.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
19781 */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
19782 mutex_enter(&sata_hba_inst->satahba_mutex);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
19783 sata_hba_inst->satahba_event_flags |= SATA_EVNT_MAIN;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
19784 mutex_exit(&sata_hba_inst->satahba_mutex);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
19785 mutex_enter(&sata_mutex);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
19786 sata_event_pending |= SATA_EVNT_MAIN;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
19787 mutex_exit(&sata_mutex);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
19788 return;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
19789 }
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
19790 /*
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
19791 * If the target node is not in the 'removed" state, assume
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
19792 * 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
19793 * but reset the event.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
19794 */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
19795 } else {
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
19796
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
19797 /*
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
19798 * Try to online the device
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
19799 * If there is any reset-related event, remove it. We are
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
19800 * configuring the device and no state restoring is needed.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
19801 */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
19802 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
19803 saddr->cport)->cport_mutex);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
19804 sata_device.satadev_addr = *saddr;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
19805 if (saddr->qual == SATA_ADDR_CPORT)
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
19806 sata_device.satadev_addr.qual = SATA_ADDR_DCPORT;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
19807 else
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
19808 sata_device.satadev_addr.qual = SATA_ADDR_DPMPORT;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
19809 sdinfo = sata_get_device_info(sata_hba_inst, &sata_device);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
19810 if (sdinfo != NULL) {
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
19811 if (sdinfo->satadrv_event_flags &
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
19812 (SATA_EVNT_DEVICE_RESET |
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
19813 SATA_EVNT_INPROC_DEVICE_RESET))
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
19814 sdinfo->satadrv_event_flags = 0;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
19815 sdinfo->satadrv_event_flags |=
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
19816 SATA_EVNT_CLEAR_DEVICE_RESET;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
19817
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
19818 /* Need to create a new target node. */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
19819 cportinfo->cport_tgtnode_clean = B_TRUE;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
19820 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
19821 saddr->cport)->cport_mutex);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
19822 tdip = sata_create_target_node(SATA_DIP(sata_hba_inst),
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
19823 sata_hba_inst, &sata_device.satadev_addr);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
19824 if (tdip == NULL) {
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
19825 /*
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
19826 * Configure (onlining) failed.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
19827 * We will NOT retry
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
19828 */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
19829 SATA_LOG_D((sata_hba_inst, CE_WARN,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
19830 "sata_process_device_autoonline: "
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
19831 "configuring SATA device at port %d failed",
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
19832 saddr->cport));
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
19833 }
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
19834 } else {
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
19835 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
19836 saddr->cport)->cport_mutex);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
19837 }
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
19838
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
19839 }
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
19840 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
19841 cportinfo->cport_event_flags &= ~SATA_EVNT_AUTOONLINE_DEVICE;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
19842 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
19843 saddr->cport)->cport_mutex);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
19844 }
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
19845
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
19846
1529
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
19847 static void
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
19848 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
19849 int hint)
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
19850 {
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
19851 char ap[MAXPATHLEN];
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
19852 nvlist_t *ev_attr_list = NULL;
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
19853 int err;
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
19854
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
19855 /* Allocate and build sysevent attribute list */
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
19856 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
19857 if (err != 0) {
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
19858 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
19859 "sata_gen_sysevent: "
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
19860 "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
19861 return;
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
19862 }
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
19863 /* Add hint attribute */
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
19864 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
19865 if (err != 0) {
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
19866 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
19867 "sata_gen_sysevent: "
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
19868 "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
19869 nvlist_free(ev_attr_list);
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
19870 return;
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
19871 }
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
19872 /*
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
19873 * Add AP attribute.
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
19874 * 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
19875 * a target number.
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
19876 */
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
19877 (void) snprintf(ap, MAXPATHLEN, "/devices");
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
19878 (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
19879 (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
19880 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
19881
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
19882 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
19883 if (err != 0) {
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
19884 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
19885 "sata_gen_sysevent: "
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
19886 "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
19887 nvlist_free(ev_attr_list);
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
19888 return;
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
19889 }
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
19890
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
19891 /* Generate/log sysevent */
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
19892 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
19893 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
19894 if (err != DDI_SUCCESS) {
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
19895 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
19896 "sata_gen_sysevent: "
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
19897 "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
19898 }
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
19899
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
19900 nvlist_free(ev_attr_list);
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
19901 }
1675
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
19902
3935
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
19903
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
19904
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
19905
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
19906 /*
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
19907 * 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
19908 */
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
19909 static void
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
19910 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
19911 {
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
19912 int circ;
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
19913
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
19914 ASSERT(tdip != NULL);
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
19915
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
19916 ndi_devi_enter(tdip, &circ);
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
19917 mutex_enter(&DEVI(tdip)->devi_lock);
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
19918 DEVI_SET_DEVICE_REMOVED(tdip);
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
19919 mutex_exit(&DEVI(tdip)->devi_lock);
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
19920 ndi_devi_exit(tdip, circ);
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
19921 }
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
19922
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
19923
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
19924 /*
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
19925 * 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
19926 * to perform the target node cleanup.
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
19927 */
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
19928 static void
5832
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
19929 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
19930 sata_address_t *saddr)
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
19931 {
10318
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19932 if (saddr->qual == SATA_ADDR_CPORT ||
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19933 saddr->qual == SATA_ADDR_DCPORT) {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19934 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst,
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19935 saddr->cport)->cport_mutex);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19936 SATA_CPORT_EVENT_FLAGS(sata_hba_inst, saddr->cport) |=
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19937 SATA_EVNT_TARGET_NODE_CLEANUP;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19938 SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19939 cport_tgtnode_clean = B_FALSE;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19940 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19941 saddr->cport)->cport_mutex);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19942 } else {
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19943 mutex_enter(&SATA_PMPORT_INFO(sata_hba_inst,
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19944 saddr->cport, saddr->pmport)->pmport_mutex);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19945 SATA_PMPORT_EVENT_FLAGS(sata_hba_inst, saddr->cport,
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19946 saddr->pmport) |= SATA_EVNT_TARGET_NODE_CLEANUP;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19947 SATA_PMPORT_INFO(sata_hba_inst, saddr->cport, saddr->pmport)->
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19948 pmport_tgtnode_clean = B_FALSE;
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19949 mutex_exit(&SATA_PMPORT_INFO(sata_hba_inst,
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19950 saddr->cport, saddr->pmport)->pmport_mutex);
811db323512d PSARC/2009/394 SATA Framework Port Multiplier Support
Xiao-Yu Zhang <Xiao-Yu.Zhang@Sun.COM>
parents: 10247
diff changeset
19951 }
3935
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
19952 mutex_enter(&sata_hba_inst->satahba_mutex);
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
19953 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
19954 mutex_exit(&sata_hba_inst->satahba_mutex);
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
19955 mutex_enter(&sata_mutex);
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
19956 sata_event_pending |= SATA_EVNT_MAIN;
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
19957 mutex_exit(&sata_mutex);
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
19958 }
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
19959
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
19960
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
19961 /*
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
19962 * 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
19963 * 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
19964 * device.
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
19965 *
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
19966 * 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
19967 * B_FALSE otherwise.
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
19968 */
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
19969 static boolean_t
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
19970 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
19971 {
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
19972 ASSERT(tdip != NULL);
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
19973
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
19974 if (DEVI_IS_DEVICE_REMOVED(tdip))
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
19975 return (B_TRUE);
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
19976 else
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
19977 return (B_FALSE);
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
19978 }
6539
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
19979
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
19980 /* ************************ FAULT INJECTTION **************************** */
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
19981
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
19982 #ifdef SATA_INJECT_FAULTS
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
19983
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
19984 static uint32_t sata_fault_count = 0;
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
19985 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
19986
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
19987 /*
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
19988 * Inject sata pkt fault
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
19989 * 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
19990 * 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
19991 * 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
19992 * 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
19993 * 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
19994 * 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
19995 * (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
19996 * 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
19997 * 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
19998 *
6539
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
19999 * 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
20000 * 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
20001 * 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
20002 * 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
20003 * are the satapkt_reason values.
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
20004 * SATA_PKT_BUSY -1 Not completed, busy
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
20005 * 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
20006 * 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
20007 * 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
20008 * SATA_PKT_CMD_UNSUPPORTED 4 Cmd unsupported
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
20009 * SATA_PKT_ABORTED 5 Aborted by request
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
20010 * SATA_PKT_TIMEOUT 6 Operation timeut
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
20011 * 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
20012 *
7954
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
20013 * 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
20014 *
6539
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
20015 * 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
20016 * 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
20017 * 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
20018 * 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
20019 * 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
20020 * (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
20021 * 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
20022 *
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
20023 * 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
20024 * injection is bypassed (pause between fault injections).
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
20025 * 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
20026 * sata_inject_fault_count.
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
20027 *
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
20028 * 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
20029 * reset to start repetition sequence from scratch.
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
20030 * 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
20031 * 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
20032 * is injected (to avoid masking real problems);
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
20033 *
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
20034 * 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
20035 * commands executed in SYNCHRONOUS mode.
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
20036 */
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
20037
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
20038
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
20039 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
20040 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
20041 {
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
20042
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
20043 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
20044 return;
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
20045
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
20046 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
20047 return;
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
20048
6539
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
20049 if (fault == 0)
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
20050 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
20051
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
20052 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
20053 return;
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
20054
7954
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
20055 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
20056 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
20057 (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
20058
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
20059 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
20060 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
20061 return;
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
20062
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
20063 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
20064 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
20065 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
20066 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
20067 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
20068 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
20069 return;
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
20070 }
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
20071
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
20072 /* Modify pkt return parameters */
6539
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
20073 if (*rval != SATA_TRAN_ACCEPTED ||
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
20074 spkt->satapkt_reason != SATA_PKT_COMPLETED) {
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
20075 sata_fault_count = 0;
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
20076 sata_fault_suspend_count = 0;
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
20077 return;
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
20078 }
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
20079 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
20080 /* Pause in the injection */
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
20081 sata_fault_suspend_count -= 1;
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
20082 return;
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
20083 }
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
20084
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
20085 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
20086 /*
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
20087 * 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
20088 * it is a permanent fault.
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
20089 */
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
20090 if (sata_inject_fault_count != -1) {
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
20091 sata_fault_count = sata_inject_fault_count;
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
20092 sata_fault_suspend_count =
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
20093 sata_inject_fault_pause_count;
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
20094 if (sata_fault_suspend_count == 0)
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
20095 sata_inject_fault_count = 0;
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
20096 }
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
20097 }
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
20098
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
20099 if (sata_fault_count != 0)
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
20100 sata_fault_count -= 1;
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
20101
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
20102 switch (fault) {
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
20103 case SATA_PKT_BUSY:
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
20104 *rval = SATA_TRAN_BUSY;
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
20105 spkt->satapkt_reason = SATA_PKT_BUSY;
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
20106 break;
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
20107
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
20108 case SATA_PKT_QUEUE_FULL:
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
20109 *rval = SATA_TRAN_QUEUE_FULL;
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
20110 spkt->satapkt_reason = SATA_PKT_QUEUE_FULL;
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
20111 break;
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
20112
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
20113 case SATA_PKT_CMD_UNSUPPORTED:
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
20114 *rval = SATA_TRAN_CMD_UNSUPPORTED;
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
20115 spkt->satapkt_reason = SATA_PKT_CMD_UNSUPPORTED;
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
20116 break;
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
20117
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
20118 case SATA_PKT_PORT_ERROR:
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
20119 /* This is "rejected" command */
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
20120 *rval = SATA_TRAN_PORT_ERROR;
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
20121 spkt->satapkt_reason = SATA_PKT_PORT_ERROR;
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
20122 /* 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
20123 break;
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
20124
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
20125 case SATA_PKT_DEV_ERROR:
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
20126 spkt->satapkt_reason = SATA_PKT_DEV_ERROR;
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
20127 /*
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
20128 * Additional error setup could be done here
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
20129 */
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
20130 break;
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
20131
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
20132 case SATA_PKT_ABORTED:
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
20133 spkt->satapkt_reason = SATA_PKT_ABORTED;
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
20134 break;
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
20135
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
20136 case SATA_PKT_TIMEOUT:
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
20137 spkt->satapkt_reason = SATA_PKT_TIMEOUT;
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
20138 /* Additional error setup could be done here */
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
20139 break;
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
20140
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
20141 case SATA_PKT_RESET:
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
20142 spkt->satapkt_reason = SATA_PKT_RESET;
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
20143 /*
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
20144 * 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
20145 */
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
20146 break;
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
20147
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
20148 default:
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
20149 break;
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
20150 }
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
20151 }
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
20152
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
20153 #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
20154
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
20155 /*
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
20156 * 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
20157 * ----------------------
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
20158 *
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
20159 * 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
20160 *
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
20161 * 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
20162 * 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
20163 * 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
20164 *
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
20165 * 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
20166 *
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
20167 * 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
20168 * 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
20169 *
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
20170 * 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
20171 * 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
20172 * 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
20173 * 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
20174 * 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
20175 * 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
20176 *
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
20177 * 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
20178 * 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
20179 *
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
20180 * +---------------------------------+
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
20181 * | 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
20182 * | 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
20183 * |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
20184 * |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
20185 * | 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
20186 * | 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
20187 * | | | +------------------+
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
20188 * | +------------------+ |
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
20189 * | |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
20190 * | +------------------+ |
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
20191 * +---------------------------------+
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
20192 *
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
20193 * 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
20194 *
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
20195 * 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
20196 * 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
20197 * 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
20198 * 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
20199 *
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
20200 * 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
20201 * 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
20202 * /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
20203 *
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
20204 * 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
20205 * 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
20206 */
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
20207 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
20208 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
20209 {
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
20210 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
20211
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
20212 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
20213 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
20214 }
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
20215
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
20216 /*
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
20217 * 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
20218 * 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
20219 * 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
20220 */
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
20221 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
20222 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
20223 }
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
20224
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
20225 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
20226
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
20227 /* 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
20228 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
20229
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
20230 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
20231 /* 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
20232 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
20233 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
20234 }
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
20235
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
20236 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
20237 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
20238
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
20239 (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
20240
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
20241 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
20242 }
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
20243
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
20244 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
20245 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
20246 {
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
20247 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
20248
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
20249 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
20250 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
20251 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
20252 }
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
20253
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
20254 /*
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
20255 * 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
20256 * 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
20257 */
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
20258 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
20259 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
20260 {
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
20261 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
20262
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
20263 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
20264 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
20265 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
20266 }
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
20267
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
20268 /*
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
20269 * 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
20270 * 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
20271 */
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
20272 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
20273 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
20274 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
20275 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
20276 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
20277 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
20278 }
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
20279
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
20280 /* 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
20281 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
20282 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
20283 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
20284 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
20285 } 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
20286 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
20287 }
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
20288
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
20289 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
20290 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
20291 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
20292 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
20293 } 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
20294 /*
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
20295 * 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
20296 * 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
20297 */
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
20298 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
20299 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
20300 } 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
20301 /* 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
20302 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
20303 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
20304 }
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
20305
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
20306 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
20307 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
20308 }
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
20309 }
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
20310
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
20311
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
20312 /*
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
20313 * 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
20314 */
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
20315 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
20316 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
20317 {
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
20318 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
20319
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
20320 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
20321 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
20322 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
20323
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
20324 /*
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
20325 * 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
20326 */
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
20327 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
20328 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
20329 } 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
20330 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
20331 }
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
20332 }
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
20333 }
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
20334
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
20335
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
20336 /*
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
20337 * 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
20338 */
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
20339 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
20340 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
20341 {
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
20342 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
20343
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
20344 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
20345
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
20346 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
20347 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
20348 }
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
20349 }
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
20350
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
20351
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
20352 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
20353 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
20354 {
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
20355 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
20356 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
20357 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
20358 }
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
20359
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
20360 /*
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
20361 * 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
20362 * 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
20363 */
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
20364 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
20365 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
20366 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
20367 {
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
20368 #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
20369 _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
20370 #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
20371
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
20372 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
20373 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
20374
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
20375 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
20376 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
20377 }
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
20378
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
20379 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
20380 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
20381 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
20382 }