annotate usr/src/uts/common/io/sata/impl/sata.c @ 1258:9961d7d3ec8c

PSARC/2004/779 SATA HBA Framework Support PSARC/2005/679 SATA HBA Framework Support (update) 6296430 x86: support for Silicon Image 3124/3132 sata controllers 6326505 SATA framework needed to support controller-specific SATA HBA drivers operating in sata-native mode 6326531 cfgadm sata plugin needed for sata framework
author mlf
date Fri, 13 Jan 2006 09:07:56 -0800
parents
children 4fa3374f2b9d
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 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
23 * Copyright 2005 Sun Microsystems, Inc. All rights reserved.
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 #pragma ident "%Z%%M% %I% %E% SMI"
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 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
30 * SATA Framework
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
31 * Generic SATA Host Adapter Implementation
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
32 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
33 * NOTE: THIS VERSION DOES NOT SUPPORT ATAPI DEVICES,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
34 * although there is some code related to these devices.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
35 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
36 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
37 #include <sys/conf.h>
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
38 #include <sys/file.h>
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
39 #include <sys/ddi.h>
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
40 #include <sys/sunddi.h>
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
41 #include <sys/modctl.h>
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
42 #include <sys/cmn_err.h>
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
43 #include <sys/errno.h>
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
44 #include <sys/thread.h>
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
45 #include <sys/kstat.h>
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
46 #include <sys/note.h>
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
47
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
48 #include <sys/sata/impl/sata.h>
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
49 #include <sys/sata/sata_hba.h>
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
50 #include <sys/sata/sata_defs.h>
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
51 #include <sys/sata/sata_cfgadm.h>
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
52
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
53
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
54
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
55 /* Debug flags - defined in sata.h */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
56 int sata_debug_flags = 0;
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 * Flags enabling selected SATA HBA framework functionality
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
59 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
60 #define SATA_ENABLE_QUEUING 1
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
61 #define SATA_ENABLE_NCQ 2
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
62 #define SATA_ENABLE_PROCESS_EVENTS 4
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
63 static int sata_func_enable = SATA_ENABLE_PROCESS_EVENTS;
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 #ifdef SATA_DEBUG
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
66 #define SATA_LOG_D(args) sata_log args
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
67 #else
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
68 #define SATA_LOG_D(arg)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
69 #endif
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
70
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
71
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
72 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
73 * SATA cb_ops functions
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
74 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
75 static int sata_hba_open(dev_t *, int, int, cred_t *);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
76 static int sata_hba_close(dev_t, int, int, cred_t *);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
77 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
78
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
79 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
80 * SCSA required entry points
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
81 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
82 static int sata_scsi_tgt_init(dev_info_t *, dev_info_t *,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
83 scsi_hba_tran_t *, struct scsi_device *);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
84 static int sata_scsi_tgt_probe(struct scsi_device *,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
85 int (*callback)(void));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
86 static void sata_scsi_tgt_free(dev_info_t *, dev_info_t *,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
87 scsi_hba_tran_t *, struct scsi_device *);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
88 static int sata_scsi_start(struct scsi_address *, struct scsi_pkt *);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
89 static int sata_scsi_abort(struct scsi_address *, struct scsi_pkt *);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
90 static int sata_scsi_reset(struct scsi_address *, int);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
91 static int sata_scsi_getcap(struct scsi_address *, char *, int);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
92 static int sata_scsi_setcap(struct scsi_address *, char *, int, int);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
93 static struct scsi_pkt *sata_scsi_init_pkt(struct scsi_address *,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
94 struct scsi_pkt *, struct buf *, int, int, int, int, int (*)(caddr_t),
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
95 caddr_t);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
96 static void sata_scsi_destroy_pkt(struct scsi_address *, struct scsi_pkt *);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
97 static void sata_scsi_dmafree(struct scsi_address *, struct scsi_pkt *);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
98 static void sata_scsi_sync_pkt(struct scsi_address *, struct scsi_pkt *);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
99 static int sata_scsi_get_name(struct scsi_device *, char *, int);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
100
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
101
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
102 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
103 * Local functions
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
104 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
105 static void sata_remove_hba_instance(dev_info_t *);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
106 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
107 static void sata_probe_ports(sata_hba_inst_t *);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
108 static int sata_reprobe_port(sata_hba_inst_t *, sata_device_t *);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
109 static void sata_make_device_nodes(dev_info_t *, sata_hba_inst_t *);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
110 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
111 sata_address_t *);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
112 static int sata_validate_scsi_address(sata_hba_inst_t *,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
113 struct scsi_address *, sata_device_t *);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
114 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
115 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
116 static void sata_pkt_free(sata_pkt_txlate_t *);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
117 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
118 caddr_t, ddi_dma_attr_t *);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
119 static int sata_probe_device(sata_hba_inst_t *, sata_device_t *);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
120 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
121 sata_device_t *);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
122 static int sata_identify_device(sata_hba_inst_t *, sata_drive_info_t *);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
123 static struct buf *sata_alloc_local_buffer(sata_pkt_txlate_t *, int);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
124 static void sata_free_local_buffer(sata_pkt_txlate_t *);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
125 static uint64_t sata_check_capacity(sata_drive_info_t *);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
126 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
127 ddi_dma_attr_t *);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
128 static int sata_fetch_device_identify_data(sata_hba_inst_t *,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
129 sata_drive_info_t *);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
130 static void sata_update_port_info(sata_hba_inst_t *, sata_device_t *);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
131 static void sata_update_port_scr(sata_port_scr_t *, sata_device_t *);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
132 static int sata_set_udma_mode(sata_hba_inst_t *, sata_drive_info_t *);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
133
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
134 /* Event processing functions */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
135 static void sata_event_daemon(void *);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
136 static void sata_event_thread_control(int);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
137 static void sata_process_controller_events(sata_hba_inst_t *sata_hba_inst);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
138 static void sata_process_device_reset(sata_hba_inst_t *, sata_address_t *);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
139 static void sata_process_port_failed_event(sata_hba_inst_t *,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
140 sata_address_t *);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
141 static void sata_process_port_link_events(sata_hba_inst_t *,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
142 sata_address_t *);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
143 static void sata_process_device_detached(sata_hba_inst_t *, sata_address_t *);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
144 static void sata_process_device_attached(sata_hba_inst_t *, sata_address_t *);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
145 static void sata_process_port_pwr_change(sata_hba_inst_t *, sata_address_t *);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
146 static void sata_process_cntrl_pwr_level_change(sata_hba_inst_t *);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
147 static int sata_restore_drive_settings(sata_hba_inst_t *,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
148 sata_drive_info_t *);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
149
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
150 /* Local functions for ioctl */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
151 static int32_t sata_get_port_num(sata_hba_inst_t *, struct devctl_iocdata *);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
152 static void sata_cfgadm_state(sata_hba_inst_t *, int32_t,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
153 devctl_ap_state_t *);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
154 static dev_info_t *sata_get_target_dip(dev_info_t *, int32_t);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
155 static dev_info_t *sata_devt_to_devinfo(dev_t);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
156
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
157 /* Local translation functions */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
158 static int sata_txlt_inquiry(sata_pkt_txlate_t *);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
159 static int sata_txlt_test_unit_ready(sata_pkt_txlate_t *);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
160 static int sata_txlt_start_stop_unit(sata_pkt_txlate_t *);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
161 static int sata_txlt_read_capacity(sata_pkt_txlate_t *);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
162 static int sata_txlt_request_sense(sata_pkt_txlate_t *);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
163 static int sata_txlt_read(sata_pkt_txlate_t *);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
164 static int sata_txlt_write(sata_pkt_txlate_t *);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
165 static int sata_txlt_atapi(sata_pkt_txlate_t *);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
166 static int sata_txlt_log_sense(sata_pkt_txlate_t *);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
167 static int sata_txlt_log_select(sata_pkt_txlate_t *);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
168 static int sata_txlt_mode_sense(sata_pkt_txlate_t *);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
169 static int sata_txlt_mode_select(sata_pkt_txlate_t *);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
170 static int sata_txlt_synchronize_cache(sata_pkt_txlate_t *);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
171 static int sata_txlt_nodata_cmd_immediate(sata_pkt_txlate_t *);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
172
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
173 static int sata_hba_start(sata_pkt_txlate_t *, int *);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
174 static int sata_txlt_invalid_command(sata_pkt_txlate_t *);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
175 static int sata_txlt_lba_out_of_range(sata_pkt_txlate_t *);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
176 static void sata_txlt_rw_completion(sata_pkt_t *);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
177 static void sata_txlt_atapi_completion(sata_pkt_t *);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
178 static void sata_txlt_nodata_cmd_completion(sata_pkt_t *);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
179
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
180 static struct scsi_extended_sense *sata_immediate_error_response(
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
181 sata_pkt_txlate_t *, int);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
182 static struct scsi_extended_sense *sata_arq_sense(sata_pkt_txlate_t *);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
183
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
184 /* Local functions */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
185 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
186 uint8_t *);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
187 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
188 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
189 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
190 static int sata_build_msense_page_1c(sata_drive_info_t *, int, uint8_t *);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
191 static int sata_mode_select_page_8(sata_pkt_txlate_t *,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
192 struct mode_cache_scsi3 *, int, int *, int *, int *);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
193 static void sata_save_drive_settings(sata_drive_info_t *);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
194 static void sata_show_drive_info(sata_hba_inst_t *, sata_drive_info_t *);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
195
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
196 static void sata_log(sata_hba_inst_t *, uint_t, char *fmt, ...);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
197
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
198 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
199 * SATA Framework will ignore SATA HBA driver cb_ops structure and
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
200 * register following one with SCSA framework.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
201 * Open & close are provided, so scsi framework will not use its own
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
202 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
203 static struct cb_ops sata_cb_ops = {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
204 sata_hba_open, /* open */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
205 sata_hba_close, /* close */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
206 nodev, /* strategy */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
207 nodev, /* print */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
208 nodev, /* dump */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
209 nodev, /* read */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
210 nodev, /* write */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
211 sata_hba_ioctl, /* ioctl */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
212 nodev, /* devmap */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
213 nodev, /* mmap */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
214 nodev, /* segmap */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
215 nochpoll, /* chpoll */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
216 ddi_prop_op, /* cb_prop_op */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
217 0, /* streamtab */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
218 D_NEW | D_MP, /* cb_flag */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
219 CB_REV, /* rev */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
220 nodev, /* aread */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
221 nodev /* awrite */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
222 };
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
223
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
224
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
225 extern struct mod_ops mod_miscops;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
226 extern uchar_t scsi_cdb_size[];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
227
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
228 static struct modlmisc modlmisc = {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
229 &mod_miscops, /* Type of module */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
230 "Generic SATA Driver v%I%" /* module name */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
231 };
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
232
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
233
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
234 static struct modlinkage modlinkage = {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
235 MODREV_1,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
236 (void *)&modlmisc,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
237 NULL
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
238 };
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
239
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
240 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
241 * 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
242 * i.e. when scsi_pkt has not timeout specified.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
243 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
244 static int sata_default_pkt_time = 60; /* 60 seconds */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
245
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
246 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
247 * Mutexes protecting structures in multithreaded operations.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
248 * Because events are relatively rare, a single global mutex protecting
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
249 * data structures should be sufficient. To increase performance, add
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
250 * 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
251 * common data structures.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
252 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
253 static kmutex_t sata_mutex; /* protects sata_hba_list */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
254 static kmutex_t sata_log_mutex; /* protects log */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
255
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
256 static char sata_log_buf[256];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
257
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
258 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
259 * Linked list of HBA instances
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
260 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
261 static sata_hba_inst_t *sata_hba_list = NULL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
262 static sata_hba_inst_t *sata_hba_list_tail = NULL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
263 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
264 * 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
265 * structure and in sata soft state.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
266 */
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 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
269 * Event daemon related variables
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
270 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
271 static kmutex_t sata_event_mutex;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
272 static kcondvar_t sata_event_cv;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
273 static kthread_t *sata_event_thread = NULL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
274 static int sata_event_thread_terminate = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
275 static int sata_event_pending = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
276 static int sata_event_thread_active = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
277 extern pri_t minclsyspri;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
278
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
279 /* Warlock directives */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
280
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
281 _NOTE(SCHEME_PROTECTS_DATA("No Mutex Needed", scsi_hba_tran))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
282 _NOTE(SCHEME_PROTECTS_DATA("No Mutex Needed", scsi_device))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
283 _NOTE(SCHEME_PROTECTS_DATA("No Mutex Needed", dev_ops))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
284 _NOTE(SCHEME_PROTECTS_DATA("No Mutex Needed", scsi_extended_sense))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
285 _NOTE(SCHEME_PROTECTS_DATA("No Mutex Needed", scsi_arq_status))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
286 _NOTE(SCHEME_PROTECTS_DATA("No Mutex Needed", ddi_dma_attr))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
287 _NOTE(SCHEME_PROTECTS_DATA("No Mutex Needed", ddi_dma_cookie_t))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
288 _NOTE(SCHEME_PROTECTS_DATA("No Mutex Needed", devctl_ap_state))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
289 _NOTE(MUTEX_PROTECTS_DATA(sata_mutex, sata_hba_list))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
290 _NOTE(DATA_READABLE_WITHOUT_LOCK(sata_hba_list))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
291 _NOTE(MUTEX_PROTECTS_DATA(sata_mutex, sata_hba_inst::satahba_next))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
292 _NOTE(MUTEX_PROTECTS_DATA(sata_mutex, sata_hba_inst::satahba_prev))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
293 _NOTE(SCHEME_PROTECTS_DATA("No Mutex Needed", \
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
294 sata_hba_inst::satahba_scsi_tran))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
295 _NOTE(SCHEME_PROTECTS_DATA("No Mutex Needed", sata_hba_inst::satahba_tran))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
296 _NOTE(SCHEME_PROTECTS_DATA("No Mutex Needed", sata_hba_inst::satahba_dip))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
297 _NOTE(SCHEME_PROTECTS_DATA("Scheme", sata_hba_inst::satahba_attached))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
298 _NOTE(DATA_READABLE_WITHOUT_LOCK(sata_hba_inst::satahba_dev_port))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
299 _NOTE(MUTEX_PROTECTS_DATA(sata_hba_inst::satahba_mutex,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
300 sata_hba_inst::satahba_event_flags))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
301 _NOTE(MUTEX_PROTECTS_DATA(sata_cport_info::cport_mutex, \
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
302 sata_cport_info::cport_devp))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
303 _NOTE(DATA_READABLE_WITHOUT_LOCK(sata_cport_info::cport_devp))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
304 _NOTE(SCHEME_PROTECTS_DATA("Scheme", sata_cport_info::cport_addr))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
305 _NOTE(MUTEX_PROTECTS_DATA(sata_cport_info::cport_mutex, \
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
306 sata_cport_info::cport_dev_type))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
307 _NOTE(DATA_READABLE_WITHOUT_LOCK(sata_cport_info::cport_dev_type))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
308 _NOTE(MUTEX_PROTECTS_DATA(sata_cport_info::cport_mutex, \
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
309 sata_cport_info::cport_state))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
310 _NOTE(DATA_READABLE_WITHOUT_LOCK(sata_cport_info::cport_state))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
311 _NOTE(DATA_READABLE_WITHOUT_LOCK(sata_pmport_info::pmport_dev_type))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
312 _NOTE(DATA_READABLE_WITHOUT_LOCK(sata_pmport_info::pmport_sata_drive))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
313 _NOTE(DATA_READABLE_WITHOUT_LOCK(sata_pmult_info::pmult_dev_port))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
314 _NOTE(DATA_READABLE_WITHOUT_LOCK(sata_pmult_info::pmult_num_dev_ports))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
315
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
316 /* End of warlock directives */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
317
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
318 /* ************** loadable module configuration functions ************** */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
319
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
320 int
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
321 _init()
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
322 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
323 int rval;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
324
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
325 mutex_init(&sata_mutex, NULL, MUTEX_DRIVER, NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
326 mutex_init(&sata_event_mutex, NULL, MUTEX_DRIVER, NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
327 mutex_init(&sata_log_mutex, NULL, MUTEX_DRIVER, NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
328 cv_init(&sata_event_cv, NULL, CV_DRIVER, NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
329 if ((rval = mod_install(&modlinkage)) != 0) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
330 #ifdef SATA_DEBUG
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
331 cmn_err(CE_WARN, "sata: _init: mod_install failed\n");
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
332 #endif
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
333 mutex_destroy(&sata_log_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
334 cv_destroy(&sata_event_cv);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
335 mutex_destroy(&sata_event_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
336 mutex_destroy(&sata_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
337 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
338 return (rval);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
339 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
340
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
341 int
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
342 _fini()
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
343 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
344 int rval;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
345
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
346 if ((rval = mod_remove(&modlinkage)) != 0)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
347 return (rval);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
348
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
349 mutex_destroy(&sata_log_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
350 cv_destroy(&sata_event_cv);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
351 mutex_destroy(&sata_event_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
352 mutex_destroy(&sata_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
353 return (rval);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
354 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
355
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
356 int
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
357 _info(struct modinfo *modinfop)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
358 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
359 return (mod_info(&modlinkage, modinfop));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
360 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
361
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
362
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
363
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
364 /* ********************* SATA HBA entry points ********************* */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
365
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
366
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
367 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
368 * Called by SATA HBA from _init().
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
369 * Registers HBA driver instance/sata framework pair with scsi framework, by
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
370 * calling scsi_hba_init().
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
371 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
372 * 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
373 * instead. SATA HBA framework cb_ops pointer overwrites SATA HBA driver
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
374 * cb_ops pointer in SATA HBA driver dev_ops structure.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
375 * 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
376 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
377 * 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
378 * driver.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
379 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
380 int
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
381 sata_hba_init(struct modlinkage *modlp)
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 int rval;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
384 struct dev_ops *hba_ops;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
385
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
386 SATADBG1(SATA_DBG_HBA_IF, NULL,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
387 "sata_hba_init: name %s \n",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
388 ((struct modldrv *)(modlp->ml_linkage[0]))->drv_linkinfo);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
389 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
390 * Fill-up cb_ops and dev_ops when necessary
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
391 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
392 hba_ops = ((struct modldrv *)(modlp->ml_linkage[0]))->drv_dev_ops;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
393 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
394 * Provide pointer to SATA dev_ops
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
395 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
396 hba_ops->devo_cb_ops = &sata_cb_ops;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
397
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
398 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
399 * Register SATA HBA with SCSI framework
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
400 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
401 if ((rval = scsi_hba_init(modlp)) != 0) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
402 SATADBG1(SATA_DBG_HBA_IF, NULL,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
403 "sata_hba_init: scsi hba init failed\n", NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
404 return (rval);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
405 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
406
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
407 return (0);
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
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
411 /* HBA attach stages */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
412 #define HBA_ATTACH_STAGE_SATA_HBA_INST 1
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
413 #define HBA_ATTACH_STAGE_SCSI_ATTACHED 2
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
414 #define HBA_ATTACH_STAGE_SETUP 4
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
415 #define HBA_ATTACH_STAGE_LINKED 8
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 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
420 * 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
421 * the HBA.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
422 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
423 * For DDI_ATTACH command:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
424 * sata_hba_inst structure is allocated here and initialized with pointers to
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
425 * SATA framework implementation of required scsi tran functions.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
426 * 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
427 * to the soft structure (sata_hba_inst) allocated by SATA framework for
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
428 * SATA HBA instance related data.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
429 * 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
430 * store a pointer to per-HBA-instance of sata_hba_inst structure.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
431 * The sata_hba_inst structure is cross-linked to scsi tran structure.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
432 * 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
433 * 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
434 * linked together into the list, pointed to by sata_hba_list.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
435 * On the first HBA instance attach the sata event thread is initialized.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
436 * 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
437 * 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
438 * 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
439 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
440 * DDI_SUCCESS is returned when attachment process is successful,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
441 * DDI_FAILURE is returned otherwise.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
442 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
443 * For DDI_RESUME command:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
444 * Not implemented at this time (postponed until phase 2 of the development).
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
445 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
446 int
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
447 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
448 ddi_attach_cmd_t cmd)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
449 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
450 sata_hba_inst_t *sata_hba_inst;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
451 scsi_hba_tran_t *scsi_tran = NULL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
452 int hba_attach_state = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
453
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
454 SATADBG3(SATA_DBG_HBA_IF, NULL,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
455 "sata_hba_attach: node %s (%s%d)\n",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
456 ddi_node_name(dip), ddi_driver_name(dip),
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
457 ddi_get_instance(dip));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
458
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
459 if (cmd == DDI_RESUME) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
460 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
461 * Postponed until phase 2 of the development
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
462 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
463 return (DDI_FAILURE);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
464 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
465
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
466 if (cmd != DDI_ATTACH) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
467 return (DDI_FAILURE);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
468 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
469
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
470 /* cmd == DDI_ATTACH */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
471
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
472 if (sata_validate_sata_hba_tran(dip, sata_tran) != SATA_SUCCESS) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
473 SATA_LOG_D((NULL, CE_WARN,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
474 "sata_hba_attach: invalid sata_hba_tran"));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
475 return (DDI_FAILURE);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
476 }
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 * Allocate and initialize SCSI tran structure.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
479 * SATA copy of tran_bus_config is provided to create port nodes.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
480 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
481 scsi_tran = scsi_hba_tran_alloc(dip, SCSI_HBA_CANSLEEP);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
482 if (scsi_tran == NULL)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
483 return (DDI_FAILURE);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
484 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
485 * Allocate soft structure for SATA HBA instance.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
486 * There is a separate softstate for each HBA instance.
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 sata_hba_inst = kmem_zalloc(sizeof (struct sata_hba_inst), KM_SLEEP);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
489 ASSERT(sata_hba_inst != NULL); /* this should not fail */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
490 mutex_init(&sata_hba_inst->satahba_mutex, NULL, MUTEX_DRIVER, NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
491 hba_attach_state |= HBA_ATTACH_STAGE_SATA_HBA_INST;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
492
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
493 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
494 * 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
495 * soft structure allocated by SATA framework for
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
496 * SATA HBA instance related data.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
497 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
498 scsi_tran->tran_hba_private = sata_hba_inst;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
499 scsi_tran->tran_tgt_private = NULL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
500
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
501 scsi_tran->tran_tgt_init = sata_scsi_tgt_init;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
502 scsi_tran->tran_tgt_probe = sata_scsi_tgt_probe;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
503 scsi_tran->tran_tgt_free = sata_scsi_tgt_free;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
504
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
505 scsi_tran->tran_start = sata_scsi_start;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
506 scsi_tran->tran_reset = sata_scsi_reset;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
507 scsi_tran->tran_abort = sata_scsi_abort;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
508 scsi_tran->tran_getcap = sata_scsi_getcap;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
509 scsi_tran->tran_setcap = sata_scsi_setcap;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
510 scsi_tran->tran_init_pkt = sata_scsi_init_pkt;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
511 scsi_tran->tran_destroy_pkt = sata_scsi_destroy_pkt;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
512
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
513 scsi_tran->tran_dmafree = sata_scsi_dmafree;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
514 scsi_tran->tran_sync_pkt = sata_scsi_sync_pkt;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
515
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
516 scsi_tran->tran_reset_notify = NULL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
517 scsi_tran->tran_get_bus_addr = NULL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
518 scsi_tran->tran_quiesce = NULL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
519 scsi_tran->tran_unquiesce = NULL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
520 scsi_tran->tran_bus_reset = NULL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
521
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
522 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
523 scsi_tran, 0) != DDI_SUCCESS) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
524 #ifdef SATA_DEBUG
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
525 cmn_err(CE_WARN, "?SATA: %s%d hba scsi attach failed",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
526 ddi_driver_name(dip), ddi_get_instance(dip));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
527 #endif
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
528 goto fail;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
529 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
530 hba_attach_state |= HBA_ATTACH_STAGE_SCSI_ATTACHED;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
531
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
532 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
533 if (ddi_prop_update_int(DDI_DEV_T_NONE, dip,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
534 "sata", 1) != DDI_PROP_SUCCESS) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
535 SATA_LOG_D((NULL, CE_WARN, "sata_hba_attach: "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
536 "failed to create hba sata prop"));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
537 goto fail;
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 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
540
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
541 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
542 * Save pointers in hba instance soft state.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
543 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
544 sata_hba_inst->satahba_scsi_tran = scsi_tran;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
545 sata_hba_inst->satahba_tran = sata_tran;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
546 sata_hba_inst->satahba_dip = dip;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
547
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
548 hba_attach_state |= HBA_ATTACH_STAGE_SETUP;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
549
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
550 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
551 * Create events thread if not created yet.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
552 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
553 sata_event_thread_control(1);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
554
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
555 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
556 * Link this hba instance into the list.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
557 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
558 mutex_enter(&sata_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
559
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
560
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
561 sata_hba_inst->satahba_next = NULL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
562 sata_hba_inst->satahba_prev = sata_hba_list_tail;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
563 if (sata_hba_list == NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
564 sata_hba_list = sata_hba_inst;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
565 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
566 if (sata_hba_list_tail != NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
567 sata_hba_list_tail->satahba_next = sata_hba_inst;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
568 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
569 sata_hba_list_tail = sata_hba_inst;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
570 mutex_exit(&sata_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
571 hba_attach_state |= HBA_ATTACH_STAGE_LINKED;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
572
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
573 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
574 * Create SATA HBA devctl minor node for sata_hba_open, close, ioctl
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
575 * SATA HBA driver should not use its own open/close entry points.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
576 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
577 * Make sure that instance number doesn't overflow
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
578 * when forming minor numbers.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
579 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
580 ASSERT(ddi_get_instance(dip) <= (L_MAXMIN >> INST_MINOR_SHIFT));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
581 if (ddi_create_minor_node(dip, "devctl", S_IFCHR,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
582 INST2DEVCTL(ddi_get_instance(dip)),
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
583 DDI_NT_SATA_NEXUS, 0) != DDI_SUCCESS) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
584 #ifdef SATA_DEBUG
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
585 cmn_err(CE_WARN, "sata_hba_attach: "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
586 "cannot create devctl minor node");
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
587 #endif
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
588 goto fail;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
589 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
590
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 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
593 * Set-up kstats here, if necessary.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
594 * (postponed until phase 2 of the development).
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
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
597
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
598 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
599 * Probe controller ports. This operation will describe a current
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
600 * controller/port/multipliers/device configuration and will create
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
601 * attachment points.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
602 * We may end-up with just a controller with no devices attached.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
603 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
604 sata_probe_ports(sata_hba_inst);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
605
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
606 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
607 * Create child nodes for all possible target devices currently
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
608 * attached to controller's ports and port multiplier device ports.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
609 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
610 sata_make_device_nodes(sata_tran->sata_tran_hba_dip, sata_hba_inst);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
611
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
612 sata_hba_inst->satahba_attached = 1;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
613 return (DDI_SUCCESS);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
614
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
615 fail:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
616 if (hba_attach_state & HBA_ATTACH_STAGE_LINKED) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
617 (void) sata_remove_hba_instance(dip);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
618 if (sata_hba_list == NULL)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
619 sata_event_thread_control(0);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
620 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
621 if (hba_attach_state & HBA_ATTACH_STAGE_SETUP)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
622 (void) ddi_prop_remove(DDI_DEV_T_ANY, dip, "sata");
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 (hba_attach_state & HBA_ATTACH_STAGE_SCSI_ATTACHED)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
625 (void) scsi_hba_detach(dip);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
626
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
627 if (hba_attach_state & HBA_ATTACH_STAGE_SATA_HBA_INST) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
628 mutex_destroy(&sata_hba_inst->satahba_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
629 kmem_free((void *)sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
630 sizeof (struct sata_hba_inst));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
631 scsi_hba_tran_free(scsi_tran);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
632 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
633
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
634 sata_log(NULL, CE_WARN, "?SATA: %s%d hba attach failed",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
635 ddi_driver_name(dip), ddi_get_instance(dip));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
636
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
637 return (DDI_FAILURE);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
638 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
639
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 * Called by SATA HBA from to detach an instance of the driver.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
643 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
644 * For DDI_DETACH command:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
645 * Free local structures allocated for SATA HBA instance during
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
646 * sata_hba_attach processing.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
647 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
648 * Returns DDI_SUCCESS when HBA was detached, DDI_FAILURE otherwise.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
649 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
650 * For DDI_SUSPEND command:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
651 * Not implemented at this time (postponed until phase 2 of the development)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
652 * Returnd DDI_SUCCESS.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
653 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
654 * When the last HBA instance is detached, the event daemon is terminated.
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 * NOTE: cport support only, no port multiplier support.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
657 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
658 int
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
659 sata_hba_detach(dev_info_t *dip, ddi_detach_cmd_t cmd)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
660 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
661 dev_info_t *tdip;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
662 sata_hba_inst_t *sata_hba_inst;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
663 scsi_hba_tran_t *scsi_hba_tran;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
664 sata_cport_info_t *cportinfo;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
665 sata_drive_info_t *sdinfo;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
666 int ncport;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
667
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
668 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
669 ddi_node_name(dip), ddi_driver_name(dip), ddi_get_instance(dip));
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 switch (cmd) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
672 case DDI_DETACH:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
673
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
674 if ((scsi_hba_tran = ddi_get_driver_private(dip)) == NULL)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
675 return (DDI_FAILURE);
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 sata_hba_inst = scsi_hba_tran->tran_hba_private;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
678 if (sata_hba_inst == NULL)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
679 return (DDI_FAILURE);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
680
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
681 if (scsi_hba_detach(dip) == DDI_FAILURE) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
682 sata_hba_inst->satahba_attached = 1;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
683 return (DDI_FAILURE);
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 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
687 * Free all target nodes - at this point
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
688 * devices should be at least offlined
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
689 * otherwise scsi_hba_detach() should not be called.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
690 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
691 for (ncport = 0; ncport < SATA_NUM_CPORTS(sata_hba_inst);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
692 ncport++) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
693 cportinfo = SATA_CPORT_INFO(sata_hba_inst, ncport);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
694 if (cportinfo->cport_dev_type != SATA_DTYPE_PMULT) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
695 sdinfo = SATA_CPORTINFO_DRV_INFO(cportinfo);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
696 if (sdinfo != NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
697 tdip = sata_get_target_dip(dip,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
698 ncport);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
699 if (tdip != NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
700 if (ndi_devi_offline(tdip,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
701 NDI_DEVI_REMOVE) !=
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
702 NDI_SUCCESS) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
703 SATA_LOG_D((
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
704 sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
705 CE_WARN,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
706 "sata_hba_detach: "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
707 "Target node not "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
708 "removed !"));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
709 return (DDI_FAILURE);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
710 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
711 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
712 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
713 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
714 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
715 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
716 * Disable sata event daemon processing for this HBA
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
717 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
718 sata_hba_inst->satahba_attached = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
719
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
720 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
721 * Remove event daemon thread, if it is last HBA instance.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
722 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
723
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
724 mutex_enter(&sata_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
725 if (sata_hba_list->satahba_next == NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
726 mutex_exit(&sata_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
727 sata_event_thread_control(0);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
728 mutex_enter(&sata_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
729 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
730 mutex_exit(&sata_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
731
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
732 /* Remove this HBA instance from the HBA list */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
733 sata_remove_hba_instance(dip);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
734
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
735 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
736 * At this point there should be no target nodes attached.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
737 * Detach and destroy device and port info structures.
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 for (ncport = 0; ncport < SATA_NUM_CPORTS(sata_hba_inst);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
740 ncport++) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
741 cportinfo = SATA_CPORT_INFO(sata_hba_inst, ncport);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
742 if (cportinfo->cport_dev_type != SATA_DTYPE_PMULT) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
743 sdinfo =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
744 cportinfo->cport_devp.cport_sata_drive;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
745 if (sdinfo != NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
746 /* Release device structure */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
747 kmem_free(sdinfo,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
748 sizeof (sata_drive_info_t));
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 /* Release cport info */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
751 mutex_destroy(&cportinfo->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
752 kmem_free(cportinfo,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
753 sizeof (sata_cport_info_t));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
754 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
755 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
756
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
757 scsi_hba_tran_free(sata_hba_inst->satahba_scsi_tran);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
758
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
759 mutex_destroy(&sata_hba_inst->satahba_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
760 kmem_free((void *)sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
761 sizeof (struct sata_hba_inst));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
762
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
763 return (DDI_SUCCESS);
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 case DDI_SUSPEND:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
766 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
767 * Postponed until phase 2
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
768 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
769 return (DDI_FAILURE);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
770
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
771 default:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
772 return (DDI_FAILURE);
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 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
775
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
776
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 * Called by an HBA drive from _fini() routine.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
779 * Unregisters SATA HBA instance/SATA framework pair from the scsi framework.
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 void
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
782 sata_hba_fini(struct modlinkage *modlp)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
783 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
784 SATADBG1(SATA_DBG_HBA_IF, NULL,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
785 "sata_hba_fini: name %s\n",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
786 ((struct modldrv *)(modlp->ml_linkage[0]))->drv_linkinfo);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
787
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
788 scsi_hba_fini(modlp);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
789 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
790
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
791
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 * Default open and close routine for sata_hba framework.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
794 *
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 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
797 * Open devctl node.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
798 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
799 * Returns:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
800 * 0 if node was open successfully, error code otherwise.
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 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
803 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
804
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
805 static int
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
806 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
807 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
808 #ifndef __lock_lint
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
809 _NOTE(ARGUNUSED(credp))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
810 #endif
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
811 int rv = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
812 dev_info_t *dip;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
813 scsi_hba_tran_t *scsi_hba_tran;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
814 sata_hba_inst_t *sata_hba_inst;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
815
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
816 SATADBG1(SATA_DBG_IOCTL_IF, NULL, "sata_hba_open: entered", NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
817
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
818 if (otyp != OTYP_CHR)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
819 return (EINVAL);
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 dip = sata_devt_to_devinfo(*devp);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
822 if (dip == NULL)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
823 return (ENXIO);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
824
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
825 if ((scsi_hba_tran = ddi_get_driver_private(dip)) == NULL)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
826 return (ENXIO);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
827
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
828 sata_hba_inst = scsi_hba_tran->tran_hba_private;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
829 if (sata_hba_inst == NULL || sata_hba_inst->satahba_attached == 0)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
830 return (ENXIO);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
831
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
832 mutex_enter(&sata_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
833 if (flags & FEXCL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
834 if (sata_hba_inst->satahba_open_flag != 0) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
835 rv = EBUSY;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
836 } else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
837 sata_hba_inst->satahba_open_flag =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
838 SATA_DEVCTL_EXOPENED;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
839 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
840 } else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
841 if (sata_hba_inst->satahba_open_flag == SATA_DEVCTL_EXOPENED) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
842 rv = EBUSY;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
843 } else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
844 sata_hba_inst->satahba_open_flag =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
845 SATA_DEVCTL_SOPENED;
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 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
848 mutex_exit(&sata_mutex);
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 return (rv);
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
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
853
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
854 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
855 * Close devctl node.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
856 * Returns:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
857 * 0 if node was closed successfully, error code otherwise.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
858 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
859 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
860
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
861 static int
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
862 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
863 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
864 #ifndef __lock_lint
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
865 _NOTE(ARGUNUSED(credp))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
866 _NOTE(ARGUNUSED(flag))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
867 #endif
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
868 dev_info_t *dip;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
869 scsi_hba_tran_t *scsi_hba_tran;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
870 sata_hba_inst_t *sata_hba_inst;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
871
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
872 SATADBG1(SATA_DBG_IOCTL_IF, NULL, "sata_hba_close: entered", NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
873
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
874 if (otyp != OTYP_CHR)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
875 return (EINVAL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
876
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
877 dip = sata_devt_to_devinfo(dev);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
878 if (dip == NULL)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
879 return (ENXIO);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
880
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
881 if ((scsi_hba_tran = ddi_get_driver_private(dip)) == NULL)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
882 return (ENXIO);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
883
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
884 sata_hba_inst = scsi_hba_tran->tran_hba_private;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
885 if (sata_hba_inst == NULL || sata_hba_inst->satahba_attached == 0)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
886 return (ENXIO);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
887
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
888 mutex_enter(&sata_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
889 sata_hba_inst->satahba_open_flag = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
890 mutex_exit(&sata_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
891 return (0);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
892 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
893
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
894
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
895
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
896 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
897 * Standard IOCTL commands for SATA hotplugging.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
898 * Implemented DEVCTL_AP commands:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
899 * DEVCTL_AP_CONNECT
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
900 * DEVCTL_AP_DISCONNECT
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
901 * DEVCTL_AP_CONFIGURE
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
902 * DEVCTL_UNCONFIGURE
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
903 * DEVCTL_AP_CONTROL
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
904 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
905 * Commands passed to default ndi ioctl handler:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
906 * DEVCTL_DEVICE_GETSTATE
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
907 * DEVCTL_DEVICE_ONLINE
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
908 * DEVCTL_DEVICE_OFFLINE
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
909 * DEVCTL_DEVICE_REMOVE
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
910 * DEVCTL_DEVICE_INSERT
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
911 * DEVCTL_BUS_GETSTATE
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
912 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
913 * 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
914 * if not.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
915 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
916 * Returns:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
917 * 0 if successful,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
918 * error code if operation failed.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
919 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
920 * NOTE: Port Multiplier is not supported.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
921 *
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
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
924 static int
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
925 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
926 int *rvalp)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
927 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
928 #ifndef __lock_lint
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
929 _NOTE(ARGUNUSED(credp))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
930 _NOTE(ARGUNUSED(rvalp))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
931 #endif
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
932 int rv = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
933 int32_t comp_port = -1;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
934 dev_info_t *dip, *tdip;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
935 devctl_ap_state_t ap_state;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
936 struct devctl_iocdata *dcp = NULL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
937 scsi_hba_tran_t *scsi_hba_tran;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
938 sata_hba_inst_t *sata_hba_inst;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
939 sata_device_t sata_device;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
940 sata_drive_info_t *sdinfo;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
941 sata_cport_info_t *cportinfo;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
942 int cport, pmport, qual;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
943 int rval = SATA_SUCCESS;
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 dip = sata_devt_to_devinfo(dev);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
946 if (dip == NULL)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
947 return (ENXIO);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
948
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
949 if ((scsi_hba_tran = ddi_get_driver_private(dip)) == NULL)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
950 return (ENXIO);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
951
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
952 sata_hba_inst = scsi_hba_tran->tran_hba_private;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
953 if (sata_hba_inst == NULL)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
954 return (ENXIO);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
955
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
956 if (sata_hba_inst->satahba_tran == NULL)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
957 return (ENXIO);
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 switch (cmd) {
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 case DEVCTL_DEVICE_GETSTATE:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
962 case DEVCTL_DEVICE_ONLINE:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
963 case DEVCTL_DEVICE_OFFLINE:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
964 case DEVCTL_DEVICE_REMOVE:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
965 case DEVCTL_BUS_GETSTATE:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
966 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
967 * There may be more cases that we want to pass to default
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
968 * handler rather then fail them.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
969 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
970 return (ndi_devctl_ioctl(dip, cmd, arg, mode, 0));
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
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
973 /* read devctl ioctl data */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
974 if (cmd != DEVCTL_AP_CONTROL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
975 if (ndi_dc_allochdl((void *)arg, &dcp) != NDI_SUCCESS)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
976 return (EFAULT);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
977
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
978 if ((comp_port = sata_get_port_num(sata_hba_inst, dcp)) ==
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
979 -1) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
980 if (dcp)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
981 ndi_dc_freehdl(dcp);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
982 return (EINVAL);
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
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
985 cport = SCSI_TO_SATA_CPORT(comp_port);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
986 pmport = SCSI_TO_SATA_PMPORT(comp_port);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
987 /* Only cport is considered now, i.e. SATA_ADDR_CPORT */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
988 qual = SATA_ADDR_CPORT;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
989 if (sata_validate_sata_address(sata_hba_inst, cport, pmport,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
990 qual) != 0) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
991 ndi_dc_freehdl(dcp);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
992 return (EINVAL);
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
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
995 cportinfo = SATA_CPORT_INFO(sata_hba_inst, cport);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
996 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, cport)->
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
997 cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
998 if (cportinfo->cport_event_flags & SATA_EVNT_LOCK_PORT_BUSY) {
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 * Cannot process ioctl request now. Come back later.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1001 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1002 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1003 cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1004 ndi_dc_freehdl(dcp);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1005 return (EBUSY);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1006 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1007 /* Block event processing for this port */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1008 cportinfo->cport_event_flags |= SATA_APCTL_LOCK_PORT_BUSY;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1009 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1010
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1011 sata_device.satadev_addr.cport = cport;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1012 sata_device.satadev_addr.pmport = pmport;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1013 sata_device.satadev_addr.qual = SATA_ADDR_CPORT;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1014 sata_device.satadev_rev = SATA_DEVICE_REV;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1015 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1016
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1017 switch (cmd) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1018
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1019 case DEVCTL_AP_DISCONNECT:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1020 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1021 * Normally, cfgadm sata plugin will try to offline
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1022 * (unconfigure) device before this request. Nevertheless,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1023 * if a device is still configured, we need to
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1024 * attempt to offline and unconfigure device first, and we will
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1025 * deactivate the port regardless of the unconfigure
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1026 * operation results.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1027 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1028 * DEVCTL_AP_DISCONNECT invokes
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1029 * sata_hba_inst->satahba_tran->
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1030 * sata_tran_hotplug_ops->sata_tran_port_deactivate().
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1031 * If successful, the device structure (if any) attached
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1032 * to a port is removed and state of the port marked
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1033 * appropriately.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1034 * Failure of the port_deactivate may keep port in
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1035 * the active state, or may fail the port.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1036 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1037
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1038 /* Check the current state of the port */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1039 if (sata_reprobe_port(sata_hba_inst, &sata_device) !=
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1040 SATA_SUCCESS) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1041 rv = EIO;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1042 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1043 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1044 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, cport)->
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1045 cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1046 if (cportinfo->cport_state &
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1047 (SATA_PSTATE_SHUTDOWN | SATA_PSTATE_FAILED)) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1048 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1049 cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1050 rv = EIO;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1051 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1052 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1053 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1054 * set port's dev_state to not ready - this will disable
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1055 * an access to an attached device.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1056 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1057 cportinfo->cport_state &= ~SATA_STATE_READY;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1058
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1059 if (cportinfo->cport_dev_type != SATA_DTYPE_NONE) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1060 sdinfo = cportinfo->cport_devp.cport_sata_drive;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1061 ASSERT(sdinfo != NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1062 if ((sdinfo->satadrv_type &
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1063 (SATA_VALID_DEV_TYPE))) {
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 * If a target node exists, try to offline
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1066 * a device and remove target node.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1067 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1068 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1069 cport)->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1070 tdip = sata_get_target_dip(dip, comp_port);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1071 if (tdip != NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1072 /* target node exist */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1073 if (ndi_devi_offline(tdip,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1074 NDI_DEVI_REMOVE) != NDI_SUCCESS) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1075 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1076 * Problem
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1077 * A target node remained
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1078 * attached. This happens when
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1079 * the file was open or a node
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1080 * was waiting for resources.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1081 * Cannot do anything about it.
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 SATA_LOG_D((sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1084 CE_WARN,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1085 "sata_hba_ioctl: "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1086 "disconnect: cannot "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1087 "remove target node!!!"));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1088 }
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 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1091 cport)->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1092 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1093 * Remove and release sata_drive_info
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1094 * structure.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1095 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1096 if (SATA_CPORTINFO_DRV_INFO(cportinfo) !=
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1097 NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1098 SATA_CPORTINFO_DRV_INFO(cportinfo) =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1099 NULL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1100 (void) kmem_free((void *)sdinfo,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1101 sizeof (sata_drive_info_t));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1102 cportinfo->cport_dev_type =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1103 SATA_DTYPE_NONE;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1104 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1105 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1106 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1107 * Note: PMult info requires different handling.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1108 * Put PMult handling code here, when PNult is
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1109 * supported.
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 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1113 /* Sanity check */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1114 if (SATA_PORT_DEACTIVATE_FUNC(sata_hba_inst) == NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1115 /* No physical port deactivation supported. */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1116 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1117 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1118
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1119 /* Just ask HBA driver to deactivate port */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1120 sata_device.satadev_addr.qual = SATA_ADDR_DCPORT;
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 rval = (*SATA_PORT_DEACTIVATE_FUNC(sata_hba_inst))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1123 (dip, &sata_device);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1124 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, cport)->
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1125 cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1126 sata_update_port_info(sata_hba_inst, &sata_device);
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 if (rval != SATA_SUCCESS) {
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 * Port deactivation failure - do not
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1131 * change port state unless the state
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1132 * returned by HBA indicates a port failure.
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 if (sata_device.satadev_state & SATA_PSTATE_FAILED)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1135 cportinfo->cport_state = SATA_PSTATE_FAILED;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1136 rv = EIO;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1137 } else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1138 cportinfo->cport_state |= SATA_PSTATE_SHUTDOWN;
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 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1141 break;
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 case DEVCTL_AP_UNCONFIGURE:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1144
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1145 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1146 * The unconfigure operation uses generic nexus operation to
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1147 * offline a device. It leaves a target device node attached.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1148 * and obviously sata_drive_info attached as well, because
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1149 * from the hardware point of view nothing has changed.
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 if ((tdip = sata_get_target_dip(dip, comp_port)) != NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1152
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1153 if (ndi_devi_offline(tdip, NDI_UNCONFIG) !=
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1154 NDI_SUCCESS) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1155 SATA_LOG_D((sata_hba_inst, CE_WARN,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1156 "sata_hba_ioctl: unconfigure: "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1157 "failed to unconfigure "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1158 "device at cport %d", cport));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1159 rv = EIO;
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 * The target node devi_state should be marked with
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1163 * DEVI_DEVICE_OFFLINE by ndi_devi_offline().
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1164 * This would be the indication for cfgadm that
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1165 * the AP node occupant state is 'unconfigured'.
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
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1168 } else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1169 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1170 * This would indicate a failure on the part of cfgadm
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1171 * to detect correct state of the node prior to this
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1172 * call - one cannot unconfigure non-existing device.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1173 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1174 SATA_LOG_D((sata_hba_inst, CE_WARN,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1175 "sata_hba_ioctl: unconfigure: "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1176 "attempt to unconfigure non-existing device "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1177 "at cport %d", cport));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1178 rv = ENXIO;
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
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1181 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1182
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1183 case DEVCTL_AP_CONNECT:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1184 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1185 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1186 * The sata cfgadm pluging will invoke this operation only if
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1187 * port was found in the disconnect state (failed state
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1188 * is also treated as the disconnected state).
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1189 * DEVCTL_AP_CONNECT would invoke
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1190 * sata_hba_inst->satahba_tran->
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1191 * sata_tran_hotplug_ops->sata_tran_port_activate().
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1192 * If successful and a device is found attached to the port,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1193 * the initialization sequence is executed to attach
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1194 * a device structure to a port structure. The device is not
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1195 * set in configured state (system-wise) by this operation.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1196 * The state of the port and a device would be set
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1197 * appropriately.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1198 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1199 * Note, that activating the port may generate link events,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1200 * so is is important that following processing and the
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1201 * event processing does not interfere with each other!
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1202 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1203 * This operation may remove port failed state and will
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1204 * try to make port active and in good standing.
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 /* We only care about host sata cport for now */
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 if (SATA_PORT_ACTIVATE_FUNC(sata_hba_inst) != NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1210 /* Just let HBA driver to activate port */
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 if ((*SATA_PORT_ACTIVATE_FUNC(sata_hba_inst))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1213 (dip, &sata_device) != SATA_SUCCESS) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1214 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1215 * Port activation failure.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1216 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1217 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1218 cport)->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1219 sata_update_port_info(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1220 &sata_device);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1221 if (sata_device.satadev_state &
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1222 SATA_PSTATE_FAILED) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1223 cportinfo->cport_state =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1224 SATA_PSTATE_FAILED;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1225 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1226 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1227 cport)->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1228 SATA_LOG_D((sata_hba_inst, CE_WARN,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1229 "sata_hba_ioctl: connect: "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1230 "failed to activate SATA cport %d",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1231 cport));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1232 rv = EIO;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1233 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1234 }
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 /* Virgin port state - will be updated by the port re-probe. */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1237 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1238 cport)->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1239 cportinfo->cport_state = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1240 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1241 cport)->cport_mutex);
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 if (sata_reprobe_port(sata_hba_inst, &sata_device) ==
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1244 SATA_FAILURE)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1245 rv = EIO;
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 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1248 * If there is a device attached to the port, emit
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1249 * a message.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1250 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1251 if (cportinfo->cport_dev_type != SATA_DTYPE_NONE) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1252 sata_log(sata_hba_inst, CE_WARN,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1253 "SATA device attached at port %d", cport);
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 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1256 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1257
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1258 case DEVCTL_AP_CONFIGURE:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1259 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1260 boolean_t target = TRUE;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1261
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1262 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1263 * A port may be in an active or shutdown state.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1264 * If port is in a failed state, operation is aborted - one
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1265 * has to use explicit connect or port activate request
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1266 * to try to get a port into non-failed mode.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1267 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1268 * If a port is in a shutdown state, arbitrarily invoke
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1269 * sata_tran_port_activate() prior to any other operation.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1270 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1271 * Verify that port state is READY and there is a device
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1272 * of a supported type attached to this port.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1273 * If target node exists, a device was most likely offlined.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1274 * If target node does not exist, create a target node an
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1275 * attempt to online it.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1276 * *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1277 * NO PMult or devices beyond PMult are supported yet.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1278 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1279
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1280 /* We only care about host controller's sata cport for now. */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1281 if (cportinfo->cport_state & SATA_PSTATE_FAILED) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1282 rv = ENXIO;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1283 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1284 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1285 /* Check the current state of the port */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1286 sata_device.satadev_addr.qual = SATA_ADDR_CPORT;
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 rval = (*SATA_PROBE_PORT_FUNC(sata_hba_inst))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1289 (dip, &sata_device);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1290 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, cport)->
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1291 cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1292 sata_update_port_info(sata_hba_inst, &sata_device);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1293 if (rval != SATA_SUCCESS ||
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1294 (sata_device.satadev_state & SATA_PSTATE_FAILED)) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1295 cportinfo->cport_state = SATA_PSTATE_FAILED;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1296 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1297 cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1298 rv = EIO;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1299 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1300 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1301 if (cportinfo->cport_state & SATA_PSTATE_SHUTDOWN) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1302 target = TRUE;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1303 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1304 cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1305
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1306 if (SATA_PORT_ACTIVATE_FUNC(sata_hba_inst) != NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1307 /* Just let HBA driver to activate port */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1308 if ((*SATA_PORT_ACTIVATE_FUNC(sata_hba_inst))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1309 (dip, &sata_device) != SATA_SUCCESS) {
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 * Port activation failure - do not
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1312 * change port state unless the state
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1313 * returned by HBA indicates a port
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1314 * failure.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1315 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1316 mutex_enter(&SATA_CPORT_INFO(
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1317 sata_hba_inst, cport)->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1318 sata_update_port_info(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1319 &sata_device);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1320 if (sata_device.satadev_state &
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1321 SATA_PSTATE_FAILED) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1322 cportinfo->cport_state =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1323 SATA_PSTATE_FAILED;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1324 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1325 mutex_exit(&SATA_CPORT_INFO(
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1326 sata_hba_inst, cport)->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1327 SATA_LOG_D((sata_hba_inst, CE_WARN,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1328 "sata_hba_ioctl: configure: "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1329 "failed to activate SATA cport %d",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1330 cport));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1331 rv = EIO;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1332 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1333 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1334 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1335 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, cport)->
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1336 cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1337 /* Virgin port state */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1338 cportinfo->cport_state = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1339 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1340 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1341 * Always reprobe port, to get current device info.
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 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1344 if (sata_reprobe_port(sata_hba_inst, &sata_device) !=
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1345 SATA_SUCCESS) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1346 rv = EIO;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1347 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1348 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1349 if (target == FALSE &&
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1350 cportinfo->cport_dev_type != SATA_DTYPE_NONE) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1351 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1352 * That's the transition from "inactive" port to
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1353 * active with device attached.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1354 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1355 sata_log(sata_hba_inst, CE_WARN,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1356 "SATA device attached at port %d",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1357 cport);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1358 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1359
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1360 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1361 * This is where real configure starts.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1362 * Change following check for PMult support.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1363 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1364 if (!(sata_device.satadev_type & SATA_VALID_DEV_TYPE)) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1365 /* No device to configure */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1366 rv = ENXIO; /* No device to configure */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1367 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1368 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1369
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1370 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1371 * Here we may have a device in reset condition,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1372 * but because we are just configuring it, there is
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1373 * no need to process the reset other than just
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1374 * to clear device reset condition in the HBA driver.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1375 * Setting the flag SATA_EVNT_CLEAR_DEVICE_RESET will
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1376 * cause a first command sent the HBA driver with the request
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1377 * to clear device reset condition.
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 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, cport)->
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1380 cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1381 sdinfo = sata_get_device_info(sata_hba_inst, &sata_device);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1382 if (sdinfo == NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1383 rv = ENXIO;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1384 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1385 cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1386 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1387 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1388 if (sdinfo->satadrv_event_flags &
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1389 (SATA_EVNT_DEVICE_RESET | SATA_EVNT_INPROC_DEVICE_RESET))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1390 sdinfo->satadrv_event_flags = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1391 sdinfo->satadrv_event_flags |= SATA_EVNT_CLEAR_DEVICE_RESET;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1392 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1393
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1394 if ((tdip = sata_get_target_dip(dip, comp_port)) != NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1395 /* target node still exists */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1396 if (ndi_devi_online(tdip, 0) != NDI_SUCCESS) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1397 SATA_LOG_D((sata_hba_inst, CE_WARN,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1398 "sata_hba_ioctl: configure: "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1399 "onlining device at cport %d failed",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1400 cport));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1401 rv = EIO;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1402 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1403 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1404 } else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1405 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1406 * No target node - need to create a new target node.
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 tdip = sata_create_target_node(dip, sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1409 &sata_device.satadev_addr);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1410 if (tdip == NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1411 /* configure failed */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1412 SATA_LOG_D((sata_hba_inst, CE_WARN,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1413 "sata_hba_ioctl: configure: "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1414 "configuring device at cport %d "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1415 "failed", cport));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1416 rv = EIO;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1417 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1418 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1419 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1420
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1421 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1422 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1423
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1424 case DEVCTL_AP_GETSTATE:
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 sata_cfgadm_state(sata_hba_inst, comp_port, &ap_state);
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 ap_state.ap_last_change = (time_t)-1;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1429 ap_state.ap_error_code = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1430 ap_state.ap_in_transition = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1431
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1432 /* Copy the return AP-state information to the user space */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1433 if (ndi_dc_return_ap_state(&ap_state, dcp) != NDI_SUCCESS) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1434 rv = EFAULT;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1435 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1436 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1437
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1438 case DEVCTL_AP_CONTROL:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1439 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1440 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1441 * Generic devctl for hardware specific functionality
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 sata_ioctl_data_t ioc;
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 ASSERT(dcp == NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1446
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1447 /* Copy in user ioctl data first */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1448 #ifdef _MULTI_DATAMODEL
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1449 if (ddi_model_convert_from(mode & FMODELS) ==
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1450 DDI_MODEL_ILP32) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1451
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1452 sata_ioctl_data_32_t ioc32;
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 if (ddi_copyin((void *)arg, (void *)&ioc32,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1455 sizeof (ioc32), mode) != 0) {
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 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1458 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1459 ioc.cmd = (uint_t)ioc32.cmd;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1460 ioc.port = (uint_t)ioc32.port;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1461 ioc.get_size = (uint_t)ioc32.get_size;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1462 ioc.buf = (caddr_t)(uintptr_t)ioc32.buf;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1463 ioc.bufsiz = (uint_t)ioc32.bufsiz;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1464 ioc.misc_arg = (uint_t)ioc32.misc_arg;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1465 } else
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1466 #endif /* _MULTI_DATAMODEL */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1467 if (ddi_copyin((void *)arg, (void *)&ioc, sizeof (ioc),
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1468 mode) != 0) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1469 return (EFAULT);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1470 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1471
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1472 SATADBG2(SATA_DBG_IOCTL_IF, sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1473 "sata_hba_ioctl: DEVCTL_AP_CONTROL "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1474 "cmd 0x%x, port 0x%x", ioc.cmd, ioc.port);
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 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1477 * 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
1478 * a 32-bit number.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1479 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1480 if (ioc.get_size != 0 && ioc.bufsiz != (sizeof (uint32_t))) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1481 return (EINVAL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1482 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1483 /* validate address */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1484 cport = SCSI_TO_SATA_CPORT(ioc.port);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1485 pmport = SCSI_TO_SATA_PMPORT(ioc.port);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1486 qual = SCSI_TO_SATA_ADDR_QUAL(ioc.port);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1487
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1488 /* Override address qualifier - handle cport only for now */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1489 qual = SATA_ADDR_CPORT;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1490
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1491 if (sata_validate_sata_address(sata_hba_inst, cport,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1492 pmport, qual) != 0)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1493 return (EINVAL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1494
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1495 cportinfo = SATA_CPORT_INFO(sata_hba_inst, cport);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1496 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, cport)->
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1497 cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1498 /* Is the port locked by event processing daemon ? */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1499 if (cportinfo->cport_event_flags & SATA_EVNT_LOCK_PORT_BUSY) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1500 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1501 * Cannot process ioctl request now. Come back later
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1502 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1503 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1504 cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1505 return (EBUSY);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1506 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1507 /* Block event processing for this port */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1508 cportinfo->cport_event_flags |= SATA_APCTL_LOCK_PORT_BUSY;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1509 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1510
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1511
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1512 sata_device.satadev_addr.cport = cport;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1513 sata_device.satadev_addr.pmport = pmport;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1514 sata_device.satadev_rev = SATA_DEVICE_REV;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1515
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1516 switch (ioc.cmd) {
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 case SATA_CFGA_RESET_PORT:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1519 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1520 * There is no protection here for configured
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1521 * device.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1522 */
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 /* Sanity check */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1525 if (SATA_RESET_DPORT_FUNC(sata_hba_inst) == NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1526 SATA_LOG_D((sata_hba_inst, CE_WARN,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1527 "sata_hba_ioctl: "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1528 "sata_hba_tran missing required "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1529 "function sata_tran_reset_dport"));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1530 rv = EINVAL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1531 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1532 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1533
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1534 /* handle cport only for now */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1535 sata_device.satadev_addr.qual = SATA_ADDR_CPORT;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1536 if ((*SATA_RESET_DPORT_FUNC(sata_hba_inst))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1537 (dip, &sata_device) != SATA_SUCCESS) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1538 SATA_LOG_D((sata_hba_inst, CE_WARN,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1539 "sata_hba_ioctl: reset port: "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1540 "failed cport %d pmport %d",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1541 cport, pmport));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1542 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1543 cport)->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1544 sata_update_port_info(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1545 &sata_device);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1546 SATA_CPORT_STATE(sata_hba_inst, cport) =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1547 SATA_PSTATE_FAILED;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1548 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1549 cport)->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1550 rv = EIO;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1551 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1552 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1553 * Since the port was reset, it should be probed and
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1554 * attached device reinitialized. At this point the
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1555 * port state is unknown - it's state is HBA-specific.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1556 * Re-probe port to get its state.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1557 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1558 if (sata_reprobe_port(sata_hba_inst, &sata_device) !=
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1559 SATA_SUCCESS) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1560 rv = EIO;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1561 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1562 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1563 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1564
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1565 case SATA_CFGA_RESET_DEVICE:
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 * There is no protection here for configured
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1568 * device.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1569 */
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 /* Sanity check */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1572 if (SATA_RESET_DPORT_FUNC(sata_hba_inst) == NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1573 SATA_LOG_D((sata_hba_inst, CE_WARN,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1574 "sata_hba_ioctl: "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1575 "sata_hba_tran missing required "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1576 "function sata_tran_reset_dport"));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1577 rv = EINVAL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1578 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1579 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1580
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1581 /* handle only device attached to cports, for now */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1582 sata_device.satadev_addr.qual = SATA_ADDR_DCPORT;
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 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, cport)->
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1585 cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1586 sdinfo = sata_get_device_info(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1587 &sata_device);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1588 if (sdinfo == NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1589 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1590 cport)->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1591 rv = EINVAL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1592 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1593 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1594 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1595 cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1596
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1597 /* only handle cport for now */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1598 sata_device.satadev_addr.qual = SATA_ADDR_DCPORT;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1599 if ((*SATA_RESET_DPORT_FUNC(sata_hba_inst))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1600 (dip, &sata_device) != SATA_SUCCESS) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1601 SATA_LOG_D((sata_hba_inst, CE_WARN,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1602 "sata_hba_ioctl: reset device: failed "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1603 "cport %d pmport %d", cport, pmport));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1604 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1605 cport)->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1606 sata_update_port_info(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1607 &sata_device);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1608 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1609 * Device info structure remains
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1610 * attached. Another device reset or
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1611 * port disconnect/connect and re-probing is
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1612 * needed to change it's state
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 sdinfo->satadrv_state &= ~SATA_STATE_READY;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1615 sdinfo->satadrv_state |=
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1616 SATA_DSTATE_FAILED;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1617 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1618 cport)->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1619 rv = EIO;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1620 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1621 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1622 * Since the device was reset, we expect reset event
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1623 * to be reported and processed.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1624 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1625 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1626
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1627 case SATA_CFGA_RESET_ALL:
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 int tcport;
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 * There is no protection here for configured
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1633 * devices.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1634 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1635 /* Sanity check */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1636 if (SATA_RESET_DPORT_FUNC(sata_hba_inst) == NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1637 SATA_LOG_D((sata_hba_inst, CE_WARN,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1638 "sata_hba_ioctl: "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1639 "sata_hba_tran missing required "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1640 "function sata_tran_reset_dport"));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1641 rv = EINVAL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1642 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1643 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1644
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1645 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1646 * Need to lock all ports, not just one.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1647 * If any port is locked by event processing, fail
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1648 * the whole operation.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1649 * One port is already locked, but for simplicity
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1650 * lock it again.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1651 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1652 for (tcport = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1653 tcport < SATA_NUM_CPORTS(sata_hba_inst);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1654 tcport++) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1655 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1656 tcport)->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1657 if (((SATA_CPORT_INFO(sata_hba_inst, tcport)->
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1658 cport_event_flags) &
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1659 SATA_EVNT_LOCK_PORT_BUSY) != 0) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1660 rv = EBUSY;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1661 mutex_exit(
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1662 &SATA_CPORT_INFO(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1663 tcport)->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1664 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1665 } else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1666 SATA_CPORT_INFO(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1667 tcport)->cport_event_flags |=
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1668 SATA_APCTL_LOCK_PORT_BUSY;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1669 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1670 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1671 tcport)->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1672 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1673
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1674 if (rv == 0) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1675 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1676 * All cports successfully locked.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1677 * Reset main SATA controller only for now -
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1678 * no PMult.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1679 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1680 sata_device.satadev_addr.qual =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1681 SATA_ADDR_CNTRL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1682
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1683 if ((*SATA_RESET_DPORT_FUNC(sata_hba_inst))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1684 (dip, &sata_device) != SATA_SUCCESS) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1685 SATA_LOG_D((sata_hba_inst, CE_WARN,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1686 "sata_hba_ioctl: reset controller "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1687 "failed"));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1688 rv = EIO;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1689 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1690
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1691 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1692 * Since ports were reset, they should be
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1693 * re-probed and attached devices
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1694 * reinitialized.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1695 * At this point port states are unknown,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1696 * Re-probe ports to get their state -
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1697 * cports only for now.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1698 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1699 for (tcport = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1700 tcport < SATA_NUM_CPORTS(sata_hba_inst);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1701 tcport++) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1702 sata_device.satadev_addr.cport =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1703 tcport;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1704 sata_device.satadev_addr.qual =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1705 SATA_ADDR_CPORT;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1706
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1707 if (sata_reprobe_port(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1708 &sata_device) != SATA_SUCCESS)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1709 rv = EIO;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1710
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1711 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1712 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1713 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1714 * Unlock all ports
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1715 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1716 for (tcport = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1717 tcport < SATA_NUM_CPORTS(sata_hba_inst);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1718 tcport++) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1719 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1720 tcport)->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1721 SATA_CPORT_INFO(sata_hba_inst, tcport)->
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1722 cport_event_flags &=
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1723 ~SATA_APCTL_LOCK_PORT_BUSY;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1724 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1725 tcport)->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1726 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1727
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1728 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1729 * This operation returns EFAULT if either reset
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1730 * controller failed or a re-probbing of any ports
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1731 * failed.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1732 * We return here, because common return is for
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1733 * a single cport operation.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1734 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1735 return (rv);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1736 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1737
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1738 case SATA_CFGA_PORT_DEACTIVATE:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1739 /* Sanity check */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1740 if (SATA_PORT_DEACTIVATE_FUNC(sata_hba_inst) == NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1741 rv = ENOTSUP;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1742 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1743 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1744 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1745 * Arbitrarily unconfigure attached device, if any.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1746 * Even if the unconfigure fails, proceed with the
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1747 * port deactivation.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1748 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1749
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1750 /* Handle only device attached to cports, for now */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1751 sata_device.satadev_addr.qual = SATA_ADDR_DCPORT;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1752
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1753 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, cport)->
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1754 cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1755 cportinfo->cport_state &= ~SATA_STATE_READY;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1756 if (cportinfo->cport_dev_type != SATA_DTYPE_NONE) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1757 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1758 * Handle only device attached to cports,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1759 * for now
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1760 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1761 sata_device.satadev_addr.qual =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1762 SATA_ADDR_DCPORT;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1763 sdinfo = sata_get_device_info(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1764 &sata_device);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1765 if (sdinfo != NULL &&
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1766 (sdinfo->satadrv_type &
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1767 SATA_VALID_DEV_TYPE)) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1768 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1769 * If a target node exists, try to
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1770 * offline a device and remove target
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1771 * node.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1772 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1773 mutex_exit(&SATA_CPORT_INFO(
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1774 sata_hba_inst, cport)->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1775 tdip = sata_get_target_dip(dip, cport);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1776 if (tdip != NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1777 /* target node exist */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1778 SATADBG1(SATA_DBG_IOCTL_IF,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1779 sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1780 "sata_hba_ioctl: "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1781 "port deactivate: "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1782 "target node exists.",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1783 NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1784
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1785 if (ndi_devi_offline(tdip,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1786 NDI_UNCONFIG) !=
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1787 NDI_SUCCESS) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1788 SATA_LOG_D((
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1789 sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1790 CE_WARN,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1791 "sata_hba_ioctl:"
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1792 "port deactivate: "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1793 "failed to "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1794 "unconfigure "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1795 "device at cport "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1796 "%d", cport));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1797 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1798 if (ndi_devi_offline(tdip,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1799 NDI_DEVI_REMOVE) !=
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1800 NDI_SUCCESS) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1801 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1802 * Problem;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1803 * target node remained
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1804 * attached.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1805 * Too bad...
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1806 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1807 SATA_LOG_D((
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1808 sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1809 CE_WARN,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1810 "sata_hba_ioctl: "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1811 "port deactivate: "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1812 "failed to "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1813 "unconfigure "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1814 "device at "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1815 "cport %d",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1816 cport));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1817 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1818 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1819 mutex_enter(&SATA_CPORT_INFO(
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1820 sata_hba_inst, cport)->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1821 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1822 * In any case,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1823 * remove and release sata_drive_info
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1824 * structure.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1825 * (cport attached device ony, for now)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1826 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1827 SATA_CPORTINFO_DRV_INFO(cportinfo) =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1828 NULL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1829 (void) kmem_free((void *)sdinfo,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1830 sizeof (sata_drive_info_t));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1831 cportinfo->cport_dev_type =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1832 SATA_DTYPE_NONE;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1833 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1834 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1835 * Note: PMult info requires different
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1836 * handling. This comment is a placeholder for
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1837 * a code handling PMult, to be implemented
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1838 * in phase 2.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1839 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1840 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1841 cportinfo->cport_state &= ~(SATA_STATE_PROBED |
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1842 SATA_STATE_PROBING);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1843 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1844 cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1845 /* handle cport only for now */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1846 sata_device.satadev_addr.qual = SATA_ADDR_CPORT;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1847 /* Just let HBA driver to deactivate port */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1848 rval = (*SATA_PORT_DEACTIVATE_FUNC(sata_hba_inst))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1849 (dip, &sata_device);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1850 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, cport)->
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1851 cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1852 sata_update_port_info(sata_hba_inst, &sata_device);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1853 if (rval != SATA_SUCCESS) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1854 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1855 * Port deactivation failure - do not
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1856 * change port state unless the state
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1857 * returned by HBA indicates a port failure.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1858 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1859 if (sata_device.satadev_state &
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1860 SATA_PSTATE_FAILED) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1861 SATA_CPORT_STATE(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1862 cport) = SATA_PSTATE_FAILED;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1863 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1864 SATA_LOG_D((sata_hba_inst, CE_WARN,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1865 "sata_hba_ioctl: port deactivate: "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1866 "cannot deactivate SATA cport %d",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1867 cport));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1868 rv = EIO;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1869 } else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1870 cportinfo->cport_state |= SATA_PSTATE_SHUTDOWN;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1871 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1872 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1873 cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1874
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1875 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1876
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1877 case SATA_CFGA_PORT_ACTIVATE:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1878 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1879 boolean_t dev_existed = TRUE;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1880
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1881 /* Sanity check */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1882 if (SATA_PORT_ACTIVATE_FUNC(sata_hba_inst) == NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1883 rv = ENOTSUP;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1884 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1885 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1886 /* handle cport only for now */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1887 if (cportinfo->cport_state & SATA_PSTATE_SHUTDOWN ||
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1888 cportinfo->cport_dev_type == SATA_DTYPE_NONE)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1889 dev_existed = FALSE;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1890
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1891 sata_device.satadev_addr.qual = SATA_ADDR_CPORT;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1892 /* Just let HBA driver to activate port */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1893 if ((*SATA_PORT_ACTIVATE_FUNC(sata_hba_inst))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1894 (dip, &sata_device) != SATA_SUCCESS) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1895 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1896 * Port activation failure - do not
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1897 * change port state unless the state
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1898 * returned by HBA indicates a port failure.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1899 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1900 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1901 cport)->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1902 sata_update_port_info(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1903 &sata_device);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1904 if (sata_device.satadev_state &
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1905 SATA_PSTATE_FAILED) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1906 SATA_CPORT_STATE(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1907 cport) = SATA_PSTATE_FAILED;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1908 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1909 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1910 cport)->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1911 SATA_LOG_D((sata_hba_inst, CE_WARN,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1912 "sata_hba_ioctl: port activate: "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1913 "cannot activate SATA cport %d",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1914 cport));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1915 rv = EIO;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1916 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1917 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1918 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, cport)->
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1919 cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1920 cportinfo->cport_state &= ~SATA_PSTATE_SHUTDOWN;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1921 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1922 cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1923
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1924 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1925 * Re-probe port to find its current state and
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1926 * possibly attached device.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1927 * Port re-probing may change the cportinfo device
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1928 * type if device is found attached.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1929 * If port probing failed, the device type would be
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1930 * set to SATA_DTYPE_NONE.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1931 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1932 (void) sata_reprobe_port(sata_hba_inst, &sata_device);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1933
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1934 if (dev_existed == FALSE &&
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1935 cportinfo->cport_dev_type != SATA_DTYPE_NONE) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1936 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1937 * That's the transition from "inactive" port
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1938 * state or active port without a device
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1939 * attached to the active port state with
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1940 * a device attached.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1941 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1942 sata_log(sata_hba_inst, CE_WARN,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1943 "SATA device attached at port %d", cport);
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 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1947 }
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 case SATA_CFGA_PORT_SELF_TEST:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1950
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1951 /* Sanity check */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1952 if (SATA_SELFTEST_FUNC(sata_hba_inst) == NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1953 rv = ENOTSUP;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1954 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1955 }
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 * There is no protection here for a configured
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1958 * device attached to this port.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1959 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1960
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1961 /* only handle cport for now */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1962 sata_device.satadev_addr.qual = SATA_ADDR_CPORT;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1963
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1964 if ((*SATA_SELFTEST_FUNC(sata_hba_inst))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1965 (dip, &sata_device) != SATA_SUCCESS) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1966 SATA_LOG_D((sata_hba_inst, CE_WARN,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1967 "sata_hba_ioctl: port selftest: "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1968 "failed cport %d pmport %d",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1969 cport, pmport));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1970 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1971 cport)->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1972 sata_update_port_info(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1973 &sata_device);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1974 SATA_CPORT_STATE(sata_hba_inst, cport) =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1975 SATA_PSTATE_FAILED;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1976 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1977 cport)->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1978 rv = EIO;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1979 break;
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 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1982 * Since the port was reset, it should be probed and
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1983 * attached device reinitialized. At this point the
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1984 * port state is unknown - it's state is HBA-specific.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1985 * Force port re-probing to get it into a known state.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1986 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1987 if (sata_reprobe_port(sata_hba_inst, &sata_device) !=
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1988 SATA_SUCCESS) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1989 rv = EIO;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1990 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1991 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1992 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1993
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1994 case SATA_CFGA_GET_DEVICE_PATH:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1995 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1996 char path[MAXPATHLEN];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1997 uint32_t size;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1998
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1999 (void) strcpy(path, "/devices");
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2000 if ((tdip = sata_get_target_dip(dip, ioc.port)) ==
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2001 NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2002
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2003 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2004 * No such device.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2005 * If this is a request for a size, do not
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2006 * return EINVAL for non-exisiting target,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2007 * because cfgadm will indicate a meaningless
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2008 * ioctl failure.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2009 * If this is a real request for a path,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2010 * indicate invalid argument.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2011 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2012 if (!ioc.get_size) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2013 rv = EINVAL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2014 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2015 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2016 } else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2017 (void) ddi_pathname(tdip, path + strlen(path));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2018 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2019 size = strlen(path) + 1;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2020
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2021 if (ioc.get_size) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2022 if (ddi_copyout((void *)&size,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2023 ioc.buf, ioc.bufsiz, mode) != 0) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2024 rv = EFAULT;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2025 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2026 } else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2027 if (ioc.bufsiz != size) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2028 rv = EINVAL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2029 } else if (ddi_copyout((void *)&path,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2030 ioc.buf, ioc.bufsiz, mode) != 0) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2031 rv = EFAULT;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2032 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2033 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2034 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2035 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2036
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2037 case SATA_CFGA_GET_AP_TYPE:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2038 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2039 uint32_t type_len;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2040 const char *ap_type;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2041
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2042 /* cport only, no port multiplier support */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2043 switch (SATA_CPORT_DEV_TYPE(sata_hba_inst, cport)) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2044 case SATA_DTYPE_NONE:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2045 ap_type = "port";
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2046 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2047
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2048 case SATA_DTYPE_ATADISK:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2049 ap_type = "disk";
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2050 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2051
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2052 case SATA_DTYPE_ATAPICD:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2053 ap_type = "cd/dvd";
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2054 break;
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 case SATA_DTYPE_PMULT:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2057 ap_type = "pmult";
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2058 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2059
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2060 case SATA_DTYPE_UNKNOWN:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2061 ap_type = "unknown";
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2062 break;
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 default:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2065 ap_type = "unsupported";
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2066 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2067
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2068 } /* end of dev_type switch */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2069
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2070 type_len = strlen(ap_type) + 1;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2071
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2072 if (ioc.get_size) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2073 if (ddi_copyout((void *)&type_len,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2074 ioc.buf, ioc.bufsiz, mode) != 0) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2075 rv = EFAULT;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2076 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2077 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2078 } else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2079 if (ioc.bufsiz != type_len) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2080 rv = EINVAL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2081 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2082 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2083 if (ddi_copyout((void *)ap_type, ioc.buf,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2084 ioc.bufsiz, mode) != 0) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2085 rv = EFAULT;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2086 break;
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
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2090 break;
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 case SATA_CFGA_GET_MODEL_INFO:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2094 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2095 uint32_t info_len;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2096 char ap_info[sizeof (sdinfo->satadrv_id.ai_model) + 1];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2097
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2098 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2099 * This operation should return to cfgadm the
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2100 * device model information string
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2101 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2102 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, cport)->
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2103 cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2104 /* only handle device connected to cport for now */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2105 sata_device.satadev_addr.qual = SATA_ADDR_DCPORT;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2106 sdinfo = sata_get_device_info(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2107 &sata_device);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2108 if (sdinfo == NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2109 rv = EINVAL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2110 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2111 cport)->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2112 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2113 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2114 bcopy(sdinfo->satadrv_id.ai_model, ap_info,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2115 sizeof (sdinfo->satadrv_id.ai_model));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2116 swab(ap_info, ap_info,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2117 sizeof (sdinfo->satadrv_id.ai_model));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2118 ap_info[sizeof (sdinfo->satadrv_id.ai_model)] = '\0';
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2119
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2120 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2121 cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2122
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2123 info_len = strlen(ap_info) + 1;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2124
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2125 if (ioc.get_size) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2126 if (ddi_copyout((void *)&info_len,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2127 ioc.buf, ioc.bufsiz, mode) != 0) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2128 rv = EFAULT;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2129 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2130 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2131 } else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2132 if (ioc.bufsiz < info_len) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2133 rv = EINVAL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2134 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2135 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2136 if (ddi_copyout((void *)ap_info, ioc.buf,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2137 ioc.bufsiz, mode) != 0) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2138 rv = EFAULT;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2139 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2140 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2141 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2142
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2143 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2144 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2145
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2146 case SATA_CFGA_GET_REVFIRMWARE_INFO:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2147 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2148 uint32_t info_len;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2149 char ap_info[
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2150 sizeof (sdinfo->satadrv_id.ai_fw) + 1];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2151
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2152 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2153 * This operation should return to cfgadm the
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2154 * device firmware revision information string
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 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, cport)->
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2157 cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2158 /* only handle device connected to cport for now */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2159 sata_device.satadev_addr.qual = SATA_ADDR_DCPORT;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2160
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2161 sdinfo = sata_get_device_info(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2162 &sata_device);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2163 if (sdinfo == NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2164 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2165 cport)->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2166 rv = EINVAL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2167 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2168 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2169 bcopy(sdinfo->satadrv_id.ai_fw, ap_info,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2170 sizeof (sdinfo->satadrv_id.ai_fw));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2171 swab(ap_info, ap_info,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2172 sizeof (sdinfo->satadrv_id.ai_fw));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2173 ap_info[sizeof (sdinfo->satadrv_id.ai_fw)] = '\0';
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2174
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2175 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2176 cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2177
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2178 info_len = strlen(ap_info) + 1;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2179
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2180 if (ioc.get_size) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2181 if (ddi_copyout((void *)&info_len,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2182 ioc.buf, ioc.bufsiz, mode) != 0) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2183 rv = EFAULT;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2184 break;
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 } else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2187 if (ioc.bufsiz < info_len) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2188 rv = EINVAL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2189 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2190 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2191 if (ddi_copyout((void *)ap_info, ioc.buf,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2192 ioc.bufsiz, mode) != 0) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2193 rv = EFAULT;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2194 break;
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 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2197
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2198 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2199 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2200
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2201 case SATA_CFGA_GET_SERIALNUMBER_INFO:
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 uint32_t info_len;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2204 char ap_info[
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2205 sizeof (sdinfo->satadrv_id.ai_drvser) + 1];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2206
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2207 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2208 * This operation should return to cfgadm the
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2209 * device serial number information string
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2210 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2211 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, cport)->
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2212 cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2213 /* only handle device connected to cport for now */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2214 sata_device.satadev_addr.qual = SATA_ADDR_DCPORT;
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 sdinfo = sata_get_device_info(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2217 &sata_device);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2218 if (sdinfo == NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2219 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2220 cport)->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2221 rv = EINVAL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2222 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2223 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2224 bcopy(sdinfo->satadrv_id.ai_drvser, ap_info,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2225 sizeof (sdinfo->satadrv_id.ai_drvser));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2226 swab(ap_info, ap_info,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2227 sizeof (sdinfo->satadrv_id.ai_drvser));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2228 ap_info[sizeof (sdinfo->satadrv_id.ai_drvser)] = '\0';
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2229
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2230 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2231 cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2232
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2233 info_len = strlen(ap_info) + 1;
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 (ioc.get_size) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2236 if (ddi_copyout((void *)&info_len,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2237 ioc.buf, ioc.bufsiz, mode) != 0) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2238 rv = EFAULT;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2239 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2240 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2241 } else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2242 if (ioc.bufsiz < info_len) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2243 rv = EINVAL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2244 break;
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 (ddi_copyout((void *)ap_info, ioc.buf,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2247 ioc.bufsiz, mode) != 0) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2248 rv = EFAULT;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2249 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2250 }
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 break;
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 default:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2257 rv = EINVAL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2258 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2259
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2260 } /* End of DEVCTL_AP_CONTROL cmd switch */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2261
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2262 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2263 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2264
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2265 default:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2266 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2267 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2268 * If we got here, we got an IOCTL that SATA HBA Framework
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2269 * does not recognize. Pass ioctl to HBA driver, in case
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2270 * it could process it.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2271 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2272 sata_hba_tran_t *sata_tran = sata_hba_inst->satahba_tran;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2273 dev_info_t *mydip = SATA_DIP(sata_hba_inst);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2274
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2275 SATADBG1(SATA_DBG_IOCTL_IF, sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2276 "IOCTL 0x%2x not supported in SATA framework, "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2277 "passthrough to HBA", cmd);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2278
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2279 if (sata_tran->sata_tran_ioctl == NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2280 rv = EINVAL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2281 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2282 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2283 rval = (*sata_tran->sata_tran_ioctl)(mydip, cmd, arg);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2284 if (rval != 0) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2285 SATADBG1(SATA_DBG_IOCTL_IF, sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2286 "IOCTL 0x%2x failed in HBA", cmd);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2287 rv = rval;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2288 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2289 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2290 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2291
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2292 } /* End of main IOCTL switch */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2293
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2294 if (dcp) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2295 ndi_dc_freehdl(dcp);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2296 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2297 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2298 cportinfo->cport_event_flags &= ~SATA_APCTL_LOCK_PORT_BUSY;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2299 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2300
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2301 return (rv);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2302 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2303
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2304
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2305
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2306
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2307 /* ****************** SCSA required entry points *********************** */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2308
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2309 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2310 * Implementation of scsi tran_tgt_init.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2311 * sata_scsi_tgt_init() initializes scsi_device structure
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2312 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2313 * If successful, DDI_SUCCESS is returned.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2314 * DDI_FAILURE is returned if addressed device does not exist
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2315 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2316
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2317 static int
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2318 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
2319 scsi_hba_tran_t *hba_tran, struct scsi_device *sd)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2320 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2321 #ifndef __lock_lint
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2322 _NOTE(ARGUNUSED(hba_dip))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2323 #endif
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2324 sata_device_t sata_device;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2325 sata_drive_info_t *sdinfo;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2326 sata_hba_inst_t *sata_hba_inst;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2327
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2328 sata_hba_inst = (sata_hba_inst_t *)(hba_tran->tran_hba_private);
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 /* Validate scsi device address */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2331 if (sata_validate_scsi_address(sata_hba_inst, &sd->sd_address,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2332 &sata_device) != 0)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2333 return (DDI_FAILURE);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2334
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2335 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2336 sata_device.satadev_addr.cport)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2337
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2338 /* sata_device now contains a valid sata address */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2339 sdinfo = sata_get_device_info(sata_hba_inst, &sata_device);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2340 if (sdinfo == NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2341 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2342 sata_device.satadev_addr.cport)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2343 return (DDI_FAILURE);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2344 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2345 if (sata_device.satadev_type == SATA_DTYPE_ATAPICD) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2346 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2347 sata_device.satadev_addr.cport)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2348 if (ndi_prop_update_string(DDI_DEV_T_NONE, tgt_dip,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2349 "variant", "atapi") != DDI_PROP_SUCCESS) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2350 SATA_LOG_D((sata_hba_inst, CE_WARN,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2351 "sata_scsi_tgt_init: variant atapi "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2352 "property could not be created"));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2353 return (DDI_FAILURE);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2354 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2355 return (DDI_SUCCESS);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2356 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2357 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2358 sata_device.satadev_addr.cport)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2359 return (DDI_SUCCESS);
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
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 * Implementation of scsi tran_tgt_probe.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2364 * Probe target, by calling default scsi routine scsi_hba_probe()
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2365 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2366 static int
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2367 sata_scsi_tgt_probe(struct scsi_device *sd, int (*callback)(void))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2368 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2369 sata_hba_inst_t *sata_hba_inst =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2370 (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
2371 int rval;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2372
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2373 rval = scsi_hba_probe(sd, callback);
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 if (rval == SCSIPROBE_EXISTS) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2376 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2377 * Set property "pm-capable" on the target device node, so that
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2378 * the target driver will not try to fetch scsi cycle counters
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2379 * before enabling device power-management.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2380 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2381 if ((ddi_prop_update_int(DDI_DEV_T_NONE, sd->sd_dev,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2382 "pm-capable", 1)) != DDI_PROP_SUCCESS) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2383 sata_log(sata_hba_inst, CE_WARN,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2384 "device at port %d: will not be power-managed ",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2385 SCSI_TO_SATA_CPORT(sd->sd_address.a_target));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2386 SATA_LOG_D((sata_hba_inst, CE_WARN,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2387 "failure updating pm-capable property"));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2388 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2389 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2390 return (rval);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2391 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2392
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 * Implementation of scsi tran_tgt_free.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2395 * Release all resources allocated for scsi_device
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 static void
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2398 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
2399 scsi_hba_tran_t *hba_tran, struct scsi_device *sd)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2400 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2401 #ifndef __lock_lint
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2402 _NOTE(ARGUNUSED(hba_dip))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2403 #endif
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2404 sata_device_t sata_device;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2405 sata_drive_info_t *sdinfo;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2406 sata_hba_inst_t *sata_hba_inst;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2407
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2408 sata_hba_inst = (sata_hba_inst_t *)(hba_tran->tran_hba_private);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2409
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2410 /* Validate scsi device address */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2411 if (sata_validate_scsi_address(sata_hba_inst, &sd->sd_address,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2412 &sata_device) != 0)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2413 return;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2414
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2415 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2416 sata_device.satadev_addr.cport)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2417
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2418 /* sata_device now should contain a valid sata address */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2419 sdinfo = sata_get_device_info(sata_hba_inst, &sata_device);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2420 if (sdinfo == NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2421 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2422 sata_device.satadev_addr.cport)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2423 return;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2424 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2425 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2426 * We did not allocate any resources in sata_scsi_tgt_init()
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2427 * other than property for ATAPI device, if any
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2428 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2429 if (sata_device.satadev_type == SATA_DTYPE_ATAPICD) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2430 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2431 sata_device.satadev_addr.cport)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2432 if (ndi_prop_remove(DDI_DEV_T_NONE, tgt_dip, "variant") !=
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2433 DDI_PROP_SUCCESS)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2434 SATA_LOG_D((sata_hba_inst, CE_WARN,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2435 "sata_scsi_tgt_free: variant atapi "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2436 "property could not be removed"));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2437 } else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2438 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2439 sata_device.satadev_addr.cport)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2440 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2441 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2442
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2443 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2444 * Implementation of scsi tran_init_pkt
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2445 * Upon successful return, scsi pkt buffer has DMA resources allocated.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2446 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2447 * 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
2448 * for non-existing device - just use some default for dma_attr.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2449 * 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
2450 * Subsequent call to sata_scsi_start may fail appropriately.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2451 * Simply returning NULL does not seem to discourage a target driver...
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2452 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2453 * Returns a pointer to initialized scsi_pkt, or NULL otherwise.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2454 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2455 static struct scsi_pkt *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2456 sata_scsi_init_pkt(struct scsi_address *ap, struct scsi_pkt *pkt,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2457 struct buf *bp, int cmdlen, int statuslen, int tgtlen, int flags,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2458 int (*callback)(caddr_t), caddr_t arg)
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 sata_hba_inst_t *sata_hba_inst =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2461 (sata_hba_inst_t *)(ap->a_hba_tran->tran_hba_private);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2462 dev_info_t *dip = SATA_DIP(sata_hba_inst);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2463 sata_device_t sata_device;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2464 sata_drive_info_t *sdinfo;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2465 sata_pkt_txlate_t *spx;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2466 ddi_dma_attr_t cur_dma_attr;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2467 int rval;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2468 boolean_t new_pkt = TRUE;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2469
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2470 ASSERT(ap->a_hba_tran->tran_hba_dip == dip);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2471
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2472 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2473 * We need to translate the address, even if it could be
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2474 * a bogus one, for a non-existing device
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2475 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2476 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
2477 sata_device.satadev_addr.cport = SCSI_TO_SATA_CPORT(ap->a_target);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2478 sata_device.satadev_addr.pmport = SCSI_TO_SATA_PMPORT(ap->a_target);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2479 sata_device.satadev_rev = SATA_DEVICE_REV;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2480
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2481 if (pkt == NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2482 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2483 * Have to allocate a brand new scsi packet.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2484 * We need to operate with auto request sense enabled.
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 pkt = scsi_hba_pkt_alloc(dip, ap, cmdlen,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2487 MAX(statuslen, sizeof (struct scsi_arq_status)),
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2488 tgtlen, sizeof (sata_pkt_txlate_t), callback, arg);
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 if (pkt == NULL)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2491 return (NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2492
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2493 /* Fill scsi packet structure */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2494 pkt->pkt_comp = (void (*)())NULL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2495 pkt->pkt_time = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2496 pkt->pkt_resid = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2497 pkt->pkt_statistics = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2498 pkt->pkt_reason = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2499
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2500 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2501 * pkt_hba_private will point to sata pkt txlate structure
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2502 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2503 spx = (sata_pkt_txlate_t *)pkt->pkt_ha_private;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2504 bzero(spx, sizeof (sata_pkt_txlate_t));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2505
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2506 spx->txlt_scsi_pkt = pkt;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2507 spx->txlt_sata_hba_inst = sata_hba_inst;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2508
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2509 /* Allocate sata_pkt */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2510 spx->txlt_sata_pkt = sata_pkt_alloc(spx, callback);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2511 if (spx->txlt_sata_pkt == NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2512 /* Could not allocate sata pkt */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2513 scsi_hba_pkt_free(ap, pkt);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2514 return (NULL);
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 /* Set sata address */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2517 spx->txlt_sata_pkt->satapkt_device = sata_device;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2518
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2519 if ((bp == NULL) || (bp->b_bcount == 0))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2520 return (pkt);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2521
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2522 spx->txlt_total_residue = bp->b_bcount;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2523 } else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2524 new_pkt = FALSE;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2525 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2526 * Packet was preallocated/initialized by previous call
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2527 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2528 spx = (sata_pkt_txlate_t *)pkt->pkt_ha_private;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2529
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2530 if ((bp == NULL) || (bp->b_bcount == 0)) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2531 return (pkt);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2532 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2533 ASSERT(spx->txlt_buf_dma_handle != NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2534
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2535 /* Pkt is available already: spx->txlt_scsi_pkt == pkt; */
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
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2538 spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp = bp;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2539
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2540 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2541 * We use an adjusted version of the dma_attr, to account
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2542 * for device addressing limitations.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2543 * sata_adjust_dma_attr() will handle sdinfo == NULL which may
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2544 * happen when a device is not yet configured.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2545 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2546 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2547 sata_device.satadev_addr.cport)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2548 sdinfo = sata_get_device_info(spx->txlt_sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2549 &spx->txlt_sata_pkt->satapkt_device);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2550 /* NULL sdinfo may be passsed to sata_adjust_dma_attr() */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2551 sata_adjust_dma_attr(sdinfo,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2552 SATA_DMA_ATTR(spx->txlt_sata_hba_inst), &cur_dma_attr);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2553 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2554 sata_device.satadev_addr.cport)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2555 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2556 * Allocate necessary DMA resources for the packet's buffer
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2557 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2558 if ((rval = sata_dma_buf_setup(spx, flags, callback, arg,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2559 &cur_dma_attr)) != DDI_SUCCESS) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2560 sata_pkt_free(spx);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2561 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2562 * If a DMA allocation request fails with
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2563 * DDI_DMA_NOMAPPING, indicate the error by calling
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2564 * bioerror(9F) with bp and an error code of EFAULT.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2565 * If a DMA allocation request fails with
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2566 * DDI_DMA_TOOBIG, indicate the error by calling
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2567 * bioerror(9F) with bp and an error code of EINVAL.
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 switch (rval) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2570 case DDI_DMA_NORESOURCES:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2571 bioerror(bp, 0);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2572 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2573 case DDI_DMA_NOMAPPING:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2574 case DDI_DMA_BADATTR:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2575 bioerror(bp, EFAULT);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2576 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2577 case DDI_DMA_TOOBIG:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2578 default:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2579 bioerror(bp, EINVAL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2580 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2581 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2582 if (new_pkt == TRUE) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2583 sata_pkt_free(spx);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2584 scsi_hba_pkt_free(ap, pkt);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2585 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2586 return (NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2587 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2588 /* Set number of bytes that are not yet accounted for */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2589 pkt->pkt_resid = spx->txlt_total_residue;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2590 ASSERT(pkt->pkt_resid >= 0);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2591
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2592 return (pkt);
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
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2595 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2596 * Implementation of scsi tran_start.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2597 * Translate scsi cmd into sata operation and return status.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2598 * Supported scsi commands:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2599 * SCMD_INQUIRY
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2600 * SCMD_TEST_UNIT_READY
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2601 * SCMD_START_STOP
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2602 * SCMD_READ_CAPACITY
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2603 * SCMD_REQUEST_SENSE
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2604 * SCMD_LOG_SENSE_G1 (unimplemented)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2605 * SCMD_LOG_SELECT_G1 (unimplemented)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2606 * SCMD_MODE_SENSE (specific pages)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2607 * SCMD_MODE_SENSE_G1 (specific pages)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2608 * SCMD_MODE_SELECT (specific pages)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2609 * SCMD_MODE_SELECT_G1 (specific pages)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2610 * SCMD_SYNCHRONIZE_CACHE
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2611 * SCMD_SYNCHRONIZE_CACHE_G1
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2612 * SCMD_READ
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2613 * SCMD_READ_G1
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2614 * SCMD_READ_G4
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2615 * SCMD_READ_G5
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2616 * SCMD_WRITE
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2617 * SCMD_WRITE_G1
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2618 * SCMD_WRITE_G4
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2619 * SCMD_WRITE_G5
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2620 * SCMD_SEEK (noop)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2621 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2622 * All other commands are rejected as unsupported.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2623 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2624 * Returns:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2625 * TRAN_ACCEPT if command was executed successfully or accepted by HBA driver
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2626 * for execution.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2627 * TRAN_BADPKT if cmd was directed to invalid address.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2628 * TRAN_FATAL_ERROR is command was rejected due to hardware error, including
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2629 * unexpected removal of a device or some other unspecified error.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2630 * 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
2631 * framework was busy performing some other operation(s).
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 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2634 static int
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2635 sata_scsi_start(struct scsi_address *ap, struct scsi_pkt *pkt)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2636 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2637 sata_hba_inst_t *sata_hba_inst =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2638 (sata_hba_inst_t *)(ap->a_hba_tran->tran_hba_private);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2639 sata_pkt_txlate_t *spx = (sata_pkt_txlate_t *)pkt->pkt_ha_private;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2640 sata_drive_info_t *sdinfo;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2641 struct buf *bp;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2642 int cport;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2643 int rval;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2644
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2645 SATADBG1(SATA_DBG_SCSI_IF, sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2646 "sata_scsi_start: cmd 0x%02x\n", pkt->pkt_cdbp[0]);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2647
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2648 ASSERT(spx != NULL &&
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2649 spx->txlt_scsi_pkt == pkt && spx->txlt_sata_pkt != NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2650
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2651 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2652 * Mutex-protected section below is just to identify device type
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2653 * and switch to ATAPI processing, if necessary
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2654 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2655 cport = SCSI_TO_SATA_CPORT(ap->a_target);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2656
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2657 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2658
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2659 sdinfo = sata_get_device_info(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2660 &spx->txlt_sata_pkt->satapkt_device);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2661 if (sdinfo == NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2662 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2663 spx->txlt_scsi_pkt->pkt_reason = CMD_DEV_GONE;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2664 return (TRAN_FATAL_ERROR);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2665 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2666
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2667 if (sdinfo->satadrv_type == SATA_DTYPE_ATAPICD) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2668 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2669 rval = sata_txlt_atapi(spx);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2670 SATADBG1(SATA_DBG_SCSI_IF, sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2671 "sata_scsi_start atapi: rval %d\n", rval);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2672 return (rval);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2673 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2674 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2675
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2676 /* ATA Disk commands processing starts here */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2677
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2678 bp = spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2679
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2680 switch (pkt->pkt_cdbp[0]) {
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 case SCMD_INQUIRY:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2683 /* Mapped to identify device */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2684 if (bp != NULL && (bp->b_flags & (B_PHYS | B_PAGEIO)))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2685 bp_mapin(bp);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2686 rval = sata_txlt_inquiry(spx);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2687 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2688
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2689 case SCMD_TEST_UNIT_READY:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2690 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2691 * SAT "SATA to ATA Translation" doc specifies translation
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2692 * to ATA CHECK POWER MODE.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2693 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2694 rval = sata_txlt_test_unit_ready(spx);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2695 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2696
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2697 case SCMD_START_STOP:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2698 /* Mapping depends on the command */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2699 rval = sata_txlt_start_stop_unit(spx);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2700 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2701
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2702 case SCMD_READ_CAPACITY:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2703 if (bp != NULL && (bp->b_flags & (B_PHYS | B_PAGEIO)))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2704 bp_mapin(bp);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2705 rval = sata_txlt_read_capacity(spx);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2706 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2707
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2708 case SCMD_REQUEST_SENSE:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2709 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2710 * Always No Sense, since we force ARQ
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2711 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2712 if (bp != NULL && (bp->b_flags & (B_PHYS | B_PAGEIO)))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2713 bp_mapin(bp);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2714 rval = sata_txlt_request_sense(spx);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2715 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2716
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2717 case SCMD_LOG_SENSE_G1:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2718 if (bp != NULL && (bp->b_flags & (B_PHYS | B_PAGEIO)))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2719 bp_mapin(bp);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2720 rval = sata_txlt_log_sense(spx);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2721 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2722
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2723 case SCMD_LOG_SELECT_G1:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2724 if (bp != NULL && (bp->b_flags & (B_PHYS | B_PAGEIO)))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2725 bp_mapin(bp);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2726 rval = sata_txlt_log_select(spx);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2727 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2728
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2729 case SCMD_MODE_SENSE:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2730 case SCMD_MODE_SENSE_G1:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2731 if (bp != NULL && (bp->b_flags & (B_PHYS | B_PAGEIO)))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2732 bp_mapin(bp);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2733 rval = sata_txlt_mode_sense(spx);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2734 break;
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
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2737 case SCMD_MODE_SELECT:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2738 case SCMD_MODE_SELECT_G1:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2739 if (bp != NULL && (bp->b_flags & (B_PHYS | B_PAGEIO)))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2740 bp_mapin(bp);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2741 rval = sata_txlt_mode_select(spx);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2742 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2743
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2744 case SCMD_SYNCHRONIZE_CACHE:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2745 case SCMD_SYNCHRONIZE_CACHE_G1:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2746 rval = sata_txlt_synchronize_cache(spx);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2747 break;
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 case SCMD_READ:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2750 case SCMD_READ_G1:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2751 case SCMD_READ_G4:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2752 case SCMD_READ_G5:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2753 rval = sata_txlt_read(spx);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2754 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2755
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2756 case SCMD_WRITE:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2757 case SCMD_WRITE_G1:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2758 case SCMD_WRITE_G4:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2759 case SCMD_WRITE_G5:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2760 rval = sata_txlt_write(spx);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2761 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2762
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2763 case SCMD_SEEK:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2764 rval = sata_txlt_nodata_cmd_immediate(spx);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2765 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2766
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2767
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2768 /* Other cases will be filed later */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2769 /* postponed until phase 2 of the development */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2770 default:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2771 rval = sata_txlt_invalid_command(spx);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2772 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2773 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2774
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2775 SATADBG1(SATA_DBG_SCSI_IF, sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2776 "sata_scsi_start: rval %d\n", rval);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2777
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2778 return (rval);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2779 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2780
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2781 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2782 * Implementation of scsi tran_abort.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2783 * Abort specific pkt or all packets.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2784 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2785 * Returns 1 if one or more packets were aborted, returns 0 otherwise
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 * May be called from an interrupt level.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2788 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2789 static int
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2790 sata_scsi_abort(struct scsi_address *ap, struct scsi_pkt *scsi_pkt)
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_pkt_t *sata_pkt;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2796
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2797 SATADBG2(SATA_DBG_SCSI_IF, sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2798 "sata_scsi_abort: %s at target: 0x%x\n",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2799 scsi_pkt == NULL ? "all packets" : "one pkt", ap->a_target);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2800
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2801 /* Validate address */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2802 if (sata_validate_scsi_address(sata_hba_inst, ap, &sata_device) != 0)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2803 /* Invalid address */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2804 return (0);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2805
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2806 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2807 sata_device.satadev_addr.cport)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2808 if (sata_get_device_info(sata_hba_inst, &sata_device) == NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2809 /* invalid address */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2810 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2811 sata_device.satadev_addr.cport)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2812 return (0);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2813 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2814 if (scsi_pkt == NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2815 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2816 * Abort all packets.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2817 * Although we do not have specific packet, we still need
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2818 * dummy packet structure to pass device address to HBA.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2819 * Allocate one, without sleeping. Fail if pkt cannot be
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2820 * allocated.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2821 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2822 sata_pkt = kmem_zalloc(sizeof (sata_pkt_t), KM_NOSLEEP);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2823 if (sata_pkt == NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2824 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2825 sata_device.satadev_addr.cport)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2826 SATA_LOG_D((sata_hba_inst, CE_WARN, "sata_pkt_abort: "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2827 "could not allocate sata_pkt"));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2828 return (0);
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 sata_pkt->satapkt_rev = SATA_PKT_REV;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2831 sata_pkt->satapkt_device = sata_device;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2832 sata_pkt->satapkt_device.satadev_rev = SATA_DEVICE_REV;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2833 } else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2834 if (scsi_pkt->pkt_ha_private == NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2835 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2836 sata_device.satadev_addr.cport)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2837 return (0); /* Bad scsi pkt */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2838 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2839 /* extract pointer to sata pkt */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2840 sata_pkt = ((sata_pkt_txlate_t *)scsi_pkt->pkt_ha_private)->
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2841 txlt_sata_pkt;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2842 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2843
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2844 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2845 sata_device.satadev_addr.cport)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2846 /* Send abort request to HBA */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2847 if ((*SATA_ABORT_FUNC(sata_hba_inst))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2848 (SATA_DIP(sata_hba_inst), sata_pkt,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2849 scsi_pkt == NULL ? SATA_ABORT_ALL_PACKETS : SATA_ABORT_PACKET) ==
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2850 SATA_SUCCESS) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2851 if (scsi_pkt == NULL)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2852 kmem_free(sata_pkt, sizeof (sata_pkt_t));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2853 /* Success */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2854 return (1);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2855 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2856 /* Else, something did not go right */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2857 if (scsi_pkt == NULL)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2858 kmem_free(sata_pkt, sizeof (sata_pkt_t));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2859 /* Failure */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2860 return (0);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2861 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2862
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2863
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2864 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2865 * Implementation os scsi tran_reset.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2866 * RESET_ALL request is translated into port reset.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2867 * RESET_TARGET requests is translated into a device reset,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2868 * RESET_LUN request is accepted only for LUN 0 and translated into
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2869 * device reset.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2870 * The target reset should cause all HBA active and queued packets to
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2871 * be terminated and returned with pkt reason SATA_PKT_RESET prior to
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2872 * the return. HBA should report reset event for the device.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2873 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2874 * Returns 1 upon success, 0 upon failure.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2875 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2876 static int
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2877 sata_scsi_reset(struct scsi_address *ap, int level)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2878 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2879 sata_hba_inst_t *sata_hba_inst =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2880 (sata_hba_inst_t *)(ap->a_hba_tran->tran_hba_private);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2881 sata_device_t sata_device;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2882 int val;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2883
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2884 SATADBG2(SATA_DBG_SCSI_IF, sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2885 "sata_scsi_reset: level %d target: 0x%x\n",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2886 level, ap->a_target);
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 /* Validate address */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2889 val = sata_validate_scsi_address(sata_hba_inst, ap, &sata_device);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2890 if (val == -1)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2891 /* Invalid address */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2892 return (0);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2893
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2894 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2895 sata_device.satadev_addr.cport)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2896 if (sata_get_device_info(sata_hba_inst, &sata_device) == NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2897 /* invalid address */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2898 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2899 sata_device.satadev_addr.cport)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2900 return (0);
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 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2903 sata_device.satadev_addr.cport)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2904 if (level == RESET_ALL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2905 /* port reset - cport only */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2906 sata_device.satadev_addr.qual = SATA_ADDR_CPORT;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2907 if ((*SATA_RESET_DPORT_FUNC(sata_hba_inst))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2908 (SATA_DIP(sata_hba_inst), &sata_device) == SATA_SUCCESS)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2909 return (1);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2910 else
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2911 return (0);
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 } else if (val == 0 &&
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2914 (level == RESET_TARGET || level == RESET_LUN)) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2915 /* reset device (device attached) */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2916 if ((*SATA_RESET_DPORT_FUNC(sata_hba_inst))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2917 (SATA_DIP(sata_hba_inst), &sata_device) == SATA_SUCCESS)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2918 return (1);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2919 else
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2920 return (0);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2921 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2922 return (0);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2923 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2924
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2925
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 * Implementation of scsi tran_getcap (get transport/device capabilities).
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2928 * Supported capabilities:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2929 * auto-rqsense (always supported)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2930 * tagged-qing (supported if HBA supports it)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2931 * dma_max
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2932 * interconnect-type (INTERCONNECT_SATA)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2933 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2934 * Request for other capabilities is rejected as unsupported.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2935 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2936 * Returns supported capability value, or -1 if capability is unsuppported or
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2937 * the address is invalid (no device).
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2938 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2939
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2940 static int
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2941 sata_scsi_getcap(struct scsi_address *ap, char *cap, int whom)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2942 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2943
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2944 sata_hba_inst_t *sata_hba_inst =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2945 (sata_hba_inst_t *)(ap->a_hba_tran->tran_hba_private);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2946 sata_device_t sata_device;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2947 sata_drive_info_t *sdinfo;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2948 ddi_dma_attr_t adj_dma_attr;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2949 int rval;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2950
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2951 SATADBG2(SATA_DBG_SCSI_IF, sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2952 "sata_scsi_getcap: target: 0x%x, cap: %s\n",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2953 ap->a_target, cap);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2954
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2955 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2956 * We want to process the capabilities on per port granularity.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2957 * So, we are specifically restricting ourselves to whom != 0
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2958 * to exclude the controller wide handling.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2959 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2960 if (cap == NULL || whom == 0)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2961 return (-1);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2962
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2963 if (sata_validate_scsi_address(sata_hba_inst, ap, &sata_device) != 0) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2964 /* Invalid address */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2965 return (-1);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2966 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2967 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2968 sata_device.satadev_addr.cport)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2969 if ((sdinfo = sata_get_device_info(sata_hba_inst, &sata_device)) ==
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2970 NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2971 /* invalid address */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2972 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2973 sata_device.satadev_addr.cport)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2974 return (0);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2975 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2976
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2977 switch (scsi_hba_lookup_capstr(cap)) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2978 case SCSI_CAP_ARQ:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2979 rval = 1; /* ARQ supported, turned on */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2980 break;
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 case SCSI_CAP_SECTOR_SIZE:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2983 if (sdinfo->satadrv_type == SATA_DTYPE_ATADISK)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2984 rval = SATA_DISK_SECTOR_SIZE; /* fixed size */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2985 else if (sdinfo->satadrv_type == SATA_DTYPE_ATAPICD)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2986 rval = SATA_ATAPI_SECTOR_SIZE;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2987 else rval = -1;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2988 break;
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 case SCSI_CAP_TAGGED_QING:
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 * It is enough if the controller supports queuing, regardless
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2993 * of the device. NCQ support is an internal implementation
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2994 * feature used between HBA and the device.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2995 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2996 if (SATA_QDEPTH(sata_hba_inst) > 1)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2997 rval = 1; /* Queuing supported */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2998 else
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2999 rval = -1; /* Queuing not supported */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3000 break;
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 case SCSI_CAP_DMA_MAX:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3003 sata_adjust_dma_attr(sdinfo, SATA_DMA_ATTR(sata_hba_inst),
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3004 &adj_dma_attr);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3005 rval = (int)adj_dma_attr.dma_attr_maxxfer;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3006 /* We rely on the fact that dma_attr_maxxfer < 0x80000000 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3007 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3008
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3009 case SCSI_CAP_INTERCONNECT_TYPE:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3010 rval = INTERCONNECT_SATA; /* SATA interconnect type */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3011 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3012
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3013 default:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3014 rval = -1;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3015 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3016 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3017 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3018 sata_device.satadev_addr.cport)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3019 return (rval);
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 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3023 * Implementation of scsi tran_setcap
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3024 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3025 * All supported capabilities are fixed/unchangeable.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3026 * Returns 0 for all supported capabilities and valid device, -1 otherwise.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3027 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3028 static int
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3029 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
3030 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3031 #ifndef __lock_lint
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3032 _NOTE(ARGUNUSED(value))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3033 #endif
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3034 sata_hba_inst_t *sata_hba_inst =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3035 (sata_hba_inst_t *)(ap->a_hba_tran->tran_hba_private);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3036 sata_device_t sata_device;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3037 int rval;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3038
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3039 SATADBG2(SATA_DBG_SCSI_IF, sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3040 "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
3041
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3042 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3043 * We want to process the capabilities on per port granularity.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3044 * So, we are specifically restricting ourselves to whom != 0
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3045 * to exclude the controller wide handling.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3046 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3047 if (cap == NULL || whom == 0) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3048 return (-1);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3049 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3050
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3051 if (sata_validate_scsi_address(sata_hba_inst, ap, &sata_device) != 0) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3052 /* Invalid address */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3053 return (-1);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3054 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3055 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3056 sata_device.satadev_addr.cport)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3057 if (sata_get_device_info(sata_hba_inst, &sata_device) == NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3058 /* invalid address */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3059 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3060 sata_device.satadev_addr.cport)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3061 return (0);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3062 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3063 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3064 sata_device.satadev_addr.cport)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3065
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3066 switch (scsi_hba_lookup_capstr(cap)) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3067 case SCSI_CAP_ARQ:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3068 case SCSI_CAP_SECTOR_SIZE:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3069 case SCSI_CAP_TAGGED_QING:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3070 case SCSI_CAP_DMA_MAX:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3071 case SCSI_CAP_INTERCONNECT_TYPE:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3072 rval = 0; /* Capability cannot be changed */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3073 break;
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 default:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3076 rval = -1;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3077 break;
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 return (rval);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3080 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3081
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3082 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3083 * Implementations of scsi tran_destroy_pkt.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3084 * Free resources allocated by sata_scsi_init_pkt()
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3085 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3086 static void
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3087 sata_scsi_destroy_pkt(struct scsi_address *ap, struct scsi_pkt *pkt)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3088 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3089 sata_pkt_txlate_t *spx;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3090
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3091 ASSERT(pkt != NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3092 spx = (sata_pkt_txlate_t *)pkt->pkt_ha_private;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3093
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3094 if (spx->txlt_buf_dma_handle != NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3095 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3096 * Free DMA resources - cookies and handles
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 ASSERT(spx->txlt_dma_cookie_list != NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3099 (void) kmem_free(spx->txlt_dma_cookie_list,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3100 spx->txlt_dma_cookie_list_len * sizeof (ddi_dma_cookie_t));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3101 (void) ddi_dma_unbind_handle(spx->txlt_buf_dma_handle);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3102 (void) ddi_dma_free_handle(&spx->txlt_buf_dma_handle);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3103 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3104 spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp = NULL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3105 sata_pkt_free(spx);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3106
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3107 scsi_hba_pkt_free(ap, pkt);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3108 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3109
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3110 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3111 * Implementation of scsi tran_dmafree.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3112 * Free DMA resources allocated by sata_scsi_init_pkt()
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3113 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3114
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3115 static void
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3116 sata_scsi_dmafree(struct scsi_address *ap, struct scsi_pkt *pkt)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3117 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3118 #ifndef __lock_lint
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3119 _NOTE(ARGUNUSED(ap))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3120 #endif
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3121 sata_pkt_txlate_t *spx;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3122
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3123 ASSERT(pkt != NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3124 spx = (sata_pkt_txlate_t *)pkt->pkt_ha_private;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3125
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3126 if (spx->txlt_buf_dma_handle != NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3127 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3128 * Free DMA resources - cookies and handles
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3129 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3130 ASSERT(spx->txlt_dma_cookie_list != NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3131 (void) kmem_free(spx->txlt_dma_cookie_list,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3132 spx->txlt_dma_cookie_list_len * sizeof (ddi_dma_cookie_t));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3133 (void) ddi_dma_unbind_handle(spx->txlt_buf_dma_handle);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3134 (void) ddi_dma_free_handle(&spx->txlt_buf_dma_handle);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3135 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3136 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3137
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3138 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3139 * Implementation of scsi tran_sync_pkt.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3140 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3141 * The assumption below is that pkt is unique - there is no need to check ap
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3142 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3143 static void
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3144 sata_scsi_sync_pkt(struct scsi_address *ap, struct scsi_pkt *pkt)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3145 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3146 #ifndef __lock_lint
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3147 _NOTE(ARGUNUSED(ap))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3148 #endif
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3149 int rval;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3150 sata_pkt_txlate_t *spx = (sata_pkt_txlate_t *)pkt->pkt_ha_private;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3151
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3152 if (spx->txlt_buf_dma_handle != NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3153 if (spx->txlt_sata_pkt != NULL &&
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3154 spx->txlt_sata_pkt->satapkt_cmd.satacmd_flags !=
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3155 SATA_DIR_NODATA_XFER) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3156 rval = ddi_dma_sync(spx->txlt_buf_dma_handle, 0, 0,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3157 (spx->txlt_sata_pkt->satapkt_cmd.satacmd_flags &
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3158 SATA_DIR_WRITE) ?
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3159 DDI_DMA_SYNC_FORDEV : DDI_DMA_SYNC_FORCPU);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3160 if (rval == DDI_SUCCESS) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3161 SATA_LOG_D((spx->txlt_sata_hba_inst, CE_WARN,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3162 "sata_scsi_sync_pkt: sync pkt failed"));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3163 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3164 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3165 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3166 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3167
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3168
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3169
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3170 /* ******************* SATA - SCSI Translation functions **************** */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3171 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3172 * 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
3173 * translation.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3174 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3175
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3176 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3177 * Checks if a device exists and can be access and translates common
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3178 * scsi_pkt data to sata_pkt data.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3179 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3180 * Returns TRAN_ACCEPT if device exists and sata_pkt was set-up.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3181 * Returns other TRAN_XXXXX values when error occured.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3182 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3183 * This function should be called with port mutex held.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3184 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3185 static int
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3186 sata_txlt_generic_pkt_info(sata_pkt_txlate_t *spx)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3187 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3188 sata_drive_info_t *sdinfo;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3189 sata_device_t sata_device;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3190
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3191 /* Validate address */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3192 switch (sata_validate_scsi_address(spx->txlt_sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3193 &spx->txlt_scsi_pkt->pkt_address, &sata_device)) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3194
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3195 case -1:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3196 /* Invalid address or invalid device type */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3197 return (TRAN_BADPKT);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3198 case 1:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3199 /* valid address but no device - it has disappeared ? */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3200 spx->txlt_scsi_pkt->pkt_reason = CMD_DEV_GONE;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3201 return (TRAN_FATAL_ERROR);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3202 default:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3203 /* all OK */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3204 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3205 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3206 sdinfo = sata_get_device_info(spx->txlt_sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3207 &spx->txlt_sata_pkt->satapkt_device);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3208
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3209 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3210 * If device is in reset condition, reject the packet with
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3211 * TRAN_BUSY
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3212 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3213 if (sdinfo->satadrv_event_flags &
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3214 (SATA_EVNT_DEVICE_RESET | SATA_EVNT_INPROC_DEVICE_RESET)) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3215 spx->txlt_scsi_pkt->pkt_reason = CMD_INCOMPLETE;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3216 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3217 "sata_scsi_start: rejecting command because "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3218 "of device reset state\n", NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3219 return (TRAN_BUSY);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3220 }
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 * 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
3224 * sata_scsi_pkt_init() because pkt init had to work also with
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3225 * non-existing devices.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3226 * 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
3227 * type is known.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3228 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3229 spx->txlt_sata_pkt->satapkt_device.satadev_type = sdinfo->satadrv_type;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3230
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3231 spx->txlt_sata_pkt->satapkt_cmd.satacmd_flags = SATA_DIR_NODATA_XFER;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3232
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3233 spx->txlt_scsi_pkt->pkt_reason = CMD_CMPLT;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3234
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3235 if ((spx->txlt_scsi_pkt->pkt_flags & FLAG_NOINTR) != 0) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3236 /* Synchronous execution */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3237 spx->txlt_sata_pkt->satapkt_op_mode = SATA_OPMODE_SYNCH |
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3238 SATA_OPMODE_POLLING;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3239 } else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3240 /* Asynchronous execution */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3241 spx->txlt_sata_pkt->satapkt_op_mode = SATA_OPMODE_ASYNCH |
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3242 SATA_OPMODE_INTERRUPTS;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3243 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3244 /* Convert queuing information */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3245 if (spx->txlt_scsi_pkt->pkt_flags & FLAG_STAG)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3246 spx->txlt_sata_pkt->satapkt_cmd.satacmd_flags |=
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3247 SATA_QUEUE_STAG_CMD;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3248 else if (spx->txlt_scsi_pkt->pkt_flags &
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3249 (FLAG_OTAG | FLAG_HTAG | FLAG_HEAD))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3250 spx->txlt_sata_pkt->satapkt_cmd.satacmd_flags |=
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3251 SATA_QUEUE_OTAG_CMD;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3252
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3253 /* Always limit pkt time */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3254 if (spx->txlt_scsi_pkt->pkt_time == 0)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3255 spx->txlt_sata_pkt->satapkt_time = sata_default_pkt_time;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3256 else
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3257 /* Pass on scsi_pkt time */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3258 spx->txlt_sata_pkt->satapkt_time =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3259 spx->txlt_scsi_pkt->pkt_time;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3260
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3261 return (TRAN_ACCEPT);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3262 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3263
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3264
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3265 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3266 * Translate ATA(ATAPI) Identify (Packet) Device data to SCSI Inquiry data.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3267 * SATA Identify Device data has to be valid in sata_rive_info.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3268 * Buffer has to accomodate the inquiry length (36 bytes).
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3269 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3270 * This function should be called with a port mutex held.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3271 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3272 static void
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3273 sata_identdev_to_inquiry(sata_hba_inst_t *sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3274 sata_drive_info_t *sdinfo, uint8_t *buf)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3275 {
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 struct scsi_inquiry *inq = (struct scsi_inquiry *)buf;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3278 struct sata_id *sid = &sdinfo->satadrv_id;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3279
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3280 /* Rely on the dev_type for setting paripheral qualifier */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3281 /* Does DTYPE_RODIRECT apply to CD/DVD R/W devices ? */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3282 inq->inq_dtype = sdinfo->satadrv_type == SATA_DTYPE_ATADISK ?
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3283 DTYPE_DIRECT : DTYPE_RODIRECT;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3284
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3285 inq->inq_rmb = sid->ai_config & SATA_REM_MEDIA ? 1 : 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3286 inq->inq_qual = 0; /* Device type qualifier (obsolete in SCSI3? */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3287 inq->inq_iso = 0; /* ISO version */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3288 inq->inq_ecma = 0; /* ECMA version */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3289 inq->inq_ansi = 3; /* ANSI version - SCSI 3 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3290 inq->inq_aenc = 0; /* Async event notification cap. */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3291 inq->inq_trmiop = 0; /* Supports TERMINATE I/O PROC msg ??? */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3292 inq->inq_normaca = 0; /* setting NACA bit supported - NO */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3293 inq->inq_rdf = RDF_SCSI2; /* Response data format- SPC-3 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3294 inq->inq_len = 31; /* Additional length */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3295 inq->inq_dualp = 0; /* dual port device - NO */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3296 inq->inq_reladdr = 0; /* Supports relative addressing - NO */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3297 inq->inq_sync = 0; /* Supports synchronous data xfers - NO */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3298 inq->inq_linked = 0; /* Supports linked commands - NO */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3299 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3300 * Queuing support - controller has to
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3301 * support some sort of command queuing.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3302 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3303 if (SATA_QDEPTH(sata_hba_inst) > 1)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3304 inq->inq_cmdque = 1; /* Supports command queueing - YES */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3305 else
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3306 inq->inq_cmdque = 0; /* Supports command queueing - NO */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3307 inq->inq_sftre = 0; /* Supports Soft Reset option - NO ??? */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3308 inq->inq_wbus32 = 0; /* Supports 32 bit wide data xfers - NO */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3309 inq->inq_wbus16 = 0; /* Supports 16 bit wide data xfers - NO */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3310
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3311 #ifdef _LITTLE_ENDIAN
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3312 /* Swap text fields to match SCSI format */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3313 swab(sid->ai_model, inq->inq_vid, 8); /* Vendor ID */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3314 swab(&sid->ai_model[8], inq->inq_pid, 16); /* Product ID */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3315 swab(sid->ai_fw, inq->inq_revision, 8); /* Revision level */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3316 #else
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3317 bcopy(sid->ai_model, inq->inq_vid, 8); /* Vendor ID */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3318 bcopy(&sid->ai_model[8], inq->inq_pid, 16); /* Product ID */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3319 bcopy(sid->ai_fw, inq->inq_revision, 8); /* Revision level */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3320 #endif
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3321 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3322
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3323
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3324 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3325 * Scsi response set up for invalid command (command not supported)
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 * Returns TRAN_ACCEPT and appropriate values in scsi_pkt fields.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3328 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3329 static int
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3330 sata_txlt_invalid_command(sata_pkt_txlate_t *spx)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3331 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3332 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3333 struct scsi_extended_sense *sense;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3334
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3335 scsipkt->pkt_reason = CMD_CMPLT;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3336 scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3337 STATE_SENT_CMD | STATE_GOT_STATUS;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3338
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3339 *scsipkt->pkt_scbp = STATUS_CHECK;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3340
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3341 sense = sata_arq_sense(spx);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3342 sense->es_key = KEY_ILLEGAL_REQUEST;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3343 sense->es_add_code = SD_SCSI_INVALID_COMMAND_CODE;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3344
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3345 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3346 "Scsi_pkt completion reason %x\n", scsipkt->pkt_reason);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3347
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3348 if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0 &&
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3349 scsipkt->pkt_comp != NULL)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3350 /* scsi callback required */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3351 (*scsipkt->pkt_comp)(scsipkt);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3352 return (TRAN_ACCEPT);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3353 }
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 * Scsi response setup for
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3357 * emulated non-data command that requires no action/return data
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3358 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3359 * Returns TRAN_ACCEPT and appropriate values in scsi_pkt fields.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3360 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3361 static int
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3362 sata_txlt_nodata_cmd_immediate(sata_pkt_txlate_t *spx)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3363 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3364 int rval;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3365
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3366 mutex_enter(&(SATA_TXLT_CPORT_MUTEX(spx)));
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 if ((rval = sata_txlt_generic_pkt_info(spx)) != TRAN_ACCEPT) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3369 mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3370 return (rval);
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 mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx)));
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 spx->txlt_scsi_pkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3375 STATE_SENT_CMD | STATE_GOT_STATUS;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3376 spx->txlt_scsi_pkt->pkt_reason = CMD_CMPLT;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3377 *(spx->txlt_scsi_pkt->pkt_scbp) = STATUS_GOOD;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3378
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3379 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3380 "Scsi_pkt completion reason %x\n",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3381 spx->txlt_scsi_pkt->pkt_reason);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3382
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3383 if ((spx->txlt_scsi_pkt->pkt_flags & FLAG_NOINTR) == 0 &&
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3384 spx->txlt_scsi_pkt->pkt_comp != NULL)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3385 /* scsi callback required */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3386 (*spx->txlt_scsi_pkt->pkt_comp)(spx->txlt_scsi_pkt);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3387 return (TRAN_ACCEPT);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3388 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3389
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3390
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3391 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3392 * SATA translate command: Inquiry / Identify Device
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3393 * Use cached Identify Device data for now, rather then issuing actual
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3394 * Device Identify cmd request. If device is detached and re-attached,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3395 * asynchromous event processing should fetch and refresh Identify Device
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3396 * data.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3397 * Two VPD pages are supported now:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3398 * Vital Product Data page
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3399 * Unit Serial Number page
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3400 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3401 * Returns TRAN_ACCEPT and appropriate values in scsi_pkt fields.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3402 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3403
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3404 #define EVPD 1 /* Extended Vital Product Data flag */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3405 #define CMDDT 2 /* Command Support Data - Obsolete */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3406 #define INQUIRY_SUP_VPD_PAGE 0 /* Supported VDP Pages Page COde */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3407 #define INQUIRY_USN_PAGE 0x80 /* Unit Serial Number Page Code */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3408 #define INQUIRY_DEV_IDENTIFICATION_PAGE 0x83 /* Not needed yet */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3409
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3410 static int
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3411 sata_txlt_inquiry(sata_pkt_txlate_t *spx)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3412 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3413 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3414 struct buf *bp = spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3415 sata_drive_info_t *sdinfo;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3416 struct scsi_extended_sense *sense;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3417 int count;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3418 uint8_t *p;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3419 int i, j;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3420 uint8_t page_buf[0xff]; /* Max length */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3421 int rval;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3422
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3423 mutex_enter(&(SATA_TXLT_CPORT_MUTEX(spx)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3424
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3425 if ((rval = sata_txlt_generic_pkt_info(spx)) != TRAN_ACCEPT) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3426 mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3427 return (rval);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3428 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3429
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3430 sdinfo = sata_get_device_info(spx->txlt_sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3431 &spx->txlt_sata_pkt->satapkt_device);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3432
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3433 ASSERT(sdinfo != NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3434
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3435 scsipkt->pkt_reason = CMD_CMPLT;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3436 scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3437 STATE_SENT_CMD | STATE_GOT_STATUS;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3438
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3439 /* Reject not supported request */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3440 if (scsipkt->pkt_cdbp[1] & CMDDT) { /* No support for this bit */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3441 *scsipkt->pkt_scbp = STATUS_CHECK;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3442 sense = sata_arq_sense(spx);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3443 sense->es_key = KEY_ILLEGAL_REQUEST;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3444 sense->es_add_code = SD_SCSI_INVALID_FIELD_IN_CDB;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3445 goto done;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3446 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3447
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3448 /* Valid Inquiry request */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3449 *scsipkt->pkt_scbp = STATUS_GOOD;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3450
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3451 if (bp != NULL && bp->b_un.b_addr && bp->b_bcount) {
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 if (!(scsipkt->pkt_cdbp[1] & EVPD)) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3454 /* Standard Inquiry Data request */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3455 struct scsi_inquiry inq;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3456
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3457 bzero(&inq, sizeof (struct scsi_inquiry));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3458 sata_identdev_to_inquiry(spx->txlt_sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3459 sdinfo, (uint8_t *)&inq);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3460 /* Copy no more than requested */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3461 count = MIN(bp->b_bcount,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3462 sizeof (struct scsi_inquiry));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3463 count = MIN(count, scsipkt->pkt_cdbp[4]);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3464 bcopy(&inq, bp->b_un.b_addr, count);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3465
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3466 scsipkt->pkt_state |= STATE_XFERRED_DATA;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3467 scsipkt->pkt_resid = scsipkt->pkt_cdbp[4] > count ?
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3468 scsipkt->pkt_cdbp[4] - count : 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3469 } else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3470 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3471 * peripheral_qualifier = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3472 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3473 * We are dealing only with HD and will be
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3474 * dealing with CD/DVD devices soon
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3475 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3476 uint8_t peripheral_device_type =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3477 sdinfo->satadrv_type == SATA_DTYPE_ATADISK ?
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3478 DTYPE_DIRECT : DTYPE_RODIRECT;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3479
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3480 switch ((uint_t)scsipkt->pkt_cdbp[2]) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3481 case INQUIRY_SUP_VPD_PAGE:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3482 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3483 * Request for suported Vital Product Data
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3484 * pages - assuming only 2 page codes
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3485 * supported
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3486 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3487 page_buf[0] = peripheral_device_type;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3488 page_buf[1] = INQUIRY_SUP_VPD_PAGE;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3489 page_buf[2] = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3490 page_buf[3] = 2; /* page length */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3491 page_buf[4] = INQUIRY_SUP_VPD_PAGE;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3492 page_buf[5] = INQUIRY_USN_PAGE;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3493 /* Copy no more than requested */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3494 count = MIN(bp->b_bcount, 6);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3495 bcopy(page_buf, bp->b_un.b_addr, count);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3496 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3497 case INQUIRY_USN_PAGE:
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 * Request for Unit Serial Number page
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3500 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3501 page_buf[0] = peripheral_device_type;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3502 page_buf[1] = INQUIRY_USN_PAGE;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3503 page_buf[2] = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3504 page_buf[3] = 20; /* remaining page length */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3505 p = (uint8_t *)(sdinfo->satadrv_id.ai_drvser);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3506 #ifdef _LITTLE_ENDIAN
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3507 swab(p, &page_buf[4], 20);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3508 #else
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3509 bcopy(p, &page_buf[4], 20);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3510 #endif
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3511 for (i = 0; i < 20; i++) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3512 if (page_buf[4 + i] == '\0' ||
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3513 page_buf[4 + i] == '\040') {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3514 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3515 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3516 }
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 * 'i' contains string length.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3519 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3520 * Least significant character of the serial
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3521 * number shall appear as the last byte,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3522 * according to SBC-3 spec.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3523 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3524 p = &page_buf[20 + 4 - 1];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3525 for (j = i; j > 0; j--, p--) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3526 *p = *(p - 20 + i);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3527 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3528 p = &page_buf[4];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3529 for (j = 20 - i; j > 0; j--) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3530 *p++ = '\040';
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3531 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3532 count = MIN(bp->b_bcount, 24);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3533 bcopy(page_buf, bp->b_un.b_addr, count);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3534 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3535
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3536 case INQUIRY_DEV_IDENTIFICATION_PAGE:
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 * We may want to implement this page, when
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3539 * identifiers are common for SATA devices
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3540 * But not now.
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 /*FALLTHRU*/
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 default:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3545 /* Request for unsupported VPD page */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3546 *scsipkt->pkt_scbp = STATUS_CHECK;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3547 sense = sata_arq_sense(spx);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3548 sense->es_key = KEY_ILLEGAL_REQUEST;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3549 sense->es_add_code =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3550 SD_SCSI_INVALID_FIELD_IN_CDB;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3551 goto done;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3552 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3553 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3554 scsipkt->pkt_state |= STATE_XFERRED_DATA;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3555 scsipkt->pkt_resid = scsipkt->pkt_cdbp[4] > count ?
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3556 scsipkt->pkt_cdbp[4] - count : 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3557 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3558 done:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3559 mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3560
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3561 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3562 "Scsi_pkt completion reason %x\n",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3563 scsipkt->pkt_reason);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3564
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3565 if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0 &&
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3566 scsipkt->pkt_comp != NULL)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3567 /* scsi callback required */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3568 (*scsipkt->pkt_comp)(scsipkt);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3569
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3570 return (TRAN_ACCEPT);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3571 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3572
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3573 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3574 * SATA translate command: Request Sense
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3575 * emulated command (ATA version so far, no ATAPI)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3576 * Always NO SENSE, because any sense data should be reported by ARQ sense.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3577 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3578 * Returns TRAN_ACCEPT and appropriate values in scsi_pkt fields.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3579 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3580 static int
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3581 sata_txlt_request_sense(sata_pkt_txlate_t *spx)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3582 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3583 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3584 struct scsi_extended_sense sense;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3585 struct buf *bp = spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3586 int rval;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3587
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3588 mutex_enter(&(SATA_TXLT_CPORT_MUTEX(spx)));
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 if ((rval = sata_txlt_generic_pkt_info(spx)) != TRAN_ACCEPT) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3591 mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3592 return (rval);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3593 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3594 mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3595
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3596
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3597 scsipkt->pkt_reason = CMD_CMPLT;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3598 scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3599 STATE_SENT_CMD | STATE_GOT_STATUS;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3600 *scsipkt->pkt_scbp = STATUS_GOOD;
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 if (bp != NULL && bp->b_un.b_addr && bp->b_bcount) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3603 int count = MIN(bp->b_bcount,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3604 sizeof (struct scsi_extended_sense));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3605 bzero(&sense, sizeof (struct scsi_extended_sense));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3606 sense.es_valid = 0; /* Valid LBA */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3607 sense.es_class = 7; /* Response code 0x70 - current err */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3608 sense.es_key = KEY_NO_SENSE;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3609 sense.es_add_len = 6; /* Additional length */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3610 /* Copy no more than requested */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3611 bcopy(&sense, bp->b_un.b_addr, count);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3612 scsipkt->pkt_state |= STATE_XFERRED_DATA;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3613 scsipkt->pkt_resid = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3614 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3615
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3616 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3617 "Scsi_pkt completion reason %x\n",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3618 scsipkt->pkt_reason);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3619
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3620 if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0 &&
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3621 scsipkt->pkt_comp != NULL)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3622 /* scsi callback required */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3623 (*scsipkt->pkt_comp)(scsipkt);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3624 return (TRAN_ACCEPT);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3625 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3626
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3627 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3628 * SATA translate command: Test Unit Ready
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3629 * At the moment this is an emulated command (ATA version so far, no ATAPI).
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3630 * May be translated into Check Power Mode command in the future
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3631 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3632 * Returns TRAN_ACCEPT and appropriate values in scsi_pkt fields.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3633 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3634 static int
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3635 sata_txlt_test_unit_ready(sata_pkt_txlate_t *spx)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3636 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3637 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3638 struct scsi_extended_sense *sense;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3639 int power_state;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3640 int rval;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3641
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3642 mutex_enter(&(SATA_TXLT_CPORT_MUTEX(spx)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3643
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3644 if ((rval = sata_txlt_generic_pkt_info(spx)) != TRAN_ACCEPT) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3645 mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3646 return (rval);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3647 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3648 mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3649
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3650 /* At this moment, emulate it rather than execute anything */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3651 power_state = SATA_PWRMODE_ACTIVE;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3652
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3653 scsipkt->pkt_reason = CMD_CMPLT;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3654 scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3655 STATE_SENT_CMD | STATE_GOT_STATUS;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3656
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3657 switch (power_state) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3658 case SATA_PWRMODE_ACTIVE:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3659 case SATA_PWRMODE_IDLE:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3660 *scsipkt->pkt_scbp = STATUS_GOOD;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3661 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3662 default:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3663 /* PWR mode standby */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3664 *scsipkt->pkt_scbp = STATUS_CHECK;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3665 sense = sata_arq_sense(spx);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3666 sense->es_key = KEY_NOT_READY;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3667 sense->es_add_code = SD_SCSI_LU_NOT_READY;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3668 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3669 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3670
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3671 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3672 "Scsi_pkt completion reason %x\n", scsipkt->pkt_reason);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3673
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3674 if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0 &&
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3675 scsipkt->pkt_comp != NULL)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3676 /* scsi callback required */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3677 (*scsipkt->pkt_comp)(scsipkt);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3678
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3679 return (TRAN_ACCEPT);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3680 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3681
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3682
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 * SATA translate command: Start Stop Unit
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3685 * Translation depends on a command:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3686 * Start Unit translated into Idle Immediate
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3687 * Stop Unit translated into Standby Immediate
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3688 * Unload Media / NOT SUPPORTED YET
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3689 * Load Media / NOT SUPPROTED YET
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3690 * Power condition bits are ignored, so is Immediate bit
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3691 * Requesting synchronous execution.
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 * Returns TRAN_ACCEPT or code returned by sata_hba_start() and
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3694 * appropriate values in scsi_pkt fields.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3695 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3696 static int
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3697 sata_txlt_start_stop_unit(sata_pkt_txlate_t *spx)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3698 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3699 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3700 sata_cmd_t *scmd = &spx->txlt_sata_pkt->satapkt_cmd;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3701 struct scsi_extended_sense *sense;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3702 sata_hba_inst_t *shi = SATA_TXLT_HBA_INST(spx);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3703 int cport = SATA_TXLT_CPORT(spx);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3704 int rval;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3705 int synch;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3706
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3707 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3708 "sata_txlt_start_stop_unit: %d\n", scsipkt->pkt_scbp[4] & 1);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3709
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3710 mutex_enter(&SATA_CPORT_MUTEX(shi, cport));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3711
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3712 if ((rval = sata_txlt_generic_pkt_info(spx)) != TRAN_ACCEPT) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3713 mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3714 return (rval);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3715 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3716
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3717 if (scsipkt->pkt_cdbp[4] & 2) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3718 /* Load/Unload Media - invalid request */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3719 *scsipkt->pkt_scbp = STATUS_CHECK;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3720 sense = sata_arq_sense(spx);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3721 sense->es_key = KEY_ILLEGAL_REQUEST;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3722 sense->es_add_code = SD_SCSI_INVALID_FIELD_IN_CDB;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3723 mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3724
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3725 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3726 "Scsi_pkt completion reason %x\n", scsipkt->pkt_reason);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3727
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3728 if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0 &&
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3729 scsipkt->pkt_comp != NULL)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3730 /* scsi callback required */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3731 (*scsipkt->pkt_comp)(scsipkt);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3732
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3733 return (TRAN_ACCEPT);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3734 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3735 scmd->satacmd_addr_type = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3736 scmd->satacmd_sec_count_lsb = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3737 scmd->satacmd_lba_low_lsb = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3738 scmd->satacmd_lba_mid_lsb = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3739 scmd->satacmd_lba_high_lsb = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3740 scmd->satacmd_features_reg = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3741 scmd->satacmd_device_reg = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3742 scmd->satacmd_status_reg = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3743 if (scsipkt->pkt_cdbp[4] & 1) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3744 /* Start Unit */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3745 scmd->satacmd_cmd_reg = SATAC_IDLE_IM;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3746 } else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3747 /* Stop Unit */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3748 scmd->satacmd_cmd_reg = SATAC_STANDBY_IM;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3749 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3750
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3751 if (!(spx->txlt_sata_pkt->satapkt_op_mode & SATA_OPMODE_SYNCH)) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3752 /* Need to set-up a callback function */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3753 spx->txlt_sata_pkt->satapkt_comp =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3754 sata_txlt_nodata_cmd_completion;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3755 synch = FALSE;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3756 } else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3757 spx->txlt_sata_pkt->satapkt_op_mode = SATA_OPMODE_SYNCH;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3758 synch = TRUE;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3759 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3760
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3761 /* Transfer command to HBA */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3762 if (sata_hba_start(spx, &rval) != 0) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3763 /* Pkt not accepted for execution */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3764 mutex_exit(&SATA_CPORT_MUTEX(shi, cport));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3765 return (rval);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3766 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3767
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3768 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3769 * If execution is non-synchronous,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3770 * a callback function will handle potential errors, translate
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3771 * the response and will do a callback to a target driver.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3772 * If it was synchronous, check execution status using the same
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3773 * framework callback.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3774 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3775 mutex_exit(&SATA_CPORT_MUTEX(shi, cport));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3776 if (synch) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3777 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3778 "synchronous execution status %x\n",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3779 spx->txlt_sata_pkt->satapkt_reason);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3780
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3781 sata_txlt_nodata_cmd_completion(spx->txlt_sata_pkt);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3782 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3783 return (TRAN_ACCEPT);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3784
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3785 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3786
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3787
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3788 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3789 * SATA translate command: Read Capacity.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3790 * Emulated command for SATA disks.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3791 * Capacity is retrieved from cached Idenifty Device data.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3792 * Identify Device data shows effective disk capacity, not the native
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3793 * capacity, which may be limitted by Set Max Address command.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3794 * This is ATA version (non-ATAPI).
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3795 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3796 * Returns TRAN_ACCEPT and appropriate values in scsi_pkt fields.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3797 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3798 static int
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3799 sata_txlt_read_capacity(sata_pkt_txlate_t *spx)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3800 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3801 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3802 struct buf *bp = spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3803 sata_drive_info_t *sdinfo;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3804 uint64_t val;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3805 uchar_t *rbuf;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3806 int rval;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3807
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3808 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3809 "sata_txlt_read_capacity: ", NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3810
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3811 mutex_enter(&(SATA_TXLT_CPORT_MUTEX(spx)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3812
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3813 if ((rval = sata_txlt_generic_pkt_info(spx)) != TRAN_ACCEPT) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3814 mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3815 return (rval);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3816 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3817
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3818 scsipkt->pkt_reason = CMD_CMPLT;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3819 scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3820 STATE_SENT_CMD | STATE_GOT_STATUS;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3821 *scsipkt->pkt_scbp = STATUS_GOOD;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3822 if (bp != NULL && bp->b_un.b_addr && bp->b_bcount) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3823 sdinfo = sata_get_device_info(
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3824 spx->txlt_sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3825 &spx->txlt_sata_pkt->satapkt_device);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3826 /* Last logical block address */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3827 val = sdinfo->satadrv_capacity - 1;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3828 rbuf = (uchar_t *)bp->b_un.b_addr;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3829 /* Need to swap endians to match scsi format */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3830 rbuf[0] = (val >> 24) & 0xff;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3831 rbuf[1] = (val >> 16) & 0xff;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3832 rbuf[2] = (val >> 8) & 0xff;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3833 rbuf[3] = val & 0xff;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3834 /* block size - always 512 bytes, for now */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3835 rbuf[4] = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3836 rbuf[5] = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3837 rbuf[6] = 0x02;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3838 rbuf[7] = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3839 scsipkt->pkt_state |= STATE_XFERRED_DATA;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3840 scsipkt->pkt_resid = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3841
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3842 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst, "%d\n",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3843 sdinfo->satadrv_capacity -1);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3844 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3845 mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3846 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3847 * If a callback was requested, do it now.
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 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3850 "Scsi_pkt completion reason %x\n", scsipkt->pkt_reason);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3851
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3852 if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0 &&
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3853 scsipkt->pkt_comp != NULL)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3854 /* scsi callback required */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3855 (*scsipkt->pkt_comp)(scsipkt);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3856
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3857 return (TRAN_ACCEPT);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3858 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3859
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3860 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3861 * SATA translate command: Mode Sense.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3862 * Translated into appropriate SATA command or emulated.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3863 * Saved Values Page Control (03) are not supported.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3864 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3865 * NOTE: only caching mode sense page is currently implemented.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3866 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3867 * Returns TRAN_ACCEPT and appropriate values in scsi_pkt fields.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3868 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3869
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3870 static int
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3871 sata_txlt_mode_sense(sata_pkt_txlate_t *spx)
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 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3874 struct buf *bp = spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3875 sata_drive_info_t *sdinfo;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3876 struct scsi_extended_sense *sense;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3877 int len, bdlen, count, alc_len;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3878 int pc; /* Page Control code */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3879 uint8_t *buf; /* mode sense buffer */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3880 int rval;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3881
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3882 SATADBG2(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3883 "sata_txlt_mode_sense, pc %x page code 0x%02x\n",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3884 spx->txlt_scsi_pkt->pkt_cdbp[2] >> 6,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3885 spx->txlt_scsi_pkt->pkt_cdbp[2] & 0x3f);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3886
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3887 buf = kmem_zalloc(1024, KM_SLEEP);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3888
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3889 mutex_enter(&(SATA_TXLT_CPORT_MUTEX(spx)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3890
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3891 if ((rval = sata_txlt_generic_pkt_info(spx)) != TRAN_ACCEPT) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3892 mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3893 kmem_free(buf, 1024);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3894 return (rval);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3895 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3896
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3897 scsipkt->pkt_reason = CMD_CMPLT;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3898 scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3899 STATE_SENT_CMD | STATE_GOT_STATUS;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3900
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3901 pc = scsipkt->pkt_cdbp[2] >> 6;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3902
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3903 /* Reject not supported request for saved parameters */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3904 if (pc == 3) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3905 *scsipkt->pkt_scbp = STATUS_CHECK;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3906 sense = sata_arq_sense(spx);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3907 sense->es_key = KEY_ILLEGAL_REQUEST;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3908 sense->es_add_code = SD_SCSI_SAVING_PARAMS_NOT_SUP;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3909 goto done;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3910 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3911
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3912 if (bp != NULL && bp->b_un.b_addr && bp->b_bcount) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3913 len = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3914 bdlen = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3915 if (!(scsipkt->pkt_cdbp[1] & 8)) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3916 if (scsipkt->pkt_cdbp[0] == SCMD_MODE_SENSE_G1 &&
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3917 (scsipkt->pkt_cdbp[0] & 0x10))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3918 bdlen = 16;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3919 else
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3920 bdlen = 8;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3921 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3922 /* Build mode parameter header */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3923 if (spx->txlt_scsi_pkt->pkt_cdbp[0] == SCMD_MODE_SENSE) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3924 /* 4-byte mode parameter header */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3925 buf[len++] = 0; /* mode data length */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3926 buf[len++] = 0; /* medium type */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3927 buf[len++] = 0; /* dev-specific param */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3928 buf[len++] = bdlen; /* Block Descriptor length */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3929 } else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3930 /* 8-byte mode parameter header */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3931 buf[len++] = 0; /* mode data length */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3932 buf[len++] = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3933 buf[len++] = 0; /* medium type */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3934 buf[len++] = 0; /* dev-specific param */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3935 if (bdlen == 16)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3936 buf[len++] = 1; /* long lba descriptor */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3937 else
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3938 buf[len++] = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3939 buf[len++] = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3940 buf[len++] = 0; /* Block Descriptor length */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3941 buf[len++] = bdlen;
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
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3944 sdinfo = sata_get_device_info(
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3945 spx->txlt_sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3946 &spx->txlt_sata_pkt->satapkt_device);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3947
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3948 /* Build block descriptor only if not disabled (DBD) */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3949 if ((scsipkt->pkt_cdbp[1] & 0x08) == 0) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3950 /* Block descriptor - direct-access device format */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3951 if (bdlen == 8) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3952 /* build regular block descriptor */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3953 buf[len++] =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3954 (sdinfo->satadrv_capacity >> 24) & 0xff;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3955 buf[len++] =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3956 (sdinfo->satadrv_capacity >> 16) & 0xff;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3957 buf[len++] =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3958 (sdinfo->satadrv_capacity >> 8) & 0xff;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3959 buf[len++] = sdinfo->satadrv_capacity & 0xff;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3960 buf[len++] = 0; /* density code */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3961 buf[len++] = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3962 if (sdinfo->satadrv_type ==
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3963 SATA_DTYPE_ATADISK)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3964 buf[len++] = 2;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3965 else
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3966 /* ATAPI */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3967 buf[len++] = 8;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3968 buf[len++] = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3969 } else if (bdlen == 16) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3970 /* Long LBA Accepted */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3971 /* build long lba block descriptor */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3972 #ifndef __lock_lint
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3973 buf[len++] =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3974 (sdinfo->satadrv_capacity >> 56) & 0xff;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3975 buf[len++] =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3976 (sdinfo->satadrv_capacity >> 48) & 0xff;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3977 buf[len++] =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3978 (sdinfo->satadrv_capacity >> 40) & 0xff;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3979 buf[len++] =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3980 (sdinfo->satadrv_capacity >> 32) & 0xff;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3981 #endif
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3982 buf[len++] =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3983 (sdinfo->satadrv_capacity >> 24) & 0xff;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3984 buf[len++] =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3985 (sdinfo->satadrv_capacity >> 16) & 0xff;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3986 buf[len++] =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3987 (sdinfo->satadrv_capacity >> 8) & 0xff;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3988 buf[len++] = sdinfo->satadrv_capacity & 0xff;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3989 buf[len++] = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3990 buf[len++] = 0; /* density code */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3991 buf[len++] = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3992 buf[len++] = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3993 if (sdinfo->satadrv_type ==
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3994 SATA_DTYPE_ATADISK)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3995 buf[len++] = 2;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3996 else
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3997 /* ATAPI */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3998 buf[len++] = 8;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3999 buf[len++] = 0;
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 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4002 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4003 * Add requested pages.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4004 * Page 3 and 4 are obsolete and we are not supporting them.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4005 * We deal now with:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4006 * caching (read/write cache control).
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4007 * We should eventually deal with following mode pages:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4008 * error recovery (0x01),
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4009 * power condition (0x1a),
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4010 * exception control page (enables SMART) (0x1c),
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4011 * enclosure management (ses),
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4012 * protocol-specific port mode (port control).
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4013 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4014 switch (scsipkt->pkt_cdbp[2] & 0x3f) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4015 case MODEPAGE_RW_ERRRECOV:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4016 /* DAD_MODE_ERR_RECOV */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4017 /* R/W recovery */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4018 len += sata_build_msense_page_1(sdinfo, pc, buf+len);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4019 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4020 case MODEPAGE_CACHING:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4021 /* DAD_MODE_CACHE */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4022 /* caching */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4023 len += sata_build_msense_page_8(sdinfo, pc, buf+len);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4024 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4025 case MODEPAGE_INFO_EXCPT:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4026 /* exception cntrl */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4027 len += sata_build_msense_page_1c(sdinfo, pc, buf+len);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4028 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4029 case MODEPAGE_POWER_COND:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4030 /* DAD_MODE_POWER_COND */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4031 /* power condition */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4032 len += sata_build_msense_page_1a(sdinfo, pc, buf+len);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4033 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4034 case MODEPAGE_ALLPAGES:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4035 /* all pages */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4036 len += sata_build_msense_page_1(sdinfo, pc, buf+len);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4037 len += sata_build_msense_page_8(sdinfo, pc, buf+len);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4038 len += sata_build_msense_page_1a(sdinfo, pc, buf+len);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4039 len += sata_build_msense_page_1c(sdinfo, pc, buf+len);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4040 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4041 default:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4042 /* Invalid request */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4043 *scsipkt->pkt_scbp = STATUS_CHECK;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4044 sense = sata_arq_sense(spx);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4045 sense->es_key = KEY_ILLEGAL_REQUEST;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4046 sense->es_add_code = SD_SCSI_INVALID_FIELD_IN_CDB;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4047 goto done;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4048 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4049
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4050 /* fix total mode data length */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4051 if (spx->txlt_scsi_pkt->pkt_cdbp[0] == SCMD_MODE_SENSE) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4052 /* 4-byte mode parameter header */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4053 buf[0] = len - 1; /* mode data length */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4054 } else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4055 buf[0] = (len -2) >> 8;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4056 buf[1] = (len -2) & 0xff;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4057 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4058
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4059
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4060 /* Check allocation length */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4061 if (scsipkt->pkt_cdbp[0] == SCMD_MODE_SENSE) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4062 alc_len = scsipkt->pkt_cdbp[4];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4063 } else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4064 alc_len = scsipkt->pkt_cdbp[7];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4065 alc_len = (len << 8) | scsipkt->pkt_cdbp[8];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4066 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4067 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4068 * We do not check for possible parameters truncation
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4069 * (alc_len < len) assuming that the target driver works
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4070 * correctly. Just avoiding overrun.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4071 * Copy no more than requested and possible, buffer-wise.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4072 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4073 count = MIN(alc_len, len);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4074 count = MIN(bp->b_bcount, count);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4075 bcopy(buf, bp->b_un.b_addr, count);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4076
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4077 scsipkt->pkt_state |= STATE_XFERRED_DATA;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4078 scsipkt->pkt_resid = alc_len > count ? alc_len - count : 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4079 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4080 *scsipkt->pkt_scbp = STATUS_GOOD;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4081 done:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4082 mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4083 (void) kmem_free(buf, 1024);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4084
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4085 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4086 "Scsi_pkt completion reason %x\n", scsipkt->pkt_reason);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4087
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4088 if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0 &&
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4089 scsipkt->pkt_comp != NULL)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4090 /* scsi callback required */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4091 (*scsipkt->pkt_comp)(scsipkt);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4092
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4093 return (TRAN_ACCEPT);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4094 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4095
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4096
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4097 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4098 * SATA translate command: Mode Select.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4099 * Translated into appropriate SATA command or emulated.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4100 * Saving parameters is not supported.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4101 * Changing device capacity is not supported (although theoretically
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4102 * possible by executing SET FEATURES/SET MAX ADDRESS)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4103 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4104 * Assumption is that the target driver is working correctly.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4105 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4106 * More than one SATA command may be executed to perform operations specified
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4107 * by mode select pages. The first error terminates further execution.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4108 * Operations performed successully are not backed-up in such case.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4109 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4110 * NOTE: only caching mode select page is implemented.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4111 * 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
4112 * an unexpected device reset.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4113 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4114 * Returns TRAN_ACCEPT and appropriate values in scsi_pkt fields.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4115 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4116
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4117 static int
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4118 sata_txlt_mode_select(sata_pkt_txlate_t *spx)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4119 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4120 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4121 struct buf *bp = spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4122 struct scsi_extended_sense *sense;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4123 int len, pagelen, count, pllen;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4124 uint8_t *buf; /* mode select buffer */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4125 int rval, stat;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4126 uint_t nointr_flag;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4127 int dmod = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4128
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4129 SATADBG2(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4130 "sata_txlt_mode_select, pc %x page code 0x%02x\n",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4131 spx->txlt_scsi_pkt->pkt_cdbp[2] >> 6,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4132 spx->txlt_scsi_pkt->pkt_cdbp[2] & 0x3f);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4133
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4134 mutex_enter(&(SATA_TXLT_CPORT_MUTEX(spx)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4135
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4136 if ((rval = sata_txlt_generic_pkt_info(spx)) != TRAN_ACCEPT) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4137 mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4138 return (rval);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4139 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4140
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4141 rval = TRAN_ACCEPT;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4142
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4143 scsipkt->pkt_reason = CMD_CMPLT;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4144 scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4145 STATE_SENT_CMD | STATE_GOT_STATUS;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4146
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4147 /* Reject not supported request */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4148 if (! (scsipkt->pkt_cdbp[1] & 0x10) || /* No support for PF bit = 0 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4149 (scsipkt->pkt_cdbp[1] & 0x01)) { /* No support for SP (saving) */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4150 *scsipkt->pkt_scbp = STATUS_CHECK;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4151 sense = sata_arq_sense(spx);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4152 sense->es_key = KEY_ILLEGAL_REQUEST;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4153 sense->es_add_code = SD_SCSI_INVALID_FIELD_IN_CDB;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4154 goto done;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4155 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4156
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4157 if (scsipkt->pkt_cdbp[0] == SCMD_MODE_SELECT) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4158 pllen = scsipkt->pkt_cdbp[4];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4159 } else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4160 pllen = scsipkt->pkt_cdbp[7];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4161 pllen = (pllen << 8) | scsipkt->pkt_cdbp[7];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4162 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4163
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4164 *scsipkt->pkt_scbp = STATUS_GOOD; /* Presumed outcome */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4165
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4166 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
4167 buf = (uint8_t *)bp->b_un.b_addr;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4168 count = MIN(bp->b_bcount, pllen);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4169 scsipkt->pkt_state |= STATE_XFERRED_DATA;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4170 scsipkt->pkt_resid = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4171 pllen = count;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4172
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4173 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4174 * Check the header to skip the block descriptor(s) - we
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4175 * do not support setting device capacity.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4176 * Existing macros do not recognize long LBA dscriptor,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4177 * hence manual calculation.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4178 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4179 if (scsipkt->pkt_cdbp[0] == SCMD_MODE_SELECT) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4180 /* 6-bytes CMD, 4 bytes header */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4181 if (count <= 4)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4182 goto done; /* header only */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4183 len = buf[3] + 4;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4184 } else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4185 /* 10-bytes CMD, 8 bytes header */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4186 if (count <= 8)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4187 goto done; /* header only */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4188 len = buf[6];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4189 len = (len << 8) + buf[7] + 8;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4190 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4191 if (len >= count)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4192 goto done; /* header + descriptor(s) only */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4193
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4194 pllen -= len; /* remaining data length */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4195
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4196 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4197 * We may be executing SATA command and want to execute it
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4198 * in SYNCH mode, regardless of scsi_pkt setting.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4199 * Save scsi_pkt setting and indicate SYNCH mode
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4200 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4201 nointr_flag = scsipkt->pkt_flags & FLAG_NOINTR;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4202 if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0 &&
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4203 scsipkt->pkt_comp != NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4204 scsipkt->pkt_flags |= FLAG_NOINTR;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4205 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4206 spx->txlt_sata_pkt->satapkt_op_mode = SATA_OPMODE_SYNCH;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4207
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4208 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4209 * len is now the offset to a first mode select page
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4210 * Process all pages
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4211 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4212 while (pllen > 0) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4213 switch ((int)buf[len]) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4214 case MODEPAGE_CACHING:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4215 stat = sata_mode_select_page_8(spx,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4216 (struct mode_cache_scsi3 *)&buf[len],
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4217 pllen, &pagelen, &rval, &dmod);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4218 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4219 * The pagelen value indicates number of
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4220 * parameter bytes already processed.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4221 * The rval is return value from
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4222 * sata_tran_start().
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4223 * The stat indicates the overall status of
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4224 * the operation(s).
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4225 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4226 if (stat != SATA_SUCCESS)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4227 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4228 * Page processing did not succeed -
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4229 * all error info is already set-up,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4230 * just return
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4231 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4232 pllen = 0; /* this breaks the loop */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4233 else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4234 len += pagelen;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4235 pllen -= pagelen;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4236 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4237 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4238
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4239 default:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4240 *scsipkt->pkt_scbp = STATUS_CHECK;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4241 sense = sata_arq_sense(spx);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4242 sense->es_key = KEY_ILLEGAL_REQUEST;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4243 sense->es_add_code =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4244 SD_SCSI_INVALID_FIELD_IN_PARAMETER_LIST;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4245 goto done;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4246 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4247 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4248 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4249 done:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4250 mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4251 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4252 * If device parameters were modified, fetch and store the new
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4253 * Identify Device data. Since port mutex could have been released
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4254 * for accessing HBA driver, we need to re-check device existence.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4255 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4256 if (dmod != 0) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4257 sata_drive_info_t new_sdinfo, *sdinfo;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4258 int rv;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4259
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4260 new_sdinfo.satadrv_addr =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4261 spx->txlt_sata_pkt->satapkt_device.satadev_addr;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4262 rv = sata_fetch_device_identify_data(spx->txlt_sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4263 &new_sdinfo);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4264
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4265 mutex_enter(&(SATA_TXLT_CPORT_MUTEX(spx)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4266 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4267 * Since port mutex could have been released when
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4268 * accessing HBA driver, we need to re-check that the
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4269 * framework still holds the device info structure.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4270 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4271 sdinfo = sata_get_device_info(spx->txlt_sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4272 &spx->txlt_sata_pkt->satapkt_device);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4273 if (sdinfo != NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4274 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4275 * Device still has info structure in the
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4276 * sata framework. Copy newly fetched info
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4277 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4278 if (rv == 0) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4279 sdinfo->satadrv_id = new_sdinfo.satadrv_id;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4280 sata_save_drive_settings(sdinfo);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4281 } else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4282 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4283 * Could not fetch new data - invalidate
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4284 * sata_drive_info. That makes device
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4285 * unusable.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4286 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4287 sdinfo->satadrv_type = SATA_DTYPE_UNKNOWN;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4288 sdinfo->satadrv_state = SATA_STATE_UNKNOWN;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4289 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4290 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4291 if (rv != 0 || sdinfo == NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4292 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4293 * This changes the overall mode select completion
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4294 * reason to a failed one !!!!!
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4295 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4296 *scsipkt->pkt_scbp = STATUS_CHECK;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4297 sense = sata_arq_sense(spx);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4298 scsipkt->pkt_reason = CMD_INCOMPLETE;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4299 rval = TRAN_ACCEPT;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4300 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4301 mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4302 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4303 /* Restore the scsi pkt flags */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4304 scsipkt->pkt_flags &= ~FLAG_NOINTR;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4305 scsipkt->pkt_flags |= nointr_flag;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4306
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4307 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4308 "Scsi_pkt completion reason %x\n", scsipkt->pkt_reason);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4309
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4310 if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0 &&
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4311 scsipkt->pkt_comp != NULL)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4312 /* scsi callback required */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4313 (*scsipkt->pkt_comp)(scsipkt);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4314
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4315 return (rval);
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
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4320 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4321 * Translate command: Log Sense
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4322 * Not implemented at this time - returns invalid command response.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4323 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4324 static int
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4325 sata_txlt_log_sense(sata_pkt_txlate_t *spx)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4326 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4327 SATADBG2(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4328 "sata_txlt_log_sense, pc %x, page code %x\n",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4329 spx->txlt_scsi_pkt->pkt_cdbp[2] >> 6,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4330 spx->txlt_scsi_pkt->pkt_cdbp[2] & 0x3f);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4331
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4332 return (sata_txlt_invalid_command(spx));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4333 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4334
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4335 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4336 * Translate command: Log Select
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4337 * Not implemented at this time - returns invalid command response.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4338 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4339 static int
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4340 sata_txlt_log_select(sata_pkt_txlate_t *spx)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4341 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4342 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4343 "sata_txlt_log_select\n", NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4344
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4345 return (sata_txlt_invalid_command(spx));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4346 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4347
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 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4350 * Translate command: Read (various types).
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4351 * Translated into appropriate type of ATA READ command
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4352 * (NO ATAPI implementation yet).
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4353 * Both the device capabilities and requested operation mode are
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4354 * considered.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4355 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4356 * Following scsi cdb fields are ignored:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4357 * rdprotect, dpo, fua, fua_nv, group_number.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4358 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4359 * 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
4360 * enable variable sata_func_enable), the capability of the controller and
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4361 * capability of a device are checked and if both support queueing, read
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4362 * 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
4363 * command rather than plain READ_XXX command.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4364 * 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
4365 * both the controller and device suport such functionality, the read
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4366 * request will be translated to READ_FPDMA_QUEUED command.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4367 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4368 * Returns TRAN_ACCEPT or code returned by sata_hba_start() and
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4369 * appropriate values in scsi_pkt fields.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4370 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4371 static int
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4372 sata_txlt_read(sata_pkt_txlate_t *spx)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4373 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4374 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4375 sata_cmd_t *scmd = &spx->txlt_sata_pkt->satapkt_cmd;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4376 sata_drive_info_t *sdinfo;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4377 sata_hba_inst_t *shi = SATA_TXLT_HBA_INST(spx);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4378 int cport = SATA_TXLT_CPORT(spx);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4379 uint16_t sec_count;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4380 uint64_t lba;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4381 int rval;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4382 int synch;
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_enter(&(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 ((rval = sata_txlt_generic_pkt_info(spx)) != TRAN_ACCEPT) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4387 mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4388 return (rval);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4389 }
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 sdinfo = sata_get_device_info(spx->txlt_sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4392 &spx->txlt_sata_pkt->satapkt_device);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4393
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4394 scmd->satacmd_flags &= ~SATA_XFER_DIR_MASK;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4395 scmd->satacmd_flags |= SATA_DIR_READ;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4396 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4397 * Build cmd block depending on the device capability and
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4398 * requested operation mode.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4399 * Do not bother with non-dma mode.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4400 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4401 switch ((uint_t)scsipkt->pkt_cdbp[0]) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4402 case SCMD_READ:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4403 /* 6-byte scsi read cmd : 0x08 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4404 lba = (scsipkt->pkt_cdbp[1] & 0x1f);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4405 lba = (lba << 8) | scsipkt->pkt_cdbp[2];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4406 lba = (lba << 8) | scsipkt->pkt_cdbp[3];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4407 sec_count = scsipkt->pkt_cdbp[4];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4408 /* sec_count 0 will be interpreted as 256 by a device */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4409 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4410 case SCMD_READ_G1:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4411 /* 10-bytes scsi read command : 0x28 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4412 lba = scsipkt->pkt_cdbp[2];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4413 lba = (lba << 8) | scsipkt->pkt_cdbp[3];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4414 lba = (lba << 8) | scsipkt->pkt_cdbp[4];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4415 lba = (lba << 8) | scsipkt->pkt_cdbp[5];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4416 sec_count = scsipkt->pkt_cdbp[7];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4417 sec_count = (sec_count << 8) | scsipkt->pkt_cdbp[8];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4418 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4419 case SCMD_READ_G5:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4420 /* 12-bytes scsi read command : 0xA8 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4421 lba = scsipkt->pkt_cdbp[2];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4422 lba = (lba << 8) | scsipkt->pkt_cdbp[3];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4423 lba = (lba << 8) | scsipkt->pkt_cdbp[4];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4424 lba = (lba << 8) | scsipkt->pkt_cdbp[5];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4425 sec_count = scsipkt->pkt_cdbp[6];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4426 sec_count = (sec_count << 8) | scsipkt->pkt_cdbp[7];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4427 sec_count = (sec_count << 8) | scsipkt->pkt_cdbp[8];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4428 sec_count = (sec_count << 8) | scsipkt->pkt_cdbp[9];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4429 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4430 case SCMD_READ_G4:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4431 /* 16-bytes scsi read command : 0x88 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4432 lba = scsipkt->pkt_cdbp[2];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4433 lba = (lba << 8) | scsipkt->pkt_cdbp[3];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4434 lba = (lba << 8) | scsipkt->pkt_cdbp[4];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4435 lba = (lba << 8) | scsipkt->pkt_cdbp[5];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4436 lba = (lba << 8) | scsipkt->pkt_cdbp[6];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4437 lba = (lba << 8) | scsipkt->pkt_cdbp[7];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4438 lba = (lba << 8) | scsipkt->pkt_cdbp[8];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4439 lba = (lba << 8) | scsipkt->pkt_cdbp[9];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4440 sec_count = scsipkt->pkt_cdbp[10];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4441 sec_count = (sec_count << 8) | scsipkt->pkt_cdbp[11];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4442 sec_count = (sec_count << 8) | scsipkt->pkt_cdbp[12];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4443 sec_count = (sec_count << 8) | scsipkt->pkt_cdbp[13];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4444 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4445 default:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4446 /* Unsupported command */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4447 mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4448 return (sata_txlt_invalid_command(spx));
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
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4451 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4452 * Check if specified address exceeds device capacity
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4453 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4454 if ((lba >= sdinfo->satadrv_capacity) ||
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4455 ((lba + sec_count) >= sdinfo->satadrv_capacity)) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4456 /* LBA out of range */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4457 mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4458 return (sata_txlt_lba_out_of_range(spx));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4459 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4460
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4461 scmd->satacmd_addr_type = ATA_ADDR_LBA;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4462 scmd->satacmd_device_reg = SATA_ADH_LBA;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4463 scmd->satacmd_cmd_reg = SATAC_READ_DMA;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4464 if (sdinfo->satadrv_features_support & SATA_DEV_F_LBA48) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4465 scmd->satacmd_addr_type = ATA_ADDR_LBA48;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4466 scmd->satacmd_cmd_reg = SATAC_READ_DMA_EXT;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4467 scmd->satacmd_sec_count_msb = sec_count >> 8;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4468 #ifndef __lock_lint
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4469 scmd->satacmd_lba_low_msb = (lba >> 24) & 0xff;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4470 scmd->satacmd_lba_mid_msb = (lba >> 32) & 0xff;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4471 scmd->satacmd_lba_high_msb = lba >> 40;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4472 #endif
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4473 } else if (sdinfo->satadrv_features_support & SATA_DEV_F_LBA28) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4474 scmd->satacmd_addr_type = ATA_ADDR_LBA28;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4475 scmd->satacmd_device_reg = SATA_ADH_LBA | ((lba >> 24) & 0xf);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4476 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4477 scmd->satacmd_sec_count_lsb = sec_count & 0xff;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4478 scmd->satacmd_lba_low_lsb = lba & 0xff;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4479 scmd->satacmd_lba_mid_lsb = (lba >> 8) & 0xff;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4480 scmd->satacmd_lba_high_lsb = (lba >> 16) & 0xff;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4481 scmd->satacmd_features_reg = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4482 scmd->satacmd_status_reg = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4483 scmd->satacmd_error_reg = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4484
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4485 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4486 * Check if queueing commands should be used and switch
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4487 * to appropriate command if possible
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4488 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4489 if (sata_func_enable & SATA_ENABLE_QUEUING) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4490 if (sdinfo->satadrv_queue_depth > 1 &&
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4491 SATA_QDEPTH(spx->txlt_sata_hba_inst) > 1) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4492 /* Queuing supported by controller and device */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4493 if ((sata_func_enable & SATA_ENABLE_NCQ) &&
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4494 (sdinfo->satadrv_features_support &
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4495 SATA_DEV_F_NCQ) &&
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4496 (SATA_FEATURES(spx->txlt_sata_hba_inst) &
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4497 SATA_CTLF_NCQ)) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4498 /* NCQ supported - use FPDMA READ */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4499 scmd->satacmd_cmd_reg =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4500 SATAC_READ_FPDMA_QUEUED;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4501 scmd->satacmd_features_reg_ext =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4502 scmd->satacmd_sec_count_msb;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4503 scmd->satacmd_sec_count_msb = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4504 } else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4505 /* Legacy queueing */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4506 if (sdinfo->satadrv_features_support &
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4507 SATA_DEV_F_LBA48) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4508 scmd->satacmd_cmd_reg =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4509 SATAC_READ_DMA_QUEUED_EXT;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4510 scmd->satacmd_features_reg_ext =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4511 scmd->satacmd_sec_count_msb;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4512 scmd->satacmd_sec_count_msb = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4513 } else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4514 scmd->satacmd_cmd_reg =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4515 SATAC_READ_DMA_QUEUED;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4516 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4517 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4518 scmd->satacmd_features_reg =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4519 scmd->satacmd_sec_count_lsb;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4520 scmd->satacmd_sec_count_lsb = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4521 scmd->satacmd_flags |= SATA_QUEUED_CMD;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4522 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4523 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4524
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4525 SATADBG3(SATA_DBG_HBA_IF, spx->txlt_sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4526 "sata_txlt_read cmd 0x%2x, lba %llx, sec count %x\n",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4527 scmd->satacmd_cmd_reg, lba, sec_count);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4528
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4529 if (!(spx->txlt_sata_pkt->satapkt_op_mode & SATA_OPMODE_SYNCH)) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4530 /* Need callback function */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4531 spx->txlt_sata_pkt->satapkt_comp = sata_txlt_rw_completion;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4532 synch = FALSE;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4533 } else
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4534 synch = TRUE;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4535
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4536 /* Transfer command to HBA */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4537 if (sata_hba_start(spx, &rval) != 0) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4538 /* Pkt not accepted for execution */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4539 mutex_exit(&SATA_CPORT_MUTEX(shi, cport));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4540 return (rval);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4541 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4542 mutex_exit(&SATA_CPORT_MUTEX(shi, cport));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4543 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4544 * If execution is non-synchronous,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4545 * a callback function will handle potential errors, translate
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4546 * the response and will do a callback to a target driver.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4547 * If it was synchronous, check execution status using the same
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4548 * framework callback.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4549 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4550 if (synch) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4551 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4552 "synchronous execution status %x\n",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4553 spx->txlt_sata_pkt->satapkt_reason);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4554 sata_txlt_rw_completion(spx->txlt_sata_pkt);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4555 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4556 return (TRAN_ACCEPT);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4557 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4558
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4559
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4560 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4561 * SATA translate command: Write (various types)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4562 * Translated into appropriate type of ATA WRITE command
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4563 * (NO ATAPI implementation yet).
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4564 * Both the device capabilities and requested operation mode are
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4565 * considered.
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 * Following scsi cdb fields are ignored:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4568 * rwprotect, dpo, fua, fua_nv, group_number.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4569 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4570 * Returns TRAN_ACCEPT or code returned by sata_hba_start() and
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4571 * appropriate values in scsi_pkt fields.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4572 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4573 static int
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4574 sata_txlt_write(sata_pkt_txlate_t *spx)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4575 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4576 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4577 sata_cmd_t *scmd = &spx->txlt_sata_pkt->satapkt_cmd;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4578 sata_drive_info_t *sdinfo;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4579 sata_hba_inst_t *shi = SATA_TXLT_HBA_INST(spx);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4580 int cport = SATA_TXLT_CPORT(spx);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4581 uint16_t sec_count;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4582 uint64_t lba;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4583 int rval;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4584 int synch;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4585
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4586 mutex_enter(&(SATA_TXLT_CPORT_MUTEX(spx)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4587
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4588 if ((rval = sata_txlt_generic_pkt_info(spx)) != TRAN_ACCEPT) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4589 mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4590 return (rval);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4591 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4592
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4593 sdinfo = sata_get_device_info(spx->txlt_sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4594 &spx->txlt_sata_pkt->satapkt_device);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4595
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4596 scmd->satacmd_flags &= ~SATA_XFER_DIR_MASK;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4597 scmd->satacmd_flags |= SATA_DIR_WRITE;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4598 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4599 * Build cmd block depending on the device capability and
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4600 * requested operation mode.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4601 * Do not bother with non-dma mode.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4602 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4603 switch ((uint_t)scsipkt->pkt_cdbp[0]) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4604 case SCMD_WRITE:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4605 /* 6-byte scsi read cmd : 0x0A */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4606 lba = (scsipkt->pkt_cdbp[1] & 0x1f);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4607 lba = (lba << 8) | scsipkt->pkt_cdbp[2];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4608 lba = (lba << 8) | scsipkt->pkt_cdbp[3];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4609 sec_count = scsipkt->pkt_cdbp[4];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4610 /* sec_count 0 will be interpreted as 256 by a device */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4611 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4612 case SCMD_WRITE_G1:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4613 /* 10-bytes scsi write command : 0x2A */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4614 lba = scsipkt->pkt_cdbp[2];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4615 lba = (lba << 8) | scsipkt->pkt_cdbp[3];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4616 lba = (lba << 8) | scsipkt->pkt_cdbp[4];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4617 lba = (lba << 8) | scsipkt->pkt_cdbp[5];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4618 sec_count = scsipkt->pkt_cdbp[7];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4619 sec_count = (sec_count << 8) | scsipkt->pkt_cdbp[8];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4620 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4621 case SCMD_WRITE_G5:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4622 /* 12-bytes scsi read command : 0xAA */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4623 lba = scsipkt->pkt_cdbp[2];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4624 lba = (lba << 8) | scsipkt->pkt_cdbp[3];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4625 lba = (lba << 8) | scsipkt->pkt_cdbp[4];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4626 lba = (lba << 8) | scsipkt->pkt_cdbp[5];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4627 sec_count = scsipkt->pkt_cdbp[6];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4628 sec_count = (sec_count << 8) | scsipkt->pkt_cdbp[7];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4629 sec_count = (sec_count << 8) | scsipkt->pkt_cdbp[8];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4630 sec_count = (sec_count << 8) | scsipkt->pkt_cdbp[9];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4631 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4632 case SCMD_WRITE_G4:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4633 /* 16-bytes scsi write command : 0x8A */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4634 lba = scsipkt->pkt_cdbp[2];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4635 lba = (lba << 8) | scsipkt->pkt_cdbp[3];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4636 lba = (lba << 8) | scsipkt->pkt_cdbp[4];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4637 lba = (lba << 8) | scsipkt->pkt_cdbp[5];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4638 lba = (lba << 8) | scsipkt->pkt_cdbp[6];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4639 lba = (lba << 8) | scsipkt->pkt_cdbp[7];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4640 lba = (lba << 8) | scsipkt->pkt_cdbp[8];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4641 lba = (lba << 8) | scsipkt->pkt_cdbp[9];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4642 sec_count = scsipkt->pkt_cdbp[10];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4643 sec_count = (sec_count << 8) | scsipkt->pkt_cdbp[11];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4644 sec_count = (sec_count << 8) | scsipkt->pkt_cdbp[12];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4645 sec_count = (sec_count << 8) | scsipkt->pkt_cdbp[13];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4646 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4647 default:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4648 /* Unsupported command */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4649 mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4650 return (sata_txlt_invalid_command(spx));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4651 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4652
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4653 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4654 * Check if specified address and length exceeds device capacity
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 if ((lba >= sdinfo->satadrv_capacity) ||
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4657 ((lba + sec_count) >= sdinfo->satadrv_capacity)) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4658 /* LBA out of range */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4659 mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4660 return (sata_txlt_lba_out_of_range(spx));
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
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4663 scmd->satacmd_addr_type = ATA_ADDR_LBA;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4664 scmd->satacmd_device_reg = SATA_ADH_LBA;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4665 scmd->satacmd_cmd_reg = SATAC_WRITE_DMA;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4666 if (sdinfo->satadrv_features_support & SATA_DEV_F_LBA48) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4667 scmd->satacmd_addr_type = ATA_ADDR_LBA48;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4668 scmd->satacmd_cmd_reg = SATAC_WRITE_DMA_EXT;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4669 scmd->satacmd_sec_count_msb = sec_count >> 8;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4670 scmd->satacmd_lba_low_msb = (lba >> 24) & 0xff;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4671 #ifndef __lock_lint
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4672 scmd->satacmd_lba_mid_msb = (lba >> 32) & 0xff;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4673 scmd->satacmd_lba_high_msb = lba >> 40;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4674 #endif
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4675 } else if (sdinfo->satadrv_features_support & SATA_DEV_F_LBA28) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4676 scmd->satacmd_addr_type = ATA_ADDR_LBA28;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4677 scmd->satacmd_device_reg = SATA_ADH_LBA | ((lba >> 24) & 0xf);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4678 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4679 scmd->satacmd_sec_count_lsb = sec_count & 0xff;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4680 scmd->satacmd_lba_low_lsb = lba & 0xff;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4681 scmd->satacmd_lba_mid_lsb = (lba >> 8) & 0xff;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4682 scmd->satacmd_lba_high_lsb = (lba >> 16) & 0xff;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4683 scmd->satacmd_features_reg = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4684 scmd->satacmd_status_reg = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4685 scmd->satacmd_error_reg = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4686
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4687 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4688 * Check if queueing commands should be used and switch
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4689 * to appropriate command if possible
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4690 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4691 if (sata_func_enable & SATA_ENABLE_QUEUING) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4692 if (sdinfo->satadrv_queue_depth > 1 &&
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4693 SATA_QDEPTH(spx->txlt_sata_hba_inst) > 1) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4694 /* Queuing supported by controller and device */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4695 if ((sata_func_enable & SATA_ENABLE_NCQ) &&
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4696 (sdinfo->satadrv_features_support &
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4697 SATA_DEV_F_NCQ) &&
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4698 (SATA_FEATURES(spx->txlt_sata_hba_inst) &
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4699 SATA_CTLF_NCQ)) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4700 /* NCQ supported - use FPDMA WRITE */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4701 scmd->satacmd_cmd_reg =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4702 SATAC_WRITE_FPDMA_QUEUED;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4703 scmd->satacmd_features_reg_ext =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4704 scmd->satacmd_sec_count_msb;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4705 scmd->satacmd_sec_count_msb = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4706 scmd->satacmd_rle_sata_cmd = NULL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4707 } else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4708 /* Legacy queueing */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4709 if (sdinfo->satadrv_features_support &
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4710 SATA_DEV_F_LBA48) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4711 scmd->satacmd_cmd_reg =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4712 SATAC_WRITE_DMA_QUEUED_EXT;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4713 scmd->satacmd_features_reg_ext =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4714 scmd->satacmd_sec_count_msb;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4715 scmd->satacmd_sec_count_msb = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4716 } else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4717 scmd->satacmd_cmd_reg =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4718 SATAC_WRITE_DMA_QUEUED;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4719 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4720 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4721 scmd->satacmd_features_reg =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4722 scmd->satacmd_sec_count_lsb;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4723 scmd->satacmd_sec_count_lsb = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4724 scmd->satacmd_flags |= SATA_QUEUED_CMD;
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 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4727
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4728 SATADBG3(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4729 "sata_txlt_write cmd 0x%2x, lba %llx, sec count %x\n",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4730 scmd->satacmd_cmd_reg, lba, sec_count);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4731
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4732 if (!(spx->txlt_sata_pkt->satapkt_op_mode & SATA_OPMODE_SYNCH)) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4733 /* Need callback function */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4734 spx->txlt_sata_pkt->satapkt_comp = sata_txlt_rw_completion;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4735 synch = FALSE;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4736 } else
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4737 synch = TRUE;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4738
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4739 /* Transfer command to HBA */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4740 if (sata_hba_start(spx, &rval) != 0) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4741 /* Pkt not accepted for execution */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4742 mutex_exit(&SATA_CPORT_MUTEX(shi, cport));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4743 return (rval);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4744 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4745 mutex_exit(&SATA_CPORT_MUTEX(shi, cport));
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 * If execution is non-synchronous,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4749 * a callback function will handle potential errors, translate
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4750 * the response and will do a callback to a target driver.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4751 * If it was synchronous, check execution status using the same
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4752 * framework callback.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4753 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4754 if (synch) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4755 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4756 "synchronous execution status %x\n",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4757 spx->txlt_sata_pkt->satapkt_reason);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4758 sata_txlt_rw_completion(spx->txlt_sata_pkt);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4759 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4760 return (TRAN_ACCEPT);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4761 }
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 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4765 * NOTE: NOT FUNCTIONAL IMPLEMENTATION. THIS IS A PLACEHOLDER for the function
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4766 * that will be fixed in phase 2 of the development.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4767 * Currently ATAPI is not supported. ATAPI devices are threated as not-valid
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4768 * devices.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4769 * This function is not called, since scsi_sata_start() will bail-out prior
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4770 * to calling it.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4771 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4772 static int
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4773 sata_txlt_atapi(sata_pkt_txlate_t *spx)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4774 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4775 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4776 sata_cmd_t *scmd = &spx->txlt_sata_pkt->satapkt_cmd;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4777 struct buf *bp = spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4778 sata_hba_inst_t *shi = SATA_TXLT_HBA_INST(spx);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4779 int cport = SATA_TXLT_CPORT(spx);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4780 int rval;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4781 int synch;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4782 union scsi_cdb *cdbp = (union scsi_cdb *)scsipkt->pkt_cdbp;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4783
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4784 mutex_enter(&(SATA_TXLT_CPORT_MUTEX(spx)));
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 ((rval = sata_txlt_generic_pkt_info(spx)) != TRAN_ACCEPT) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4787 mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4788 return (rval);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4789 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4790
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4791 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4792 * scmd->satacmd_flags default - SATA_DIR_NODATA_XFER - is set by
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4793 * sata_txlt_generic_pkt_info().
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4794 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4795 if (scmd->satacmd_bp) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4796 if (scmd->satacmd_bp->b_flags & B_READ) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4797 scmd->satacmd_flags &= ~SATA_XFER_DIR_MASK;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4798 scmd->satacmd_flags |= SATA_DIR_READ;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4799 } else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4800 scmd->satacmd_flags &= ~SATA_XFER_DIR_MASK;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4801 scmd->satacmd_flags |= SATA_DIR_WRITE;
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
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4805 scmd->satacmd_acdb_len = scsi_cdb_size[GETGROUP(cdbp)];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4806 scmd->satacmd_cmd_reg = SATAC_PACKET;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4807 bcopy(cdbp, scmd->satacmd_acdb, 16);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4808
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4809 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4810 * For non-read/write commands we need to
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4811 * map buffer
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4812 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4813 switch ((uint_t)scsipkt->pkt_cdbp[0]) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4814 case SCMD_READ:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4815 case SCMD_READ_G1:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4816 case SCMD_READ_G5:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4817 case SCMD_READ_G4:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4818 case SCMD_WRITE:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4819 case SCMD_WRITE_G1:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4820 case SCMD_WRITE_G5:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4821 case SCMD_WRITE_G4:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4822 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4823 default:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4824 if (bp->b_flags & (B_PHYS | B_PAGEIO))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4825 bp_mapin(bp);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4826 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4827 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4828
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4829 if (!(spx->txlt_sata_pkt->satapkt_op_mode & SATA_OPMODE_SYNCH)) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4830 /* Need callback function */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4831 spx->txlt_sata_pkt->satapkt_comp = sata_txlt_atapi_completion;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4832 synch = FALSE;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4833 } else
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4834 synch = TRUE;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4835
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4836 /* Transfer command to HBA */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4837 if (sata_hba_start(spx, &rval) != 0) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4838 /* Pkt not accepted for execution */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4839 mutex_exit(&SATA_CPORT_MUTEX(shi, cport));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4840 return (rval);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4841 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4842 mutex_exit(&SATA_CPORT_MUTEX(shi, cport));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4843 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4844 * If execution is non-synchronous,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4845 * a callback function will handle potential errors, translate
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4846 * the response and will do a callback to a target driver.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4847 * If it was synchronous, check execution status using the same
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4848 * framework callback.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4849 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4850 if (synch) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4851 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4852 "synchronous execution status %x\n",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4853 spx->txlt_sata_pkt->satapkt_reason);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4854 sata_txlt_atapi_completion(spx->txlt_sata_pkt);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4855 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4856 return (TRAN_ACCEPT);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4857 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4858
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4859 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4860 * Translate command: Synchronize Cache.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4861 * Translates into Flush Cache command.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4862 * (NO ATAPI implementation yet).
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4863 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4864 * NOTE: We should check if Flush Cache is supported by the device (ATAPI
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4865 * devices)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4866 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4867 * Returns TRAN_ACCEPT or code returned by sata_hba_start() and
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4868 * appropriate values in scsi_pkt fields.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4869 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4870 static int
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4871 sata_txlt_synchronize_cache(sata_pkt_txlate_t *spx)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4872 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4873 sata_cmd_t *scmd = &spx->txlt_sata_pkt->satapkt_cmd;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4874 sata_hba_inst_t *shi = SATA_TXLT_HBA_INST(spx);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4875 int cport = SATA_TXLT_CPORT(spx);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4876 int rval;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4877 int synch;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4878
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4879 mutex_enter(&(SATA_TXLT_CPORT_MUTEX(spx)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4880
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4881 if ((rval = sata_txlt_generic_pkt_info(spx)) != TRAN_ACCEPT) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4882 mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4883 return (rval);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4884 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4885
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4886 scmd->satacmd_addr_type = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4887 scmd->satacmd_cmd_reg = SATAC_FLUSH_CACHE;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4888 scmd->satacmd_device_reg = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4889 scmd->satacmd_sec_count_lsb = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4890 scmd->satacmd_lba_low_lsb = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4891 scmd->satacmd_lba_mid_lsb = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4892 scmd->satacmd_lba_high_lsb = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4893 scmd->satacmd_features_reg = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4894 scmd->satacmd_status_reg = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4895 scmd->satacmd_error_reg = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4896
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4897 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4898 "sata_txlt_synchronize_cache\n", NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4899
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4900 if (!(spx->txlt_sata_pkt->satapkt_op_mode & SATA_OPMODE_SYNCH)) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4901 /* Need to set-up a callback function */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4902 spx->txlt_sata_pkt->satapkt_comp =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4903 sata_txlt_nodata_cmd_completion;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4904 synch = FALSE;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4905 } else
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4906 synch = TRUE;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4907
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4908 /* Transfer command to HBA */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4909 if (sata_hba_start(spx, &rval) != 0) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4910 /* Pkt not accepted for execution */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4911 mutex_exit(&SATA_CPORT_MUTEX(shi, cport));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4912 return (rval);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4913 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4914 mutex_exit(&SATA_CPORT_MUTEX(shi, cport));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4915
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4916 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4917 * If execution non-synchronous, it had to be completed
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4918 * a callback function will handle potential errors, translate
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4919 * the response and will do a callback to a target driver.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4920 * If it was synchronous, check status, using the same
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4921 * framework callback.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4922 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4923 if (synch) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4924 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4925 "synchronous execution status %x\n",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4926 spx->txlt_sata_pkt->satapkt_reason);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4927 sata_txlt_nodata_cmd_completion(spx->txlt_sata_pkt);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4928 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4929 return (TRAN_ACCEPT);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4930 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4931
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4932
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4933 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4934 * Send pkt to SATA HBA driver
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 * 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
4937 * i.e. scsi_pkt is not NULL.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4938 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4939 * 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
4940 * the mutex when it calls HBA driver sata_tran_start function and
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4941 * re-acquires it afterwards.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4942 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4943 * If return value is 0, pkt was accepted, -1 otherwise
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4944 * rval is set to appropriate sata_scsi_start return value.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4945 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4946 * 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
4947 * have called the sata_pkt callback function for this packet.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4948 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4949 * 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
4950 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4951 * Note 2: No port multiplier support for now.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4952 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4953 static int
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4954 sata_hba_start(sata_pkt_txlate_t *spx, int *rval)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4955 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4956 int stat;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4957 sata_hba_inst_t *sata_hba_inst = spx->txlt_sata_hba_inst;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4958 sata_drive_info_t *sdinfo;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4959 sata_device_t sata_device;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4960 uint8_t cmd;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4961 uint32_t cmd_flags;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4962
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4963 ASSERT(spx->txlt_sata_pkt != NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4964 ASSERT(mutex_owned(&SATA_CPORT_MUTEX(spx->txlt_sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4965 spx->txlt_sata_pkt->satapkt_device.satadev_addr.cport)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4966
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4967 sdinfo = sata_get_device_info(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4968 &spx->txlt_sata_pkt->satapkt_device);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4969 ASSERT(sdinfo != NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4970
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4971 /* Clear device reset state? */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4972 if (sdinfo->satadrv_event_flags & SATA_EVNT_CLEAR_DEVICE_RESET) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4973 spx->txlt_sata_pkt->satapkt_cmd.satacmd_flags |=
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4974 SATA_CLEAR_DEV_RESET_STATE;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4975 sdinfo->satadrv_event_flags &= ~SATA_EVNT_CLEAR_DEVICE_RESET;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4976 SATADBG1(SATA_DBG_EVENTS, sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4977 "sata_hba_start: clearing device reset state\n", NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4978 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4979 cmd = spx->txlt_sata_pkt->satapkt_cmd.satacmd_cmd_reg;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4980 cmd_flags = spx->txlt_sata_pkt->satapkt_cmd.satacmd_flags;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4981 sata_device = spx->txlt_sata_pkt->satapkt_device; /* local copy */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4982
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4983 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4984 sdinfo->satadrv_addr.cport)));
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 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4987 "Sata cmd 0x%2x\n", cmd);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4988
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4989 stat = (*SATA_START_FUNC(sata_hba_inst))(SATA_DIP(sata_hba_inst),
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4990 spx->txlt_sata_pkt);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4991
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4992 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4993 sdinfo->satadrv_addr.cport)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4994 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4995 * If sata pkt was accepted and executed in asynchronous mode, i.e.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4996 * with the sata callback, the sata_pkt could be already destroyed
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4997 * by the time we check ther return status from the hba_start()
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4998 * function, because sata_scsi_destroy_pkt() could have been already
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4999 * called (perhaps in the interrupt context). So, in such case, there
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5000 * should be no references to it. In other cases, sata_pkt still
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5001 * exists.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5002 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5003 switch (stat) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5004 case SATA_TRAN_ACCEPTED:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5005 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5006 * pkt accepted for execution.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5007 * If it was executed synchronously, it is already completed
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5008 * and pkt completion_reason indicates completion status.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5009 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5010 *rval = TRAN_ACCEPT;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5011 return (0);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5012
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5013 case SATA_TRAN_QUEUE_FULL:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5014 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5015 * Controller detected queue full condition.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5016 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5017 SATADBG1(SATA_DBG_HBA_IF, sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5018 "sata_hba_start: queue full\n", NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5019
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5020 spx->txlt_scsi_pkt->pkt_reason = CMD_INCOMPLETE;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5021 *spx->txlt_scsi_pkt->pkt_scbp = STATUS_QFULL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5022
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5023 *rval = TRAN_BUSY;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5024 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5025
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5026 case SATA_TRAN_PORT_ERROR:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5027 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5028 * Communication/link with device or general port error
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5029 * detected before pkt execution begun.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5030 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5031 if (spx->txlt_sata_pkt->satapkt_device.satadev_addr.qual ==
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5032 SATA_ADDR_CPORT)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5033 sata_log(sata_hba_inst, CE_CONT,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5034 "port %d error",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5035 sata_device.satadev_addr.cport);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5036 else
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5037 sata_log(sata_hba_inst, CE_CONT,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5038 "port %d pmport %d error\n",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5039 sata_device.satadev_addr.cport,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5040 sata_device.satadev_addr.pmport);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5041
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5042 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5043 * Update the port/device structure.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5044 * sata_pkt should be still valid. Since port error is
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5045 * returned, sata_device content should reflect port
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5046 * state - it means, that sata address have been changed,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5047 * because original packet's sata address refered to a device
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5048 * attached to some port.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5049 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5050 sata_update_port_info(sata_hba_inst, &sata_device);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5051 spx->txlt_scsi_pkt->pkt_reason = CMD_TRAN_ERR;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5052 *rval = TRAN_FATAL_ERROR;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5053 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5054
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5055 case SATA_TRAN_CMD_UNSUPPORTED:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5056 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5057 * Command rejected by HBA as unsupported. It was HBA driver
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5058 * that rejected the command, command was not sent to
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5059 * an attached device.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5060 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5061 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5062 sdinfo->satadrv_addr.cport)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5063 (void) sata_txlt_invalid_command(spx);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5064 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5065 sdinfo->satadrv_addr.cport)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5066
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5067 if (sdinfo->satadrv_state & SATA_DSTATE_RESET)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5068 SATADBG1(SATA_DBG_EVENTS, sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5069 "sat_hba_start: cmd 0x%2x rejected "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5070 "with SATA_TRAN_CMD_UNSUPPORTED status\n", cmd);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5071
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5072 *rval = TRAN_ACCEPT;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5073 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5074
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5075 case SATA_TRAN_BUSY:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5076 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5077 * Command rejected by HBA because other operation prevents
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5078 * accepting the packet, or device is in RESET condition.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5079 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5080 if (sdinfo != NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5081 sdinfo->satadrv_state =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5082 spx->txlt_sata_pkt->satapkt_device.satadev_state;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5083
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5084 if (sdinfo->satadrv_state & SATA_DSTATE_RESET) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5085 SATADBG1(SATA_DBG_EVENTS, sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5086 "sata_hba_start: cmd 0x%2x rejected "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5087 "because of device reset condition\n",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5088 cmd);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5089 } else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5090 SATADBG1(SATA_DBG_EVENTS, sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5091 "sata_hba_start: cmd 0x%2x rejected "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5092 "with SATA_TRAN_BUSY status\n",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5093 cmd);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5094 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5095 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5096 spx->txlt_scsi_pkt->pkt_reason = CMD_INCOMPLETE;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5097 *rval = TRAN_BUSY;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5098 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5099
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5100 default:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5101 /* Unrecognized HBA response */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5102 SATA_LOG_D((sata_hba_inst, CE_WARN,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5103 "sata_hba_start: unrecognized HBA response "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5104 "to cmd : 0x%2x resp 0x%x", cmd, rval));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5105 spx->txlt_scsi_pkt->pkt_reason = CMD_TRAN_ERR;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5106 *rval = TRAN_FATAL_ERROR;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5107 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5108 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5109
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5110 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5111 * If we got here, the packet was rejected.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5112 * Check if we need to remember reset state clearing request
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5113 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5114 if (cmd_flags & SATA_CLEAR_DEV_RESET_STATE) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5115 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5116 * Check if device is still configured - it may have
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5117 * disapeared from the configuration
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5118 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5119 sdinfo = sata_get_device_info(sata_hba_inst, &sata_device);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5120 if (sdinfo != NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5121 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5122 * Restore the flag that requests clearing of
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5123 * the device reset state,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5124 * so the next sata packet may carry it to HBA.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5125 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5126 sdinfo->satadrv_event_flags |=
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5127 SATA_EVNT_CLEAR_DEVICE_RESET;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5128 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5129 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5130 return (-1);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5131 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5132
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5133 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5134 * Scsi response setup for invalid LBA
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5135 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5136 * Returns TRAN_ACCEPT and appropriate values in scsi_pkt fields.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5137 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5138 static int
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5139 sata_txlt_lba_out_of_range(sata_pkt_txlate_t *spx)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5140 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5141 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5142 struct scsi_extended_sense *sense;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5143
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5144 scsipkt->pkt_reason = CMD_CMPLT;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5145 scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5146 STATE_SENT_CMD | STATE_GOT_STATUS;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5147 *scsipkt->pkt_scbp = STATUS_CHECK;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5148
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5149 *scsipkt->pkt_scbp = STATUS_CHECK;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5150 sense = sata_arq_sense(spx);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5151 sense->es_key = KEY_ILLEGAL_REQUEST;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5152 sense->es_add_code = SD_SCSI_LBA_OUT_OF_RANGE;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5153
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5154 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5155 "Scsi_pkt completion reason %x\n", scsipkt->pkt_reason);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5156
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5157 if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0 &&
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5158 scsipkt->pkt_comp != NULL)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5159 /* scsi callback required */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5160 (*scsipkt->pkt_comp)(scsipkt);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5161 return (TRAN_ACCEPT);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5162 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5163
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5164
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5165 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5166 * Analyze device status and error registers and translate them into
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5167 * appropriate scsi sense codes.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5168 * NOTE: non-packet commands only for now
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5169 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5170 static void
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5171 sata_decode_device_error(sata_pkt_txlate_t *spx,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5172 struct scsi_extended_sense *sense)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5173 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5174 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
5175
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5176 ASSERT(sense != NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5177 ASSERT(spx->txlt_sata_pkt->satapkt_cmd.satacmd_status_reg &
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5178 SATA_STATUS_ERR);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5179
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5180
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5181 if (err_reg & SATA_ERROR_ICRC) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5182 sense->es_key = KEY_ABORTED_COMMAND;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5183 sense->es_add_code = 0x08; /* Communication failure */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5184 return;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5185 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5186
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5187 if (err_reg & SATA_ERROR_UNC) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5188 sense->es_key = KEY_MEDIUM_ERROR;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5189 /* Information bytes (LBA) need to be set by a caller */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5190 return;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5191 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5192
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5193 /* ADD HERE: MC error bit handling for ATAPI CD/DVD */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5194 if (err_reg & (SATA_ERROR_MCR | SATA_ERROR_NM)) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5195 sense->es_key = KEY_UNIT_ATTENTION;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5196 sense->es_add_code = 0x3a; /* No media present */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5197 return;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5198 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5199
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5200 if (err_reg & SATA_ERROR_IDNF) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5201 if (err_reg & SATA_ERROR_ABORT) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5202 sense->es_key = KEY_ABORTED_COMMAND;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5203 } else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5204 sense->es_key = KEY_ILLEGAL_REQUEST;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5205 sense->es_add_code = 0x21; /* LBA out of range */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5206 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5207 return;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5208 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5209
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5210 if (err_reg & SATA_ERROR_ABORT) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5211 ASSERT(spx->txlt_sata_pkt != NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5212 sense->es_key = KEY_ABORTED_COMMAND;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5213 return;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5214 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5215 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5216
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5217 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5218 * Extract error LBA from sata_pkt.satapkt_cmd register fields
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5219 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5220 static void
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5221 sata_extract_error_lba(sata_pkt_txlate_t *spx, uint64_t *lba)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5222 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5223 sata_cmd_t *sata_cmd = &spx->txlt_sata_pkt->satapkt_cmd;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5224
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5225 *lba = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5226 if (sata_cmd->satacmd_addr_type == ATA_ADDR_LBA48) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5227 *lba = sata_cmd->satacmd_lba_high_msb;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5228 *lba = (*lba << 8) | sata_cmd->satacmd_lba_mid_msb;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5229 *lba = (*lba << 8) | sata_cmd->satacmd_lba_low_msb;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5230 } else if (sata_cmd->satacmd_addr_type == ATA_ADDR_LBA28) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5231 *lba = sata_cmd->satacmd_device_reg & 0xf;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5232 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5233 *lba = (*lba << 8) | sata_cmd->satacmd_lba_high_lsb;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5234 *lba = (*lba << 8) | sata_cmd->satacmd_lba_mid_lsb;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5235 *lba = (*lba << 8) | sata_cmd->satacmd_lba_high_lsb;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5236 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5237
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5238 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5239 * This is fixed sense format - if LBA exceeds the info field size,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5240 * no valid info will be returned (valid bit in extended sense will
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5241 * be set to 0).
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5242 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5243 static struct scsi_extended_sense *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5244 sata_arq_sense(sata_pkt_txlate_t *spx)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5245 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5246 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5247 struct scsi_arq_status *arqs;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5248 struct scsi_extended_sense *sense;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5249
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5250 /* Fill ARQ sense data */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5251 scsipkt->pkt_state |= STATE_ARQ_DONE;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5252 arqs = (struct scsi_arq_status *)scsipkt->pkt_scbp;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5253 *(uchar_t *)&arqs->sts_status = STATUS_CHECK;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5254 *(uchar_t *)&arqs->sts_rqpkt_status = STATUS_GOOD;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5255 arqs->sts_rqpkt_reason = CMD_CMPLT;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5256 arqs->sts_rqpkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5257 STATE_XFERRED_DATA | STATE_SENT_CMD | STATE_GOT_STATUS;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5258 arqs->sts_rqpkt_resid = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5259 sense = &arqs->sts_sensedata;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5260 bzero(sense, sizeof (struct scsi_extended_sense));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5261 sense->es_valid = 1; /* Valid sense */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5262 sense->es_class = 7; /* Response code 0x70 - current err */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5263 sense->es_key = KEY_NO_SENSE;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5264 sense->es_info_1 = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5265 sense->es_info_2 = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5266 sense->es_info_3 = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5267 sense->es_info_4 = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5268 sense->es_add_len = 6; /* Additional length */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5269 sense->es_cmd_info[0] = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5270 sense->es_cmd_info[1] = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5271 sense->es_cmd_info[2] = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5272 sense->es_cmd_info[3] = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5273 sense->es_add_code = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5274 sense->es_qual_code = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5275 return (sense);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5276 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5277
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5278
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5279 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5280 * Translate completion status of SATA read/write commands into scsi response.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5281 * pkt completion_reason is checked to determine the completion status.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5282 * Do scsi callback if necessary.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5283 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5284 * Note: this function may be called also for synchronously executed
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5285 * commands.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5286 * This function may be used only if scsi_pkt is non-NULL.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5287 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5288 static void
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5289 sata_txlt_rw_completion(sata_pkt_t *sata_pkt)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5290 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5291 sata_pkt_txlate_t *spx =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5292 (sata_pkt_txlate_t *)sata_pkt->satapkt_framework_private;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5293 sata_cmd_t *scmd = &sata_pkt->satapkt_cmd;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5294 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5295 struct scsi_extended_sense *sense;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5296 uint64_t lba;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5297
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5298 if (sata_pkt->satapkt_reason == SATA_PKT_COMPLETED) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5299 /* Normal completion */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5300 scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5301 STATE_SENT_CMD | STATE_XFERRED_DATA | STATE_GOT_STATUS;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5302 scsipkt->pkt_reason = CMD_CMPLT;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5303 *scsipkt->pkt_scbp = STATUS_GOOD;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5304 } else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5305 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5306 * Something went wrong - analyze return
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5307 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5308 scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5309 STATE_SENT_CMD | STATE_GOT_STATUS;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5310 scsipkt->pkt_reason = CMD_INCOMPLETE;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5311 *scsipkt->pkt_scbp = STATUS_CHECK;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5312 sense = sata_arq_sense(spx);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5313 ASSERT(sense != NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5314
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5315 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5316 * SATA_PKT_DEV_ERROR is the only case where we may be able to
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5317 * extract form device registers the failing LBA.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5318 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5319 if (sata_pkt->satapkt_reason == SATA_PKT_DEV_ERROR) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5320 if ((scmd->satacmd_addr_type == ATA_ADDR_LBA48) &&
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5321 (scmd->satacmd_lba_mid_msb != 0 ||
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5322 scmd->satacmd_lba_high_msb != 0)) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5323 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5324 * We have problem reporting this cmd LBA
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5325 * in fixed sense data format, because of
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5326 * the size of the scsi LBA fields.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5327 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5328 sense->es_valid = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5329 } else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5330 sata_extract_error_lba(spx, &lba);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5331 sense->es_info_1 = (lba & 0xFF000000) >> 24;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5332 sense->es_info_1 = (lba & 0xFF0000) >> 16;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5333 sense->es_info_1 = (lba & 0xFF00) >> 8;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5334 sense->es_info_1 = lba & 0xFF;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5335 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5336 } else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5337 /* Invalid extended sense info */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5338 sense->es_valid = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5339 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5340
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5341 switch (sata_pkt->satapkt_reason) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5342 case SATA_PKT_PORT_ERROR:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5343 /* We may want to handle DEV GONE state as well */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5344 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5345 * We have no device data. Assume no data transfered.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5346 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5347 sense->es_key = KEY_HARDWARE_ERROR;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5348 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5349
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5350 case SATA_PKT_DEV_ERROR:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5351 if (sata_pkt->satapkt_cmd.satacmd_status_reg &
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5352 SATA_STATUS_ERR) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5353 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5354 * determine dev error reason from error
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5355 * reg content
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5356 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5357 sata_decode_device_error(spx, sense);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5358 if (sense->es_key == KEY_MEDIUM_ERROR) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5359 switch (scmd->satacmd_cmd_reg) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5360 case SATAC_READ_DMA:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5361 case SATAC_READ_DMA_EXT:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5362 case SATAC_READ_DMA_QUEUED:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5363 case SATAC_READ_DMA_QUEUED_EXT:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5364 case SATAC_READ_FPDMA_QUEUED:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5365 /* Unrecovered read error */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5366 sense->es_add_code =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5367 SD_SCSI_UNREC_READ_ERROR;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5368 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5369 case SATAC_WRITE_DMA:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5370 case SATAC_WRITE_DMA_EXT:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5371 case SATAC_WRITE_DMA_QUEUED:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5372 case SATAC_WRITE_DMA_QUEUED_EXT:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5373 case SATAC_WRITE_FPDMA_QUEUED:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5374 /* Write error */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5375 sense->es_add_code =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5376 SD_SCSI_WRITE_ERROR;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5377 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5378 default:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5379 /* Internal error */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5380 SATA_LOG_D((
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5381 spx->txlt_sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5382 CE_WARN,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5383 "sata_txlt_rw_completion :"
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5384 "internal error - invalid "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5385 "command 0x%2x",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5386 scmd->satacmd_cmd_reg));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5387 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5388 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5389 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5390 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5391 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5392 /* No extended sense key - no info available */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5393 scsipkt->pkt_reason = CMD_INCOMPLETE;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5394 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5395
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5396 case SATA_PKT_TIMEOUT:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5397 /* scsipkt->pkt_reason = CMD_TIMEOUT; */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5398 scsipkt->pkt_reason = CMD_INCOMPLETE;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5399 /* No extended sense key ? */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5400 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5401
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5402 case SATA_PKT_ABORTED:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5403 scsipkt->pkt_reason = CMD_ABORTED;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5404 /* No extended sense key ? */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5405 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5406
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5407 case SATA_PKT_RESET:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5408 scsipkt->pkt_reason = CMD_RESET;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5409 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5410
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5411 default:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5412 SATA_LOG_D((spx->txlt_sata_hba_inst, CE_WARN,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5413 "sata_txlt_rw_completion: "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5414 "invalid packet completion reason"));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5415 scsipkt->pkt_reason = CMD_TRAN_ERR;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5416 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5417 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5418 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5419 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5420 "Scsi_pkt completion reason %x\n", scsipkt->pkt_reason);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5421
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5422 if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0 &&
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5423 scsipkt->pkt_comp != NULL)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5424 /* scsi callback required */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5425 (*scsipkt->pkt_comp)(scsipkt);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5426
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5427 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5428
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5429 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5430 * NON FUNCTIONAL IMPLEMENTATION. THIS IS A PLACE HOLDER.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5431 * ATAPI devices are not supported currently (are not be attached recognized
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5432 * as valid devices).
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5433 * Will be fixed in phase 2 of the development.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5434 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5435 static void
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5436 sata_txlt_atapi_completion(sata_pkt_t *sata_pkt)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5437 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5438 sata_pkt_txlate_t *spx =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5439 (sata_pkt_txlate_t *)sata_pkt->satapkt_framework_private;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5440 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5441 struct scsi_arq_status *arqs;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5442
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5443 if (sata_pkt->satapkt_reason == SATA_PKT_COMPLETED) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5444 /* Normal completion */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5445 scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5446 STATE_SENT_CMD | STATE_XFERRED_DATA | STATE_GOT_STATUS;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5447 scsipkt->pkt_reason = CMD_CMPLT;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5448 *scsipkt->pkt_scbp = STATUS_GOOD;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5449 scsipkt->pkt_resid = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5450 } else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5451 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5452 * Something went wrong - analyze return
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5453 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5454 scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5455 STATE_SENT_CMD | STATE_GOT_STATUS | STATE_ARQ_DONE;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5456 scsipkt->pkt_reason = CMD_CMPLT;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5457
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5458 arqs = (struct scsi_arq_status *)scsipkt->pkt_scbp;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5459 *(uchar_t *)&arqs->sts_status = STATUS_CHECK;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5460 *(uchar_t *)&arqs->sts_rqpkt_status = STATUS_GOOD;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5461 arqs->sts_rqpkt_reason = CMD_CMPLT;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5462 arqs->sts_rqpkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5463 STATE_XFERRED_DATA | STATE_SENT_CMD | STATE_GOT_STATUS;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5464 arqs->sts_rqpkt_resid = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5465
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5466 bcopy(sata_pkt->satapkt_cmd.satacmd_rqsense,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5467 &arqs->sts_sensedata, SATA_ATAPI_RQSENSE_LEN);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5468 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5469 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5470 "Scsi_pkt completion reason %x\n", scsipkt->pkt_reason);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5471
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5472 if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0 &&
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5473 scsipkt->pkt_comp != NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5474 /* scsi callback required */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5475 (*scsipkt->pkt_comp)(scsipkt);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5476 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5477 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5478
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5479
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5480 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5481 * Translate completion status of non-data commands (i.e. commands returning
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5482 * no data).
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5483 * pkt completion_reason is checked to determine the completion status.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5484 * Do scsi callback if necessary (FLAG_NOINTR == 0)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5485 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5486 * Note: this function may be called also for synchronously executed
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5487 * commands.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5488 * This function may be used only if scsi_pkt is non-NULL.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5489 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5490
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5491 static void
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5492 sata_txlt_nodata_cmd_completion(sata_pkt_t *sata_pkt)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5493 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5494 sata_pkt_txlate_t *spx =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5495 (sata_pkt_txlate_t *)sata_pkt->satapkt_framework_private;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5496 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5497 struct scsi_extended_sense *sense;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5498
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5499 scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5500 STATE_SENT_CMD | STATE_GOT_STATUS;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5501 if (sata_pkt->satapkt_reason == SATA_PKT_COMPLETED) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5502 /* Normal completion */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5503 scsipkt->pkt_reason = CMD_CMPLT;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5504 *scsipkt->pkt_scbp = STATUS_GOOD;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5505 } else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5506 /* Something went wrong */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5507 scsipkt->pkt_reason = CMD_INCOMPLETE;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5508 *scsipkt->pkt_scbp = STATUS_CHECK;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5509 sense = sata_arq_sense(spx);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5510 switch (sata_pkt->satapkt_reason) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5511 case SATA_PKT_PORT_ERROR:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5512 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5513 * We have no device data. Assume no data transfered.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5514 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5515 sense->es_key = KEY_HARDWARE_ERROR;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5516 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5517
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5518 case SATA_PKT_DEV_ERROR:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5519 if (sata_pkt->satapkt_cmd.satacmd_status_reg &
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5520 SATA_STATUS_ERR) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5521 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5522 * determine dev error reason from error
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5523 * reg content
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 sata_decode_device_error(spx, sense);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5526 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5527 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5528 /* No extended sense key - no info available */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5529 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5530
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5531 case SATA_PKT_TIMEOUT:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5532 /* scsipkt->pkt_reason = CMD_TIMEOUT; */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5533 scsipkt->pkt_reason = CMD_INCOMPLETE;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5534 /* No extended sense key ? */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5535 break;
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 case SATA_PKT_ABORTED:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5538 scsipkt->pkt_reason = CMD_ABORTED;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5539 /* No extended sense key ? */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5540 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5541
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5542 case SATA_PKT_RESET:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5543 /* pkt aborted by an explicit reset from a host */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5544 scsipkt->pkt_reason = CMD_RESET;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5545 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5546
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5547 default:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5548 SATA_LOG_D((spx->txlt_sata_hba_inst, CE_WARN,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5549 "sata_txlt_nodata_cmd_completion: "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5550 "invalid packet completion reason %d",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5551 sata_pkt->satapkt_reason));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5552 scsipkt->pkt_reason = CMD_TRAN_ERR;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5553 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5554 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5555
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5556 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5557 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5558 "Scsi_pkt completion reason %x\n", scsipkt->pkt_reason);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5559
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5560 if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0 &&
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5561 scsipkt->pkt_comp != NULL)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5562 /* scsi callback required */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5563 (*scsipkt->pkt_comp)(scsipkt);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5564 }
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
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5567 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5568 * Build Mode sense R/W recovery page
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5569 * NOT IMPLEMENTED
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5570 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5571
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5572 static int
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5573 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
5574 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5575 #ifndef __lock_lint
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5576 _NOTE(ARGUNUSED(sdinfo))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5577 _NOTE(ARGUNUSED(pcntrl))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5578 _NOTE(ARGUNUSED(buf))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5579 #endif
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5580 return (0);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5581 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5582
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5583 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5584 * Build Mode sense caching page - scsi-3 implementation.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5585 * Page length distinguishes previous format from scsi-3 format.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5586 * buf must have space for 0x12 bytes.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5587 * Only DRA (disable read ahead ) and WCE (write cache enable) are changeable.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5588 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5589 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5590 static int
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5591 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
5592 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5593 struct mode_cache_scsi3 *page = (struct mode_cache_scsi3 *)buf;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5594 sata_id_t *sata_id = &sdinfo->satadrv_id;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5595
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5596 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5597 * 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
5598 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5599 bzero(buf, PAGELENGTH_DAD_MODE_CACHE_SCSI3);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5600
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5601 if (pcntrl == 0 || pcntrl == 2) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5602 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5603 * For now treat current and default parameters as same
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5604 * That may have to change, if target driver will complain
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5605 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5606 page->mode_page.code = MODEPAGE_CACHING; /* PS = 0 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5607 page->mode_page.length = PAGELENGTH_DAD_MODE_CACHE_SCSI3;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5608
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5609 if ((sata_id->ai_cmdset82 & SATA_LOOK_AHEAD) &&
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5610 !(sata_id->ai_features85 & SATA_LOOK_AHEAD)) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5611 page->dra = 1; /* Read Ahead disabled */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5612 page->rcd = 1; /* Read Cache disabled */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5613 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5614 if ((sata_id->ai_cmdset82 & SATA_WRITE_CACHE) &&
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5615 (sata_id->ai_features85 & SATA_WRITE_CACHE))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5616 page->wce = 1; /* Write Cache enabled */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5617 } else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5618 /* Changeable parameters */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5619 page->mode_page.code = MODEPAGE_CACHING;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5620 page->mode_page.length = PAGELENGTH_DAD_MODE_CACHE_SCSI3;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5621 if (sata_id->ai_cmdset82 & SATA_LOOK_AHEAD) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5622 page->dra = 1;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5623 page->rcd = 1;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5624 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5625 if (sata_id->ai_cmdset82 & SATA_WRITE_CACHE)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5626 page->wce = 1;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5627 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5628 return (PAGELENGTH_DAD_MODE_CACHE_SCSI3 +
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5629 sizeof (struct mode_page));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5630 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5631
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5632 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5633 * Build Mode sense exception cntrl page
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5634 * NOT IMPLEMENTED
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5635 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5636 static int
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5637 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
5638 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5639 #ifndef __lock_lint
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5640 _NOTE(ARGUNUSED(sdinfo))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5641 _NOTE(ARGUNUSED(pcntrl))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5642 _NOTE(ARGUNUSED(buf))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5643 #endif
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5644 return (0);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5645 }
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
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5648 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5649 * Build Mode sense power condition page
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5650 * NOT IMPLEMENTED.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5651 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5652 static int
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5653 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
5654 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5655 #ifndef __lock_lint
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5656 _NOTE(ARGUNUSED(sdinfo))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5657 _NOTE(ARGUNUSED(pcntrl))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5658 _NOTE(ARGUNUSED(buf))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5659 #endif
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5660 return (0);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5661 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5662
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5663
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5664 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5665 * Process mode select caching page 8 (scsi3 format only).
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5666 * 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
5667 * if these features are supported by the device. If these features are not
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5668 * supported, quietly ignore them.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5669 * This function fails only if the SET FEATURE command sent to
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5670 * the device fails. The page format is not varified, assuming that the
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5671 * target driver operates correctly - if parameters length is too short,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5672 * we just drop the page.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5673 * 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
5674 * setting have to be changed.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5675 * SET FEATURE command is executed synchronously, i.e. we wait here until
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5676 * it is completed, regardless of the scsi pkt directives.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5677 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5678 * 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
5679 * changing DRA will change RCD.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5680 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5681 * More than one SATA command may be executed to perform operations specified
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5682 * by mode select pages. The first error terminates further execution.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5683 * Operations performed successully are not backed-up in such case.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5684 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5685 * Return SATA_SUCCESS if operation succeeded, SATA_FAILURE otherwise.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5686 * 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
5687 * 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
5688 * Upon return, if operation required sending command to the device, the rval
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5689 * 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
5690 * did not require device access, rval should be set to TRAN_ACCEPT.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5691 * The pagelen should be set to the length of the page.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5692 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5693 * This function has to be called with a port mutex held.
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 * Returns SATA_SUCCESS if operation was successful, SATA_FAILURE otherwise.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5696 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5697 int
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5698 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
5699 int parmlen, int *pagelen, int *rval, int *dmod)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5700 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5701 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5702 sata_drive_info_t *sdinfo;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5703 sata_cmd_t *scmd = &spx->txlt_sata_pkt->satapkt_cmd;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5704 sata_id_t *sata_id;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5705 struct scsi_extended_sense *sense;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5706 int wce, dra; /* Current settings */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5707
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5708 sdinfo = sata_get_device_info(spx->txlt_sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5709 &spx->txlt_sata_pkt->satapkt_device);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5710 sata_id = &sdinfo->satadrv_id;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5711 *dmod = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5712
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5713 /* Verify parameters length. If too short, drop it */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5714 if (PAGELENGTH_DAD_MODE_CACHE_SCSI3 +
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5715 sizeof (struct mode_page) < parmlen) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5716 *scsipkt->pkt_scbp = STATUS_CHECK;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5717 sense = sata_arq_sense(spx);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5718 sense->es_key = KEY_ILLEGAL_REQUEST;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5719 sense->es_add_code = SD_SCSI_INVALID_FIELD_IN_PARAMETER_LIST;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5720 *pagelen = parmlen;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5721 *rval = TRAN_ACCEPT;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5722 return (SATA_FAILURE);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5723 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5724
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5725 *pagelen = PAGELENGTH_DAD_MODE_CACHE_SCSI3 + sizeof (struct mode_page);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5726
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5727 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5728 * We can manipulate only write cache and read ahead
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5729 * (read cache) setting.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5730 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5731 if (!(sata_id->ai_cmdset82 & SATA_LOOK_AHEAD) &&
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5732 !(sata_id->ai_cmdset82 & SATA_WRITE_CACHE)) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5733 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5734 * None of the features is supported - ignore
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5735 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5736 *rval = TRAN_ACCEPT;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5737 return (SATA_SUCCESS);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5738 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5739
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5740 /* Current setting of Read Ahead (and Read Cache) */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5741 if (sata_id->ai_features85 & SATA_LOOK_AHEAD)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5742 dra = 0; /* 0 == not disabled */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5743 else
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5744 dra = 1;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5745 /* Current setting of Write Cache */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5746 if (sata_id->ai_features85 & SATA_WRITE_CACHE)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5747 wce = 1;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5748 else
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5749 wce = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5750
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5751 if (page->dra == dra && page->wce == wce && page->rcd == dra) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5752 /* nothing to do */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5753 *rval = TRAN_ACCEPT;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5754 return (SATA_SUCCESS);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5755 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5756 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5757 * Need to flip some setting
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5758 * Set-up Internal SET FEATURES command(s)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5759 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5760 scmd->satacmd_flags &= ~SATA_XFER_DIR_MASK;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5761 scmd->satacmd_flags |= SATA_DIR_NODATA_XFER;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5762 scmd->satacmd_addr_type = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5763 scmd->satacmd_device_reg = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5764 scmd->satacmd_status_reg = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5765 scmd->satacmd_error_reg = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5766 scmd->satacmd_cmd_reg = SATAC_SET_FEATURES;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5767 if (page->dra != dra || page->rcd != dra) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5768 /* Need to flip read ahead setting */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5769 if (dra == 0)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5770 /* Disable read ahead / read cache */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5771 scmd->satacmd_features_reg =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5772 SATAC_SF_DISABLE_READ_AHEAD;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5773 else
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5774 /* Enable read ahead / read cache */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5775 scmd->satacmd_features_reg =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5776 SATAC_SF_ENABLE_READ_AHEAD;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5777
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5778 /* Transfer command to HBA */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5779 if (sata_hba_start(spx, rval) != 0)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5780 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5781 * Pkt not accepted for execution.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5782 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5783 return (SATA_FAILURE);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5784
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5785 *dmod = 1;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5786
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5787 /* Now process return */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5788 if (spx->txlt_sata_pkt->satapkt_reason !=
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5789 SATA_PKT_COMPLETED) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5790 goto failure; /* Terminate */
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 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5793
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5794 /* 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
5795 if (page->wce != wce) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5796 /* Need to flip Write Cache setting */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5797 if (page->wce == 1)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5798 /* Enable write cache */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5799 scmd->satacmd_features_reg =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5800 SATAC_SF_ENABLE_WRITE_CACHE;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5801 else
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5802 /* Disable write cache */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5803 scmd->satacmd_features_reg =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5804 SATAC_SF_DISABLE_WRITE_CACHE;
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 /* Transfer command to HBA */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5807 if (sata_hba_start(spx, rval) != 0)
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 * Pkt not accepted for execution.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5810 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5811 return (SATA_FAILURE);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5812
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5813 *dmod = 1;
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 /* Now process return */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5816 if (spx->txlt_sata_pkt->satapkt_reason !=
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5817 SATA_PKT_COMPLETED) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5818 goto failure;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5819 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5820 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5821 return (SATA_SUCCESS);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5822
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5823 failure:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5824 scsipkt->pkt_reason = CMD_INCOMPLETE;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5825 *scsipkt->pkt_scbp = STATUS_CHECK;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5826 sense = sata_arq_sense(spx);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5827 switch (spx->txlt_sata_pkt->satapkt_reason) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5828 case SATA_PKT_PORT_ERROR:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5829 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5830 * We have no device data. Assume no data transfered.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5831 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5832 sense->es_key = KEY_HARDWARE_ERROR;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5833 break;
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 case SATA_PKT_DEV_ERROR:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5836 if (spx->txlt_sata_pkt->satapkt_cmd.satacmd_status_reg &
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5837 SATA_STATUS_ERR) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5838 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5839 * determine dev error reason from error
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5840 * reg content
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5841 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5842 sata_decode_device_error(spx, sense);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5843 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5844 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5845 /* No extended sense key - no info available */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5846 break;
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 case SATA_PKT_TIMEOUT:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5849 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5850 * scsipkt->pkt_reason = CMD_TIMEOUT; This causes problems.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5851 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5852 scsipkt->pkt_reason = CMD_INCOMPLETE;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5853 /* No extended sense key */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5854 break;
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 case SATA_PKT_ABORTED:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5857 scsipkt->pkt_reason = CMD_ABORTED;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5858 /* No extended sense key */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5859 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5860
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5861 case SATA_PKT_RESET:
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 * pkt aborted either by an explicit reset request from
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5864 * a host, or due to error recovery
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5865 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5866 scsipkt->pkt_reason = CMD_RESET;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5867 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5868
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5869 default:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5870 scsipkt->pkt_reason = CMD_TRAN_ERR;
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 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5873 return (SATA_FAILURE);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5874 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5875
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5876
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5877
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5878
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5879
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5880 /* ************************** LOCAL FUNCTIONS ************************** */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5881
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5882 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5883 * Validate sata_tran info
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5884 * SATA_FAILURE returns if structure is inconsistent or structure revision
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5885 * does not match one used by the framework.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5886 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5887 * Returns SATA_SUCCESS if sata_hba_tran has matching revision and contains
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5888 * required function pointers.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5889 * Returns SATA_FAILURE otherwise.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5890 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5891 static int
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5892 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
5893 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5894 if (sata_tran->sata_tran_hba_rev != SATA_TRAN_HBA_REV) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5895 sata_log(NULL, CE_WARN,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5896 "sata: invalid sata_hba_tran version %d for driver %s",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5897 sata_tran->sata_tran_hba_rev, ddi_driver_name(dip));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5898 return (SATA_FAILURE);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5899 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5900
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5901 if (dip != sata_tran->sata_tran_hba_dip) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5902 SATA_LOG_D((NULL, CE_WARN,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5903 "sata: inconsistent sata_tran_hba_dip "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5904 "%p / %p", sata_tran->sata_tran_hba_dip, dip));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5905 return (SATA_FAILURE);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5906 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5907
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5908 if (sata_tran->sata_tran_probe_port == NULL ||
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5909 sata_tran->sata_tran_start == NULL ||
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5910 sata_tran->sata_tran_abort == NULL ||
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5911 sata_tran->sata_tran_reset_dport == NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5912 SATA_LOG_D((NULL, CE_WARN, "sata: sata_hba_tran missing "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5913 "required functions"));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5914 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5915 return (SATA_SUCCESS);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5916 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5917
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5918 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5919 * Remove HBA instance from sata_hba_list.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5920 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5921 static void
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5922 sata_remove_hba_instance(dev_info_t *dip)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5923 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5924 sata_hba_inst_t *sata_hba_inst;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5925
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5926 mutex_enter(&sata_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5927 for (sata_hba_inst = sata_hba_list;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5928 sata_hba_inst != (struct sata_hba_inst *)NULL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5929 sata_hba_inst = sata_hba_inst->satahba_next) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5930 if (sata_hba_inst->satahba_dip == dip)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5931 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5932 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5933
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5934 if (sata_hba_inst == (struct sata_hba_inst *)NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5935 #ifdef SATA_DEBUG
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5936 cmn_err(CE_WARN, "sata_remove_hba_instance: "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5937 "unknown HBA instance\n");
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5938 #endif
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5939 ASSERT(FALSE);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5940 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5941 if (sata_hba_inst == sata_hba_list) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5942 sata_hba_list = sata_hba_inst->satahba_next;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5943 if (sata_hba_list) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5944 sata_hba_list->satahba_prev =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5945 (struct sata_hba_inst *)NULL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5946 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5947 if (sata_hba_inst == sata_hba_list_tail) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5948 sata_hba_list_tail = NULL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5949 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5950 } else if (sata_hba_inst == sata_hba_list_tail) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5951 sata_hba_list_tail = sata_hba_inst->satahba_prev;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5952 if (sata_hba_list_tail) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5953 sata_hba_list_tail->satahba_next =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5954 (struct sata_hba_inst *)NULL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5955 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5956 } else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5957 sata_hba_inst->satahba_prev->satahba_next =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5958 sata_hba_inst->satahba_next;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5959 sata_hba_inst->satahba_next->satahba_prev =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5960 sata_hba_inst->satahba_prev;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5961 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5962 mutex_exit(&sata_mutex);
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
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5965
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
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5968
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5969 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5970 * Probe all SATA ports of the specified HBA instance.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5971 * 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
5972 * be protected by controller mutex, because the hba_attached flag is not set
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5973 * yet and no one would be touching this HBA instance other then this thread.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5974 * 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
5975 * (if any). Allocates necessary structures for each port.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5976 * Creates attachment point minor node for each non-failed port.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5977 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5978
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5979 static void
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5980 sata_probe_ports(sata_hba_inst_t *sata_hba_inst)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5981 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5982 dev_info_t *dip = SATA_DIP(sata_hba_inst);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5983 int ncport, npmport;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5984 sata_cport_info_t *cportinfo;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5985 sata_drive_info_t *drive;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5986 sata_pmult_info_t *pminfo;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5987 sata_pmport_info_t *pmportinfo;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5988 sata_device_t sata_device;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5989 int rval;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5990 dev_t minor_number;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5991 char name[16];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5992
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5993 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5994 * Probe controller ports first, to find port status and
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5995 * any port multiplier attached.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5996 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5997 for (ncport = 0; ncport < SATA_NUM_CPORTS(sata_hba_inst); ncport++) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5998 /* allocate cport structure */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5999 cportinfo = kmem_zalloc(sizeof (sata_cport_info_t), KM_SLEEP);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6000 ASSERT(cportinfo != NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6001 mutex_init(&cportinfo->cport_mutex, NULL, MUTEX_DRIVER, NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6002
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6003 mutex_enter(&cportinfo->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6004
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6005 cportinfo->cport_addr.cport = ncport;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6006 cportinfo->cport_addr.pmport = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6007 cportinfo->cport_addr.qual = SATA_ADDR_CPORT;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6008 cportinfo->cport_state &= ~SATA_PORT_STATE_CLEAR_MASK;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6009 cportinfo->cport_state |= SATA_STATE_PROBING;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6010 SATA_CPORT_INFO(sata_hba_inst, ncport) = cportinfo;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6011
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6012 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6013 * Regardless if a port is usable or not, create
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6014 * an attachment point
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6015 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6016 mutex_exit(&cportinfo->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6017 minor_number =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6018 SATA_MAKE_AP_MINOR(ddi_get_instance(dip), ncport, 0, 0);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6019 (void) sprintf(name, "%d", ncport);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6020 if (ddi_create_minor_node(dip, name, S_IFCHR,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6021 minor_number, DDI_NT_SATA_ATTACHMENT_POINT, 0) !=
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6022 DDI_SUCCESS) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6023 sata_log(sata_hba_inst, CE_WARN, "sata_hba_attach: "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6024 "cannot create sata attachment point for port %d",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6025 ncport);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6026 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6027
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6028 /* Probe port */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6029 sata_device.satadev_addr.cport = ncport;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6030 sata_device.satadev_addr.pmport = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6031 sata_device.satadev_addr.qual = SATA_ADDR_CPORT;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6032 sata_device.satadev_rev = SATA_DEVICE_REV;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6033
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6034 rval = (*SATA_PROBE_PORT_FUNC(sata_hba_inst))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6035 (dip, &sata_device);
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 mutex_enter(&cportinfo->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6038 sata_update_port_scr(&cportinfo->cport_scr, &sata_device);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6039 if (rval != SATA_SUCCESS) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6040 /* Something went wrong? Fail the port */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6041 cportinfo->cport_state = SATA_PSTATE_FAILED;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6042 mutex_exit(&cportinfo->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6043 continue;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6044 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6045 cportinfo->cport_state &= ~SATA_STATE_PROBING;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6046 cportinfo->cport_state |= SATA_STATE_PROBED;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6047 cportinfo->cport_dev_type = sata_device.satadev_type;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6048
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6049 cportinfo->cport_state |= SATA_STATE_READY;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6050 if (cportinfo->cport_dev_type == SATA_DTYPE_NONE) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6051 mutex_exit(&cportinfo->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6052 continue;
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 if (cportinfo->cport_dev_type != SATA_DTYPE_PMULT) {
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 * There is some device attached.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6057 * Allocate device info structure
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6058 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6059 mutex_exit(&cportinfo->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6060 drive = kmem_zalloc(sizeof (sata_drive_info_t),
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6061 KM_SLEEP);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6062 mutex_enter(&cportinfo->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6063 SATA_CPORTINFO_DRV_INFO(cportinfo) = drive;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6064 drive->satadrv_addr = cportinfo->cport_addr;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6065 drive->satadrv_addr.qual = SATA_ADDR_DCPORT;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6066 drive->satadrv_type = cportinfo->cport_dev_type;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6067 drive->satadrv_state = SATA_STATE_UNKNOWN;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6068 } else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6069 ASSERT(cportinfo->cport_dev_type == SATA_DTYPE_PMULT);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6070 mutex_exit(&cportinfo->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6071 pminfo = kmem_zalloc(sizeof (sata_pmult_info_t),
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6072 KM_SLEEP);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6073 mutex_enter(&cportinfo->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6074 ASSERT(pminfo != NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6075 SATA_CPORTINFO_PMULT_INFO(cportinfo) = pminfo;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6076 pminfo->pmult_addr.cport = cportinfo->cport_addr.cport;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6077 pminfo->pmult_addr.pmport = SATA_PMULT_HOSTPORT;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6078 pminfo->pmult_addr.qual = SATA_ADDR_PMPORT;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6079 pminfo->pmult_num_dev_ports =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6080 sata_device.satadev_add_info;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6081 mutex_init(&pminfo->pmult_mutex, NULL, MUTEX_DRIVER,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6082 NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6083 pminfo->pmult_state = SATA_STATE_PROBING;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6084
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6085 /* Probe Port Multiplier ports */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6086 for (npmport = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6087 npmport < pminfo->pmult_num_dev_ports;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6088 npmport++) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6089 mutex_exit(&cportinfo->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6090 pmportinfo = kmem_zalloc(
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6091 sizeof (sata_pmport_info_t), KM_SLEEP);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6092 mutex_enter(&cportinfo->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6093 ASSERT(pmportinfo != NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6094 pmportinfo->pmport_addr.cport = ncport;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6095 pmportinfo->pmport_addr.pmport = npmport;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6096 pmportinfo->pmport_addr.qual =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6097 SATA_ADDR_PMPORT;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6098 pminfo->pmult_dev_port[npmport] = pmportinfo;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6099 mutex_init(&pmportinfo->pmport_mutex, NULL,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6100 MUTEX_DRIVER, NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6101
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6102 sata_device.satadev_addr.pmport = npmport;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6103 sata_device.satadev_addr.qual =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6104 SATA_ADDR_PMPORT;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6105
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6106 mutex_exit(&cportinfo->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6107 /* Create an attachment point */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6108 minor_number = SATA_MAKE_AP_MINOR(
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6109 ddi_get_instance(dip), ncport, npmport, 1);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6110 (void) sprintf(name, "%d.%d", ncport, npmport);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6111 if (ddi_create_minor_node(dip, name, S_IFCHR,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6112 minor_number, DDI_NT_SATA_ATTACHMENT_POINT,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6113 0) != DDI_SUCCESS) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6114 sata_log(sata_hba_inst, CE_WARN,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6115 "sata_hba_attach: "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6116 "cannot create sata attachment "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6117 "point for port %d pmult port %d",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6118 ncport, npmport);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6119 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6120 rval = (*SATA_PROBE_PORT_FUNC(sata_hba_inst))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6121 (dip, &sata_device);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6122 mutex_enter(&cportinfo->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6123
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6124 /* sata_update_port_info() */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6125 sata_update_port_scr(&pmportinfo->pmport_scr,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6126 &sata_device);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6127
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6128 if (rval != SATA_SUCCESS) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6129 pmportinfo->pmport_state =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6130 SATA_PSTATE_FAILED;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6131 continue;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6132 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6133 pmportinfo->pmport_state &=
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6134 ~SATA_STATE_PROBING;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6135 pmportinfo->pmport_state |= SATA_STATE_PROBED;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6136 pmportinfo->pmport_dev_type =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6137 sata_device.satadev_type;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6138
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6139 pmportinfo->pmport_state |= SATA_STATE_READY;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6140 if (pmportinfo->pmport_dev_type ==
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6141 SATA_DTYPE_NONE)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6142 continue;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6143
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6144 /* Port multipliers cannot be chained */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6145 ASSERT(pmportinfo->pmport_dev_type !=
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6146 SATA_DTYPE_PMULT);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6147 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6148 * There is something attached to Port
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6149 * Multiplier device port
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6150 * Allocate device info structure
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6151 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6152 mutex_exit(&cportinfo->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6153 drive = kmem_zalloc(
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6154 sizeof (sata_drive_info_t), KM_SLEEP);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6155 rval = (*SATA_PROBE_PORT_FUNC(sata_hba_inst))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6156 (dip, &sata_device);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6157 mutex_enter(&cportinfo->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6158
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6159 /* sata_update_port_info() */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6160 sata_update_port_scr(&pmportinfo->pmport_scr,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6161 &sata_device);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6162
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6163 pmportinfo->pmport_sata_drive = drive;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6164 drive->satadrv_addr.cport =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6165 pmportinfo->pmport_addr.cport;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6166 drive->satadrv_addr.pmport = npmport;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6167 drive->satadrv_addr.qual = SATA_ADDR_DPMPORT;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6168 drive->satadrv_type = pmportinfo->
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6169 pmport_dev_type;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6170 drive->satadrv_state = SATA_STATE_UNKNOWN;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6171 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6172 pmportinfo->pmport_state =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6173 SATA_STATE_PROBED | SATA_STATE_READY;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6174 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6175 mutex_exit(&cportinfo->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6176 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6177 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6178
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6179
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6180
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6181 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6182 * Create SATA device nodes for specified HBA instance (SCSI target
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6183 * device nodes).
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6184 * This function is called only from sata_hba_attach(). The hba_attached flag
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6185 * is not set yet, so no ports or device data structures would be touched
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6186 * by anyone other then this thread, therefore per-port mutex protection is
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6187 * not needed.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6188 * The assumption is that there are no target and attachment point minor nodes
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6189 * created by the boot subsystems, so we do not need to prune device tree.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6190 * An AP (Attachement Point) node is created for each SATA device port even
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6191 * when there is no device attached.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6192 * A target node is created when there is a supported type of device attached,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6193 * but may be removed if it cannot be put online.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6194 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6195 * This function cannot be called from an interrupt context.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6196 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6197 * ONLY DISK TARGET NODES ARE CREATED NOW
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6198 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6199 static void
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6200 sata_make_device_nodes(dev_info_t *pdip, sata_hba_inst_t *sata_hba_inst)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6201 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6202 int ncport, npmport;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6203 sata_cport_info_t *cportinfo;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6204 sata_pmult_info_t *pminfo;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6205 sata_pmport_info_t *pmportinfo;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6206 dev_info_t *cdip; /* child dip */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6207 sata_device_t sata_device;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6208 int rval;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6209
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6210 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6211 * Walk through pre-probed sata ports info in sata_scsi
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6212 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6213 for (ncport = 0; ncport < SATA_NUM_CPORTS(sata_hba_inst); ncport++) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6214 cportinfo = SATA_CPORT_INFO(sata_hba_inst, ncport);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6215 mutex_enter(&cportinfo->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6216 if (!(cportinfo->cport_state & SATA_STATE_PROBED)) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6217 mutex_exit(&cportinfo->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6218 continue;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6219 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6220 if (cportinfo->cport_state == SATA_PSTATE_FAILED) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6221 mutex_exit(&cportinfo->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6222 continue;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6223 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6224 if (cportinfo->cport_dev_type == SATA_DTYPE_NONE) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6225 /* No device attached to the controller port */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6226 mutex_exit(&cportinfo->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6227 continue;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6228 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6229 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6230 * Some device is attached to a controller port.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6231 * We rely on controllers distinquishing between no-device,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6232 * attached port multiplier and other kind of attached device.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6233 * We need to get Identify Device data and determine
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6234 * positively the dev type before trying to attach
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6235 * the target driver.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6236 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6237 sata_device.satadev_rev = SATA_DEVICE_REV;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6238 if (cportinfo->cport_dev_type != SATA_DTYPE_PMULT) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6239 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6240 * Not port multiplier.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6241 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6242 sata_device.satadev_addr = cportinfo->cport_addr;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6243 sata_device.satadev_addr.qual = SATA_ADDR_DCPORT;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6244 mutex_exit(&cportinfo->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6245 rval = sata_probe_device(sata_hba_inst, &sata_device);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6246 if (rval != SATA_SUCCESS ||
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6247 sata_device.satadev_type == SATA_DTYPE_UNKNOWN)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6248 continue;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6249
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6250 mutex_enter(&cportinfo->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6251 sata_save_drive_settings(
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6252 SATA_CPORTINFO_DRV_INFO(cportinfo));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6253
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6254 if ((sata_device.satadev_type &
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6255 SATA_VALID_DEV_TYPE) == 0) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6256 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6257 * Could not determine device type or
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6258 * a device is not supported.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6259 * Degrade this device to unknown.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6260 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6261 cportinfo->cport_dev_type = SATA_DTYPE_UNKNOWN;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6262 mutex_exit(&cportinfo->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6263 continue;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6264 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6265 cportinfo->cport_dev_type = sata_device.satadev_type;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6266
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6267 sata_show_drive_info(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6268 SATA_CPORTINFO_DRV_INFO(cportinfo));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6269
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6270 mutex_exit(&cportinfo->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6271 cdip = sata_create_target_node(pdip, sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6272 &sata_device.satadev_addr);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6273 mutex_enter(&cportinfo->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6274 if (cdip == NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6275 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6276 * Attaching target node failed.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6277 * We retain sata_drive_info structure...
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6278 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6279 (SATA_CPORTINFO_DRV_INFO(cportinfo))->
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6280 satadrv_type = SATA_DTYPE_UNKNOWN;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6281 (SATA_CPORTINFO_DRV_INFO(cportinfo))->
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6282 satadrv_state = SATA_STATE_UNKNOWN;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6283 cportinfo->cport_dev_type = SATA_DTYPE_UNKNOWN;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6284 mutex_exit(&cportinfo->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6285 continue;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6286 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6287 (SATA_CPORTINFO_DRV_INFO(cportinfo))->
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6288 satadrv_state = SATA_STATE_READY;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6289 } else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6290 /* This must be Port Multiplier type */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6291 if (cportinfo->cport_dev_type != SATA_DTYPE_PMULT) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6292 SATA_LOG_D((sata_hba_inst, CE_WARN,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6293 "sata_make_device_nodes: "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6294 "unknown dev type %x",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6295 cportinfo->cport_dev_type));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6296 mutex_exit(&cportinfo->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6297 continue;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6298 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6299 pminfo = SATA_CPORTINFO_PMULT_INFO(cportinfo);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6300 for (npmport = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6301 npmport < pminfo->pmult_num_dev_ports;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6302 npmport++) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6303 pmportinfo = pminfo->pmult_dev_port[npmport];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6304 if (pmportinfo->pmport_state &
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6305 SATA_PSTATE_FAILED) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6306 continue;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6307 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6308 if (pmportinfo->pmport_dev_type &
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6309 SATA_DTYPE_NONE)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6310 /* No device attached */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6311 continue;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6312
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6313 sata_device.satadev_addr =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6314 pmportinfo->pmport_addr;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6315 sata_device.satadev_addr.qual =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6316 SATA_ADDR_DPMPORT;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6317 mutex_exit(&cportinfo->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6318 rval = sata_probe_device(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6319 &sata_device);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6320 if (rval != SATA_SUCCESS ||
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6321 sata_device.satadev_type ==
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6322 SATA_DTYPE_UNKNOWN) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6323 mutex_enter(&cportinfo->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6324 continue;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6325 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6326 mutex_enter(&cportinfo->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6327 sata_save_drive_settings(
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6328 pmportinfo->pmport_sata_drive);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6329 if ((sata_device.satadev_type &
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6330 SATA_VALID_DEV_TYPE) == 0) {
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 * Could not determine device type.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6333 * Degrade this device to unknown.
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 pmportinfo->pmport_dev_type =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6336 SATA_DTYPE_UNKNOWN;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6337 continue;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6338 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6339 pmportinfo->pmport_dev_type =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6340 sata_device.satadev_type;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6341
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6342 sata_show_drive_info(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6343 pmportinfo->pmport_sata_drive);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6344
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6345 mutex_exit(&cportinfo->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6346 cdip = sata_create_target_node(pdip,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6347 sata_hba_inst, &sata_device.satadev_addr);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6348 mutex_enter(&cportinfo->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6349 if (cdip == NULL) {
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 * Attaching target node failed.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6352 * We retain sata_drive_info
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6353 * structure...
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6354 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6355 pmportinfo->pmport_sata_drive->
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6356 satadrv_type = SATA_DTYPE_UNKNOWN;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6357 pmportinfo->pmport_sata_drive->
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6358 satadrv_state = SATA_STATE_UNKNOWN;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6359 pmportinfo->pmport_dev_type =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6360 SATA_DTYPE_UNKNOWN;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6361 continue;
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 pmportinfo->pmport_sata_drive->
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6364 satadrv_state |= SATA_STATE_READY;
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 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6367 mutex_exit(&cportinfo->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6368 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6369 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6370
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6371
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6372
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 * Create scsi target node for attached device, create node properties and
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6375 * attach the node.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6376 * The node could be removed if the device onlining fails.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6377 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6378 * 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
6379 * returned otherwise.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6380 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6381
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6382 static dev_info_t *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6383 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
6384 sata_address_t *sata_addr)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6385 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6386 dev_info_t *cdip = NULL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6387 int rval;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6388 char *nname = NULL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6389 char **compatible = NULL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6390 int ncompatible;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6391 struct scsi_inquiry inq;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6392 sata_device_t sata_device;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6393 sata_drive_info_t *sdinfo;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6394 int target;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6395 int i;
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 sata_device.satadev_rev = SATA_DEVICE_REV;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6398 sata_device.satadev_addr = *sata_addr;
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 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst, sata_addr->cport)));
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 sdinfo = sata_get_device_info(sata_hba_inst, &sata_device);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6403
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6404 target = SATA_TO_SCSI_TARGET(sata_addr->cport,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6405 sata_addr->pmport, sata_addr->qual);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6406
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6407 if (sdinfo == NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6408 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6409 sata_addr->cport)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6410 SATA_LOG_D((sata_hba_inst, CE_WARN,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6411 "sata_create_target_node: no sdinfo for target %x",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6412 target));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6413 return (NULL);
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
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 * create scsi inquiry data, expected by
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6418 * scsi_hba_nodename_compatible_get()
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6419 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6420 sata_identdev_to_inquiry(sata_hba_inst, sdinfo, (uint8_t *)&inq);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6421 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, sata_addr->cport)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6422
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6423 /* determine the node name and compatible */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6424 scsi_hba_nodename_compatible_get(&inq, NULL,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6425 inq.inq_dtype, NULL, &nname, &compatible, &ncompatible);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6426
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6427 #ifdef SATA_DEBUG
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6428 if (sata_debug_flags & SATA_DBG_NODES) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6429 if (nname == NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6430 cmn_err(CE_NOTE, "sata_create_target_node: "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6431 "cannot determine nodename for target %d\n",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6432 target);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6433 } else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6434 cmn_err(CE_WARN, "sata_create_target_node: "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6435 "target %d nodename: %s\n", target, nname);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6436 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6437 if (compatible == NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6438 cmn_err(CE_WARN,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6439 "sata_create_target_node: no compatible name\n");
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6440 } else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6441 for (i = 0; i < ncompatible; i++) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6442 cmn_err(CE_WARN, "sata_create_target_node: "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6443 "compatible name: %s\n", compatible[i]);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6444 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6445 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6446 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6447 #endif
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6448
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6449 /* if nodename can't be determined, log error and exit */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6450 if (nname == NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6451 SATA_LOG_D((sata_hba_inst, CE_WARN,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6452 "sata_create_target_node: cannot determine nodename "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6453 "for target %d\n", target));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6454 scsi_hba_nodename_compatible_free(nname, compatible);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6455 return (NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6456 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6457 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6458 * Create scsi target node
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6459 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6460 ndi_devi_alloc_sleep(dip, nname, (pnode_t)DEVI_SID_NODEID, &cdip);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6461 rval = ndi_prop_update_string(DDI_DEV_T_NONE, cdip,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6462 "device-type", "scsi");
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6463
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6464 if (rval != DDI_PROP_SUCCESS) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6465 SATA_LOG_D((sata_hba_inst, CE_WARN, "sata_create_target_node: "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6466 "updating device_type prop failed %d", rval));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6467 goto fail;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6468 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6469
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6470 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6471 * Create target node properties: target & lun
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6472 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6473 rval = ndi_prop_update_int(DDI_DEV_T_NONE, cdip, "target", target);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6474 if (rval != DDI_PROP_SUCCESS) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6475 SATA_LOG_D((sata_hba_inst, CE_WARN, "sata_create_target_node: "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6476 "updating target prop failed %d", rval));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6477 goto fail;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6478 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6479 rval = ndi_prop_update_int(DDI_DEV_T_NONE, cdip, "lun", 0);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6480 if (rval != DDI_PROP_SUCCESS) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6481 SATA_LOG_D((sata_hba_inst, CE_WARN, "sata_create_target_node: "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6482 "updating target prop failed %d", rval));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6483 goto fail;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6484 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6485
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6486 /* decorate the node with compatible */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6487 if (ndi_prop_update_string_array(DDI_DEV_T_NONE, cdip, "compatible",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6488 compatible, ncompatible) != DDI_PROP_SUCCESS) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6489 SATA_LOG_D((sata_hba_inst, CE_WARN,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6490 "sata_create_target_node: FAIL compatible props cdip 0x%p",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6491 (void *)cdip));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6492 goto fail;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6493 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6494
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6495 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6496 * Now, try to attach the driver. If probing of the device fails,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6497 * the target node may be removed
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6498 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6499 rval = ndi_devi_online(cdip, NDI_ONLINE_ATTACH);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6500
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6501 scsi_hba_nodename_compatible_free(nname, compatible);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6502
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6503 if (rval == NDI_SUCCESS)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6504 return (cdip);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6505
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6506 /* target node was removed - are we sure? */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6507 return (NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6508
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6509 fail:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6510 scsi_hba_nodename_compatible_free(nname, compatible);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6511 ddi_prop_remove_all(cdip);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6512 rval = ndi_devi_free(cdip);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6513 if (rval != NDI_SUCCESS) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6514 SATA_LOG_D((sata_hba_inst, CE_WARN, "sata_create_target_node: "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6515 "node removal failed %d", rval));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6516 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6517 sata_log(sata_hba_inst, CE_WARN, "sata_create_target_node: "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6518 "cannot create target node for device at port %d",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6519 sata_addr->cport);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6520 return (NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6521 }
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
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6524
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 * Re-probe sata port, check for a device and attach necessary info
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6527 * structures when necessary. Identify Device data is fetched, if possible.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6528 * Assumption: sata address is already validated.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6529 * SATA_SUCCESS is returned if port is re-probed sucessfully, regardless of
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6530 * the presence of a device and its type.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6531 * SATA_FAILURE is returned if one of the operations failed.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6532 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6533 static int
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6534 sata_reprobe_port(sata_hba_inst_t *sata_hba_inst, sata_device_t *sata_device)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6535 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6536 sata_cport_info_t *cportinfo;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6537 sata_drive_info_t *sdinfo;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6538 int rval;
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 /* We only care about host sata cport for now */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6541 cportinfo = SATA_CPORT_INFO(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6542 sata_device->satadev_addr.cport);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6543 /* probe port */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6544 mutex_enter(&cportinfo->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6545 cportinfo->cport_state &= ~SATA_PORT_STATE_CLEAR_MASK;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6546 cportinfo->cport_state |= SATA_STATE_PROBING;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6547 mutex_exit(&cportinfo->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6548
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6549 rval = (*SATA_PROBE_PORT_FUNC(sata_hba_inst))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6550 (SATA_DIP(sata_hba_inst), sata_device);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6551
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6552 mutex_enter(&cportinfo->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6553 if (rval != SATA_SUCCESS) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6554 cportinfo->cport_state = SATA_PSTATE_FAILED;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6555 mutex_exit(&cportinfo->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6556 SATA_LOG_D((sata_hba_inst, CE_WARN, "sata_hba_ioctl: "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6557 "connect: port probbing failed"));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6558 return (SATA_FAILURE);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6559 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6560
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 * update sata port state and set device type
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 sata_update_port_info(sata_hba_inst, sata_device);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6565 cportinfo->cport_state |= SATA_STATE_PROBED;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6566
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6567 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6568 * Sanity check - Port is active? Is the link active?
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6569 * Is there any device attached?
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6570 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6571 if ((cportinfo->cport_state &
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6572 (SATA_PSTATE_SHUTDOWN | SATA_PSTATE_FAILED)) ||
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6573 (cportinfo->cport_scr.sstatus & SATA_PORT_DEVLINK_UP_MASK) !=
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6574 SATA_PORT_DEVLINK_UP) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6575 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6576 * Port in non-usable state or no link active/no device.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6577 * Free info structure if necessary (direct attached drive
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6578 * only, for now!
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6579 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6580 sdinfo = SATA_CPORTINFO_DRV_INFO(cportinfo);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6581 SATA_CPORTINFO_DRV_INFO(cportinfo) = NULL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6582 /* Add here differentiation for device attached or not */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6583 cportinfo->cport_dev_type = SATA_DTYPE_NONE;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6584 mutex_exit(&cportinfo->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6585 if (sdinfo != NULL)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6586 kmem_free(sdinfo, sizeof (sata_drive_info_t));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6587 return (SATA_SUCCESS);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6588 }
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 cportinfo->cport_state |= SATA_STATE_READY;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6591 cportinfo->cport_dev_type = sata_device->satadev_type;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6592 sdinfo = SATA_CPORTINFO_DRV_INFO(cportinfo);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6593
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6594 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6595 * If we are re-probing the port, there may be
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6596 * sata_drive_info structure attached
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6597 * (or sata_pm_info, if PMult is supported).
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6598 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6599 if (sata_device->satadev_type == SATA_DTYPE_NONE) {
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 * There is no device, so remove device info structure,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6602 * if necessary. Direct attached drive only!
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6603 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6604 SATA_CPORTINFO_DRV_INFO(cportinfo) = NULL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6605 cportinfo->cport_dev_type = SATA_DTYPE_NONE;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6606 if (sdinfo != NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6607 kmem_free(sdinfo, sizeof (sata_drive_info_t));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6608 sata_log(sata_hba_inst, CE_WARN,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6609 "SATA device detached "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6610 "from port %d", cportinfo->cport_addr.cport);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6611 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6612 mutex_exit(&cportinfo->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6613 return (SATA_SUCCESS);
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 if (sata_device->satadev_type != SATA_DTYPE_PMULT) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6617 if (sdinfo == NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6618 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6619 * There is some device attached, but there is
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6620 * no sata_drive_info structure - allocate one
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 mutex_exit(&cportinfo->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6623 sdinfo = kmem_zalloc(
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6624 sizeof (sata_drive_info_t), KM_SLEEP);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6625 mutex_enter(&cportinfo->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6626 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6627 * Recheck, if port state did not change when we
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6628 * released mutex.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6629 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6630 if (cportinfo->cport_state & SATA_STATE_READY) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6631 SATA_CPORTINFO_DRV_INFO(cportinfo) = sdinfo;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6632 sdinfo->satadrv_addr = cportinfo->cport_addr;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6633 sdinfo->satadrv_addr.qual = SATA_ADDR_DCPORT;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6634 sdinfo->satadrv_type = SATA_DTYPE_UNKNOWN;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6635 sdinfo->satadrv_state = SATA_STATE_UNKNOWN;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6636 sata_log(sata_hba_inst, CE_WARN,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6637 "SATA device attached to port %d",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6638 cportinfo->cport_addr.cport);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6639 } else {
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 * Port is not in ready state, we
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6642 * cannot attach a device.
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 mutex_exit(&cportinfo->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6645 kmem_free(sdinfo, sizeof (sata_drive_info_t));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6646 return (SATA_SUCCESS);
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 }
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 cportinfo->cport_dev_type = SATA_DTYPE_UNKNOWN;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6651 sata_device->satadev_addr.qual = sdinfo->satadrv_addr.qual;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6652 } else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6653 cportinfo->cport_dev_type = SATA_DTYPE_UNKNOWN;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6654 mutex_exit(&cportinfo->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6655 return (SATA_SUCCESS);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6656 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6657 mutex_exit(&cportinfo->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6658 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6659 * Figure out what kind of device we are really
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6660 * dealing with.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6661 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6662 return (sata_probe_device(sata_hba_inst, sata_device));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6663 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6664
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 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6667 * Validate sata address.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6668 * Specified cport, pmport and qualifier has to match
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6669 * passed sata_scsi configuration info.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6670 * The presence of an attached device is not verified.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6671 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6672 * Returns 0 when address is valid, -1 otherwise.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6673 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6674 static int
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6675 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
6676 int pmport, int qual)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6677 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6678 if (qual == SATA_ADDR_DCPORT && pmport != 0)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6679 goto invalid_address;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6680 if (cport >= SATA_NUM_CPORTS(sata_hba_inst))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6681 goto invalid_address;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6682 if ((qual == SATA_ADDR_DPMPORT || qual == SATA_ADDR_PMPORT) &&
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6683 ((SATA_CPORT_DEV_TYPE(sata_hba_inst, cport) != SATA_DTYPE_PMULT) ||
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6684 (SATA_PMULT_INFO(sata_hba_inst, cport) == NULL) ||
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6685 (pmport >= SATA_NUM_PMPORTS(sata_hba_inst, cport))))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6686 goto invalid_address;
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 return (0);
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 invalid_address:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6691 return (-1);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6692
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
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6695 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6696 * Validate scsi address
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6697 * SCSI target address is translated into SATA cport/pmport and compared
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6698 * with a controller port/device configuration. LUN has to be 0.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6699 * Returns 0 if a scsi target refers to an attached device,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6700 * returns 1 if address is valid but device is not attached,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6701 * returns -1 if bad address or device is of an unsupported type.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6702 * Upon return sata_device argument is set.
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 static int
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6705 sata_validate_scsi_address(sata_hba_inst_t *sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6706 struct scsi_address *ap, sata_device_t *sata_device)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6707 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6708 int cport, pmport, qual, rval;
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 rval = -1; /* Invalid address */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6711 if (ap->a_lun != 0)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6712 goto out;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6713
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6714 qual = SCSI_TO_SATA_ADDR_QUAL(ap->a_target);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6715 cport = SCSI_TO_SATA_CPORT(ap->a_target);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6716 pmport = SCSI_TO_SATA_PMPORT(ap->a_target);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6717
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6718 if (qual != SATA_ADDR_DCPORT && qual != SATA_ADDR_DPMPORT)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6719 goto out;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6720
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6721 if (sata_validate_sata_address(sata_hba_inst, cport, pmport, qual) ==
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6722 0) {
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 sata_cport_info_t *cportinfo;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6725 sata_pmult_info_t *pmultinfo;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6726 sata_drive_info_t *sdinfo = NULL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6727
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6728 rval = 1; /* Valid sata address */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6729
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6730 cportinfo = SATA_CPORT_INFO(sata_hba_inst, cport);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6731 if (qual == SATA_ADDR_DCPORT) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6732 if (cportinfo == NULL ||
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6733 cportinfo->cport_dev_type == SATA_DTYPE_NONE)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6734 goto out;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6735
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6736 if (cportinfo->cport_dev_type == SATA_DTYPE_PMULT ||
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6737 (cportinfo->cport_dev_type &
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6738 SATA_VALID_DEV_TYPE) == 0) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6739 rval = -1;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6740 goto out;
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 sdinfo = SATA_CPORTINFO_DRV_INFO(cportinfo);
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 } else if (qual == SATA_ADDR_DPMPORT) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6745 pmultinfo = SATA_CPORTINFO_PMULT_INFO(cportinfo);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6746 if (pmultinfo == NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6747 rval = -1;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6748 goto out;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6749 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6750 if (SATA_PMPORT_INFO(sata_hba_inst, cport, pmport) ==
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6751 NULL ||
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6752 SATA_PMPORT_DEV_TYPE(sata_hba_inst, cport,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6753 pmport) == SATA_DTYPE_NONE)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6754 goto out;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6755
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6756 sdinfo = SATA_PMPORT_DRV_INFO(sata_hba_inst, cport,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6757 pmport);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6758 } else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6759 rval = -1;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6760 goto out;
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 if ((sdinfo == NULL) ||
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6763 (sdinfo->satadrv_type & SATA_VALID_DEV_TYPE) == 0)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6764 goto out;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6765
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6766 sata_device->satadev_type = sdinfo->satadrv_type;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6767 sata_device->satadev_addr.qual = qual;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6768 sata_device->satadev_addr.cport = cport;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6769 sata_device->satadev_addr.pmport = pmport;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6770 sata_device->satadev_rev = SATA_DEVICE_REV_1;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6771 return (0);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6772 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6773 out:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6774 if (rval == 1) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6775 SATADBG2(SATA_DBG_SCSI_IF, sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6776 "sata_validate_scsi_address: no valid target %x lun %x",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6777 ap->a_target, ap->a_lun);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6778 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6779 return (rval);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6780 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6781
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6782 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6783 * Find dip corresponding to passed device number
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6784 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6785 * 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
6786 * Returns dip is device is found.
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 static dev_info_t *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6789 sata_devt_to_devinfo(dev_t dev)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6790 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6791 dev_info_t *dip;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6792 #ifndef __lock_lint
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6793 struct devnames *dnp;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6794 major_t major = getmajor(dev);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6795 int instance = SATA_MINOR2INSTANCE(getminor(dev));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6796
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6797 if (major >= devcnt)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6798 return (NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6799
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6800 dnp = &devnamesp[major];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6801 LOCK_DEV_OPS(&(dnp->dn_lock));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6802 dip = dnp->dn_head;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6803 while (dip && (ddi_get_instance(dip) != instance)) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6804 dip = ddi_get_next(dip);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6805 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6806 UNLOCK_DEV_OPS(&(dnp->dn_lock));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6807 #endif
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6808
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6809 return (dip);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6810 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6811
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6812
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6813 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6814 * Probe device.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6815 * This function issues Identify Device command and initialize local
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6816 * sata_drive_info structure if the device can be identified.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6817 * The device type is determined by examining Identify Device
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6818 * command response.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6819 * If the sata_hba_inst has linked drive info structure for this
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6820 * device address, the Identify Device data is stored into sata_drive_info
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6821 * structure linked to the port info structure.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6822 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6823 * 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
6824 * by sata_hba_inst structure.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6825 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6826 * Returns: SATA_SUCCESS if device type was successfully probed and port-linked
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6827 * drive info structure was updated;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6828 * SATA_FAILURE if there is no device, or device was not probed
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6829 * successully.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6830 * 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
6831 * fields are set to unknown.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6832 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6833 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6834
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6835 static int
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6836 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
6837 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6838 sata_drive_info_t *sdinfo;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6839 sata_drive_info_t new_sdinfo; /* local drive info struct */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6840 int retry_cnt;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6841
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6842 ASSERT((SATA_CPORT_STATE(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6843 sata_device->satadev_addr.cport) &
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6844 (SATA_STATE_PROBED | SATA_STATE_READY)) != 0);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6845
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6846 sata_device->satadev_type = SATA_DTYPE_NONE;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6847
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6848 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6849 sata_device->satadev_addr.cport)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6850
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6851 /* Get pointer to port-linked sata device info structure */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6852 sdinfo = sata_get_device_info(sata_hba_inst, sata_device);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6853 if (sdinfo != NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6854 sdinfo->satadrv_state &=
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6855 ~(SATA_STATE_PROBED | SATA_STATE_READY);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6856 sdinfo->satadrv_state |= SATA_STATE_PROBING;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6857 } else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6858 /* No device to probe */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6859 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6860 sata_device->satadev_addr.cport)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6861 sata_device->satadev_type = SATA_DTYPE_NONE;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6862 sata_device->satadev_state = SATA_STATE_UNKNOWN;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6863 return (SATA_FAILURE);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6864 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6865 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6866 * Need to issue both types of identify device command and
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6867 * determine device type by examining retreived data/status.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6868 * First, ATA Identify Device.
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 bzero(&new_sdinfo, sizeof (sata_drive_info_t));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6871 new_sdinfo.satadrv_addr = sata_device->satadev_addr;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6872 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6873 sata_device->satadev_addr.cport)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6874 for (retry_cnt = 0; retry_cnt <= SATA_DEVICE_IDENTIFY_RETRY;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6875 retry_cnt++) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6876 new_sdinfo.satadrv_type = SATA_DTYPE_ATADISK;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6877 if (sata_identify_device(sata_hba_inst, &new_sdinfo) == 0) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6878 /* Got something responding to ATA Identify Device */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6879 if (sata_set_udma_mode(sata_hba_inst, &new_sdinfo) !=
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6880 SATA_SUCCESS) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6881 /* Try one more time */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6882 if (sata_set_udma_mode(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6883 &new_sdinfo) != SATA_SUCCESS)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6884 goto failure;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6885 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6886 sata_device->satadev_type = new_sdinfo.satadrv_type;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6887 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6888 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6889 if (SATA_FEATURES(sata_hba_inst) & SATA_CTLF_ATAPI) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6890 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6891 * HBA supports ATAPI - try to issue Identify Packet
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6892 * Device command.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6893 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6894 new_sdinfo.satadrv_type = SATA_DTYPE_ATAPICD;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6895 if (sata_identify_device(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6896 &new_sdinfo) == 0) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6897 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6898 * Got something responding to Identify Packet
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6899 * Device cmd.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6900 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6901 /* Set UDMA mode here as well ? - phase 2 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6902 sata_device->satadev_type =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6903 new_sdinfo.satadrv_type;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6904 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6905 }
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 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6908 if (retry_cnt <= SATA_DEVICE_IDENTIFY_RETRY) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6909 /* save device info, if possible */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6910 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6911 sata_device->satadev_addr.cport)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6912 sdinfo = sata_get_device_info(sata_hba_inst, sata_device);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6913 if (sdinfo == NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6914 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6915 sata_device->satadev_addr.cport)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6916 return (SATA_FAILURE);
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 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6919 * Copy drive info into the port-linked drive info structure.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6920 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6921 *sdinfo = new_sdinfo;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6922 sdinfo->satadrv_state &= ~SATA_STATE_PROBING;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6923 sdinfo->satadrv_state |= SATA_STATE_PROBED;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6924 if (sata_device->satadev_addr.qual == SATA_ADDR_DCPORT)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6925 SATA_CPORT_DEV_TYPE(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6926 sata_device->satadev_addr.cport) =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6927 sdinfo->satadrv_type;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6928 else /* SATA_ADDR_DPMPORT */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6929 SATA_PMPORT_DEV_TYPE(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6930 sata_device->satadev_addr.cport,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6931 sata_device->satadev_addr.pmport) =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6932 sdinfo->satadrv_type;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6933 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6934 sata_device->satadev_addr.cport)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6935 return (SATA_SUCCESS);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6936 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6937
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6938 failure:
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 * Looks like we cannot determine the device type.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6941 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6942 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6943 sata_device->satadev_addr.cport)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6944 sdinfo = sata_get_device_info(sata_hba_inst, sata_device);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6945 if (sdinfo != NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6946 sata_device->satadev_type = SATA_DTYPE_UNKNOWN;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6947 sdinfo->satadrv_type = SATA_DTYPE_UNKNOWN;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6948 sdinfo->satadrv_state &= ~SATA_STATE_PROBING;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6949 sdinfo->satadrv_state = SATA_STATE_PROBED;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6950 if (sata_device->satadev_addr.qual == SATA_ADDR_DCPORT)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6951 SATA_CPORT_DEV_TYPE(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6952 sata_device->satadev_addr.cport) =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6953 SATA_DTYPE_UNKNOWN;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6954 else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6955 /* SATA_ADDR_DPMPORT */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6956 if ((SATA_PMULT_INFO(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6957 sata_device->satadev_addr.cport) != NULL) &&
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6958 (SATA_PMPORT_INFO(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6959 sata_device->satadev_addr.cport,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6960 sata_device->satadev_addr.pmport) != NULL))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6961 SATA_PMPORT_DEV_TYPE(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6962 sata_device->satadev_addr.cport,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6963 sata_device->satadev_addr.pmport) =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6964 SATA_DTYPE_UNKNOWN;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6965 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6966 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6967 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6968 sata_device->satadev_addr.cport)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6969 return (SATA_FAILURE);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6970 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6971
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6972
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6973 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6974 * Get pointer to sata_drive_info structure.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6975 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6976 * The sata_device has to contain address (cport, pmport and qualifier) for
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6977 * specified sata_scsi structure.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6978 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6979 * Returns NULL if device address is not valid for this HBA configuration.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6980 * Otherwise, returns a pointer to sata_drive_info structure.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6981 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6982 * This function should be called with a port mutex held.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6983 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6984 static sata_drive_info_t *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6985 sata_get_device_info(sata_hba_inst_t *sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6986 sata_device_t *sata_device)
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 uint8_t cport = sata_device->satadev_addr.cport;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6989 uint8_t pmport = sata_device->satadev_addr.pmport;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6990 uint8_t qual = sata_device->satadev_addr.qual;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6991
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6992 if (cport >= SATA_NUM_CPORTS(sata_hba_inst))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6993 return (NULL);
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 if (!(SATA_CPORT_STATE(sata_hba_inst, cport) &
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6996 (SATA_STATE_PROBED | SATA_STATE_READY)))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6997 /* Port not probed yet */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6998 return (NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6999
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7000 if (SATA_CPORT_DEV_TYPE(sata_hba_inst, cport) == SATA_DTYPE_NONE)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7001 return (NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7002
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7003 if (qual == SATA_ADDR_DCPORT) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7004 /* Request for a device on a controller port */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7005 if (SATA_CPORT_DEV_TYPE(sata_hba_inst, cport) ==
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7006 SATA_DTYPE_PMULT)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7007 /* Port multiplier attached */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7008 return (NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7009 return (SATA_CPORT_DRV_INFO(sata_hba_inst, cport));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7010 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7011 if (qual == SATA_ADDR_DPMPORT) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7012 if (SATA_CPORT_DEV_TYPE(sata_hba_inst, cport) !=
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7013 SATA_DTYPE_PMULT)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7014 return (NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7015
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7016 if (pmport > SATA_NUM_PMPORTS(sata_hba_inst, cport))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7017 return (NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7018
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7019 return (SATA_PMPORT_DRV_INFO(sata_hba_inst, cport, pmport));
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 /* we should not get here */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7023 return (NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7024 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7025
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7026
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7027 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7028 * sata_identify_device.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7029 * Send Identify Device command to SATA HBA driver.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7030 * If command executes successfully, update sata_drive_info structure pointed
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7031 * to by sdinfo argument, including Identify Device data.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7032 * If command fails, invalidate data in sata_drive_info.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7033 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7034 * Cannot be called from interrupt level.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7035 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7036 * Returns 0 if device was identified as supported device, -1 otherwise.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7037 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7038 static int
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7039 sata_identify_device(sata_hba_inst_t *sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7040 sata_drive_info_t *sdinfo)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7041 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7042 uint16_t cfg_word;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7043 int i;
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 /* fetch device identify data */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7046 if (sata_fetch_device_identify_data(sata_hba_inst, sdinfo) != 0)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7047 goto fail_unknown;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7048
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7049 cfg_word = sdinfo->satadrv_id.ai_config;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7050 if (sdinfo->satadrv_type == SATA_DTYPE_ATADISK &&
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7051 (cfg_word & SATA_ATA_TYPE_MASK) != SATA_ATA_TYPE) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7052 /* Change device type to reflect Identify Device data */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7053 if (((cfg_word & SATA_ATAPI_TYPE_MASK) ==
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7054 SATA_ATAPI_TYPE) &&
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7055 ((cfg_word & SATA_ATAPI_ID_DEV_TYPE) ==
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7056 SATA_ATAPI_CDROM_DEV)) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7057 sdinfo->satadrv_type = SATA_DTYPE_ATAPICD;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7058 } else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7059 sdinfo->satadrv_type = SATA_DTYPE_UNKNOWN;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7060 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7061 } else if (sdinfo->satadrv_type == SATA_DTYPE_ATAPICD &&
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7062 (((cfg_word & SATA_ATAPI_TYPE_MASK) != SATA_ATAPI_TYPE) ||
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7063 ((cfg_word & SATA_ATAPI_ID_DEV_TYPE) != SATA_ATAPI_CDROM_DEV))) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7064 /* Change device type to reflect Identify Device data ! */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7065 if ((sdinfo->satadrv_id.ai_config & SATA_ATA_TYPE_MASK) ==
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7066 SATA_ATA_TYPE) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7067 sdinfo->satadrv_type = SATA_DTYPE_ATADISK;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7068 } else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7069 sdinfo->satadrv_type = SATA_DTYPE_UNKNOWN;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7070 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7071 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7072 if (sdinfo->satadrv_type == SATA_DTYPE_ATADISK) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7073 if (sdinfo->satadrv_capacity == 0) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7074 /* Non-LBA disk. Too bad... */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7075 sata_log(sata_hba_inst, CE_WARN,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7076 "SATA disk device at port %d does not support LBA",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7077 sdinfo->satadrv_addr.cport);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7078 goto fail_unknown;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7079 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7080 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7081 /* Check for Ultra DMA modes 6 through 0 being supported */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7082 for (i = 6; i >= 0; --i) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7083 if (sdinfo->satadrv_id.ai_ultradma & (1 << i))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7084 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7085 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7086 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7087 * 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
7088 * higher are not supported by the device, fail this
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7089 * device.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7090 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7091 if (i < 4) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7092 /* No required Ultra DMA mode supported */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7093 sata_log(sata_hba_inst, CE_WARN,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7094 "SATA disk device at port %d does not support UDMA "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7095 "mode 4 or higher", sdinfo->satadrv_addr.cport);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7096 SATA_LOG_D((sata_hba_inst, CE_WARN,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7097 "mode 4 or higher required, %d supported", i));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7098 goto fail_unknown;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7099 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7100
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7101 return (0);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7102
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7103 fail_unknown:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7104 /* Invalidate sata_drive_info ? */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7105 sdinfo->satadrv_type = SATA_DTYPE_UNKNOWN;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7106 sdinfo->satadrv_state = SATA_STATE_UNKNOWN;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7107 return (-1);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7108 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7109
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7110 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7111 * Log/display device information
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7112 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7113 static void
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7114 sata_show_drive_info(sata_hba_inst_t *sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7115 sata_drive_info_t *sdinfo)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7116 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7117 int valid_version;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7118 char msg_buf[MAXPATHLEN];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7119
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7120 /* Show HBA path */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7121 (void) ddi_pathname(SATA_DIP(sata_hba_inst), msg_buf);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7122
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7123 cmn_err(CE_CONT, "?%s :\n", msg_buf);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7124
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7125 if (sdinfo->satadrv_type == SATA_DTYPE_UNKNOWN) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7126 (void) sprintf(msg_buf,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7127 "Unsupported SATA device type (cfg 0x%x) at ",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7128 sdinfo->satadrv_id.ai_config);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7129 } else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7130 (void) sprintf(msg_buf, "SATA %s device at",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7131 sdinfo->satadrv_type == SATA_DTYPE_ATADISK ?
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7132 "disk":"CD/DVD (ATAPI)");
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7133 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7134 if (sdinfo->satadrv_addr.qual == SATA_ADDR_DCPORT)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7135 cmn_err(CE_CONT, "?\t%s port %d\n",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7136 msg_buf, sdinfo->satadrv_addr.cport);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7137 else
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7138 cmn_err(CE_CONT, "?\t%s port %d pmport %d\n",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7139 msg_buf, sdinfo->satadrv_addr.cport,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7140 sdinfo->satadrv_addr.pmport);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7141
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7142 bcopy(&sdinfo->satadrv_id.ai_model, msg_buf,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7143 sizeof (sdinfo->satadrv_id.ai_model));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7144 swab(msg_buf, msg_buf, sizeof (sdinfo->satadrv_id.ai_model));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7145 msg_buf[sizeof (sdinfo->satadrv_id.ai_model)] = '\0';
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7146 cmn_err(CE_CONT, "?\tmodel %s\n", msg_buf);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7147
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7148 bcopy(&sdinfo->satadrv_id.ai_fw, msg_buf,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7149 sizeof (sdinfo->satadrv_id.ai_fw));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7150 swab(msg_buf, msg_buf, sizeof (sdinfo->satadrv_id.ai_fw));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7151 msg_buf[sizeof (sdinfo->satadrv_id.ai_fw)] = '\0';
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7152 cmn_err(CE_CONT, "?\tfirmware %s\n", msg_buf);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7153
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7154 bcopy(&sdinfo->satadrv_id.ai_drvser, msg_buf,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7155 sizeof (sdinfo->satadrv_id.ai_drvser));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7156 swab(msg_buf, msg_buf, sizeof (sdinfo->satadrv_id.ai_drvser));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7157 msg_buf[sizeof (sdinfo->satadrv_id.ai_drvser)] = '\0';
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7158 cmn_err(CE_CONT, "?\tserial number %sn", msg_buf);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7159
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7160 #ifdef SATA_DEBUG
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7161 if (sdinfo->satadrv_id.ai_majorversion != 0 &&
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7162 sdinfo->satadrv_id.ai_majorversion != 0xffff) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7163 int i;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7164 for (i = 14; i >= 2; i--) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7165 if (sdinfo->satadrv_id.ai_majorversion & (1 << i)) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7166 valid_version = i;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7167 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7168 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7169 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7170 cmn_err(CE_CONT,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7171 "?\tATA/ATAPI-%d supported, majver 0x%x minver 0x%x\n",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7172 valid_version,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7173 sdinfo->satadrv_id.ai_majorversion,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7174 sdinfo->satadrv_id.ai_minorversion);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7175 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7176 #endif
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7177 /* Log some info */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7178 cmn_err(CE_CONT, "?\tsupported features:\n");
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7179 msg_buf[0] = '\0';
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7180 if (sdinfo->satadrv_features_support & SATA_DEV_F_LBA48)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7181 (void) strlcat(msg_buf, "48-bit LBA", MAXPATHLEN);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7182 else if (sdinfo->satadrv_features_support & SATA_DEV_F_LBA28)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7183 (void) strlcat(msg_buf, "28-bit LBA", MAXPATHLEN);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7184 if (sdinfo->satadrv_features_support & SATA_DEV_F_DMA)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7185 (void) strlcat(msg_buf, ", DMA", MAXPATHLEN);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7186 if (sdinfo->satadrv_features_support & SATA_DEV_F_NCQ)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7187 (void) strlcat(msg_buf, ", Native Command Queueing",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7188 MAXPATHLEN);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7189 else if (sdinfo->satadrv_id.ai_cmdset83 & SATA_RW_DMA_QUEUED_CMD)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7190 (void) strlcat(msg_buf, ", Queuing", MAXPATHLEN);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7191 cmn_err(CE_CONT, "?\t %s\n", msg_buf);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7192 if (sdinfo->satadrv_features_support & SATA_DEV_F_SATA2)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7193 cmn_err(CE_CONT, "?\tSATA1 & SATA2 compatible\n");
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7194 else if (sdinfo->satadrv_features_support & SATA_DEV_F_SATA1)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7195 cmn_err(CE_CONT, "?\tSATA1 compatible\n");
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7196
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7197 #ifdef __i386
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7198 (void) sprintf(msg_buf, "\tcapacity = %llu sectors\n",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7199 sdinfo->satadrv_capacity);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7200 #else
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7201 (void) sprintf(msg_buf, "\tcapacity = %lu sectors\n",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7202 sdinfo->satadrv_capacity);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7203 #endif
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7204 cmn_err(CE_CONT, "?%s", msg_buf);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7205 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7206
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7207
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7208 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7209 * sata_save_drive_settings extracts current setting of the device and stores
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7210 * 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
7211 * after the device reset.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7212 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7213 * At the moment only read ahead and write cache settings are saved, if the
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7214 * device supports these features at all.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7215 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7216 static void
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7217 sata_save_drive_settings(sata_drive_info_t *sdinfo)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7218 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7219 if (!(sdinfo->satadrv_id.ai_cmdset82 & SATA_LOOK_AHEAD) &&
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7220 !(sdinfo->satadrv_id.ai_cmdset82 & SATA_WRITE_CACHE)) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7221 /* None of the features is supported - do nothing */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7222 return;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7223 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7224
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7225 /* Current setting of Read Ahead (and Read Cache) */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7226 if (sdinfo->satadrv_id.ai_features85 & SATA_LOOK_AHEAD)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7227 sdinfo->satadrv_settings |= SATA_DEV_READ_AHEAD;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7228 else
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7229 sdinfo->satadrv_settings &= ~SATA_DEV_READ_AHEAD;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7230
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7231 /* Current setting of Write Cache */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7232 if (sdinfo->satadrv_id.ai_features85 & SATA_WRITE_CACHE)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7233 sdinfo->satadrv_settings |= SATA_DEV_WRITE_CACHE;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7234 else
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7235 sdinfo->satadrv_settings &= ~SATA_DEV_WRITE_CACHE;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7236 }
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
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7239 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7240 * sata_check_capacity function determines a disk capacity
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7241 * and addressing mode (LBA28/LBA48) by examining a disk identify device data.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7242 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7243 * 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
7244 * this function is not called.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7245 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7246 * 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
7247 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7248 static uint64_t
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7249 sata_check_capacity(sata_drive_info_t *sdinfo)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7250 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7251 uint64_t capacity = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7252 int i;
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 if (sdinfo->satadrv_type != SATA_DTYPE_ATADISK ||
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7255 !sdinfo->satadrv_id.ai_cap & SATA_LBA_SUPPORT)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7256 /* Capacity valid only for LBA-addressable disk devices */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7257 return (0);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7259 if ((sdinfo->satadrv_id.ai_validinfo & SATA_VALIDINFO_88) &&
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7260 (sdinfo->satadrv_id.ai_cmdset83 & SATA_EXT48) &&
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7261 (sdinfo->satadrv_id.ai_features86 & SATA_EXT48)) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7262 /* LBA48 mode supported and enabled */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7263 sdinfo->satadrv_features_support |= SATA_DEV_F_LBA48 |
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7264 SATA_DEV_F_LBA28;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7265 for (i = 3; i >= 0; --i) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7266 capacity <<= 16;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7267 capacity += sdinfo->satadrv_id.ai_addrsecxt[i];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7268 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7269 } else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7270 capacity = sdinfo->satadrv_id.ai_addrsec[1];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7271 capacity <<= 16;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7272 capacity += sdinfo->satadrv_id.ai_addrsec[0];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7273 if (capacity >= 0x1000000)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7274 /* LBA28 mode */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7275 sdinfo->satadrv_features_support |= SATA_DEV_F_LBA28;
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 return (capacity);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7278 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7279
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7280
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7281 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7282 * Allocate consistent buffer for DMA transfer
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7283 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7284 * 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
7285 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7286 * Returns pointer to allocated buffer structure, or NULL if allocation failed.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7287 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7288 static struct buf *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7289 sata_alloc_local_buffer(sata_pkt_txlate_t *spx, int len)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7290 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7291 struct scsi_address ap;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7292 struct buf *bp;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7293 ddi_dma_attr_t cur_dma_attr;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7294
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7295 ASSERT(spx->txlt_sata_pkt != NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7296 ap.a_hba_tran = spx->txlt_sata_hba_inst->satahba_scsi_tran;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7297 ap.a_target = SATA_TO_SCSI_TARGET(
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7298 spx->txlt_sata_pkt->satapkt_device.satadev_addr.cport,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7299 spx->txlt_sata_pkt->satapkt_device.satadev_addr.pmport,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7300 spx->txlt_sata_pkt->satapkt_device.satadev_addr.qual);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7301 ap.a_lun = 0;
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 bp = scsi_alloc_consistent_buf(&ap, NULL, len,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7304 B_READ, SLEEP_FUNC, NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7305
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7306 if (bp != NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7307 /* Allocate DMA resources for this buffer */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7308 spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp = bp;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7309 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7310 * We use a local version of the dma_attr, to account
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7311 * for a device addressing limitations.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7312 * sata_adjust_dma_attr() will handle sdinfo == NULL which
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7313 * will cause dma attributes to be adjusted to a lowest
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7314 * acceptable level.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7315 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7316 sata_adjust_dma_attr(NULL,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7317 SATA_DMA_ATTR(spx->txlt_sata_hba_inst), &cur_dma_attr);
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 if (sata_dma_buf_setup(spx, PKT_CONSISTENT,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7320 SLEEP_FUNC, NULL, &cur_dma_attr) != DDI_SUCCESS) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7321 scsi_free_consistent_buf(bp);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7322 spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp = NULL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7323 bp = NULL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7324 }
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 return (bp);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7327 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7328
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 * Release local buffer (consistent buffer for DMA transfer) allocated
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7331 * via sata_alloc_local_buffer().
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 static void
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7334 sata_free_local_buffer(sata_pkt_txlate_t *spx)
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 ASSERT(spx->txlt_sata_pkt != NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7337 ASSERT(spx->txlt_dma_cookie_list != NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7338 ASSERT(spx->txlt_dma_cookie_list_len != 0);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7339 ASSERT(spx->txlt_buf_dma_handle != NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7340 ASSERT(spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp != NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7341
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7342 spx->txlt_sata_pkt->satapkt_cmd.satacmd_num_dma_cookies = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7343 spx->txlt_sata_pkt->satapkt_cmd.satacmd_dma_cookie_list = NULL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7344
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7345 /* Free DMA resources */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7346 (void) ddi_dma_unbind_handle(spx->txlt_buf_dma_handle);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7347 ddi_dma_free_handle(&spx->txlt_buf_dma_handle);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7348 spx->txlt_buf_dma_handle = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7349
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7350 kmem_free(spx->txlt_dma_cookie_list,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7351 spx->txlt_dma_cookie_list_len * sizeof (ddi_dma_cookie_t));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7352 spx->txlt_dma_cookie_list = NULL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7353 spx->txlt_dma_cookie_list_len = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7354
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7355 /* Free buffer */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7356 scsi_free_consistent_buf(spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7357 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7358
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7359
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7360
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7361
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7362 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7363 * Allocate sata_pkt
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7364 * Pkt structure version and embedded strcutures version are initialized.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7365 * sata_pkt and sata_pkt_txlate structures are cross-linked.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7366 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7367 * 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
7368 * callback argument determines if it can sleep or not.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7369 * Hence, it should not be called from interrupt context.
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 * If successful, non-NULL pointer to a sata pkt is returned.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7372 * Upon failure, NULL pointer is returned.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7373 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7374 static sata_pkt_t *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7375 sata_pkt_alloc(sata_pkt_txlate_t *spx, int (*callback)(caddr_t))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7376 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7377 sata_pkt_t *spkt;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7378 int kmsflag;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7379
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7380 kmsflag = (callback == SLEEP_FUNC) ? KM_SLEEP : KM_NOSLEEP;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7381 spkt = kmem_zalloc(sizeof (sata_pkt_t), kmsflag);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7382 if (spkt == NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7383 SATA_LOG_D((spx->txlt_sata_hba_inst, CE_WARN,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7384 "sata_pkt_alloc: failed"));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7385 return (NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7386 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7387 spkt->satapkt_rev = SATA_PKT_REV;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7388 spkt->satapkt_cmd.satacmd_rev = SATA_CMD_REV;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7389 spkt->satapkt_device.satadev_rev = SATA_DEVICE_REV;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7390 spkt->satapkt_framework_private = spx;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7391 spx->txlt_sata_pkt = spkt;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7392 return (spkt);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7393 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7394
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7395 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7396 * Free sata pkt allocated via sata_pkt_alloc()
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7397 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7398 static void
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7399 sata_pkt_free(sata_pkt_txlate_t *spx)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7400 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7401 ASSERT(spx->txlt_sata_pkt != NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7402 ASSERT(spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp == NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7403 kmem_free(spx->txlt_sata_pkt, sizeof (sata_pkt_t));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7404 spx->txlt_sata_pkt = NULL;
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
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7408 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7409 * Adjust DMA attributes.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7410 * 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
7411 * from 8 bits to 16 bits, depending on a command being used.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7412 * Limiting max block count arbitrarily to 256 for all read/write
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7413 * commands may affects performance, so check both the device and
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7414 * controller capability before adjusting dma attributes.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7415 * For ATAPI CD/DVD dma granularity has to be adjusted as well,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7416 * because these devices support block size of 2k rather
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7417 * then 512 bytes.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7418 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7419 void
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7420 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
7421 ddi_dma_attr_t *adj_dma_attr)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7422 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7423 uint32_t count_max;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7424
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7425 /* Copy original attributes */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7426 *adj_dma_attr = *dma_attr;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7427
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7428 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7429 * Things to consider: device addressing capability,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7430 * "excessive" controller DMA capabilities.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7431 * If a device is being probed/initialized, there are
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7432 * no device info - use default limits then.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7433 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7434 if (sdinfo == NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7435 count_max = dma_attr->dma_attr_granular * 0x100;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7436 if (dma_attr->dma_attr_count_max > count_max)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7437 adj_dma_attr->dma_attr_count_max = count_max;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7438 if (dma_attr->dma_attr_maxxfer > count_max)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7439 adj_dma_attr->dma_attr_maxxfer = count_max;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7440 return;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7441 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7442 if (sdinfo->satadrv_type == SATA_DTYPE_ATAPICD) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7443 /* arbitrarily modify controller dma granularity */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7444 adj_dma_attr->dma_attr_granular = SATA_ATAPI_SECTOR_SIZE;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7445 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7446
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7447 if (sdinfo->satadrv_features_support & (SATA_DEV_F_LBA48)) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7448 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7449 * 16-bit sector count may be used - we rely on
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7450 * the assumption that only read and write cmds
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7451 * will request more than 256 sectors worth of data
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7452 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7453 count_max = adj_dma_attr->dma_attr_granular * 0x10000;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7454 } else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7455 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7456 * 8-bit sector count will be used - default limits
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7457 * for dma attributes
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7458 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7459 count_max = adj_dma_attr->dma_attr_granular * 0x100;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7460 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7461
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7462
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7463 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7464 * Adjust controler dma attributes, if necessary
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7465 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7466 if (dma_attr->dma_attr_count_max > count_max)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7467 adj_dma_attr->dma_attr_count_max = count_max;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7468 if (dma_attr->dma_attr_maxxfer > count_max)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7469 adj_dma_attr->dma_attr_maxxfer = count_max;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7470 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7471
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7472
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7473 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7474 * Allocate DMA resources for the buffer
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7475 * This function handles initial DMA resource allocation as well as
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7476 * 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
7477 * until all DMA cookies in the DMA window are processed.
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 * Returns DDI_SUCCESS upon successful operation,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7480 * returns failure code returned by failing commands or DDI_FAILURE when
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7481 * internal cleanup failed.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7482 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7483 static int
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7484 sata_dma_buf_setup(sata_pkt_txlate_t *spx, int flags,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7485 int (*callback)(caddr_t), caddr_t arg,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7486 ddi_dma_attr_t *cur_dma_attr)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7487 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7488 int rval;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7489 ddi_dma_cookie_t cookie;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7490 off_t offset;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7491 size_t size;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7492 int max_sg_len, req_sg_len, i;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7493 uint_t dma_flags;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7494 struct buf *bp;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7495 uint64_t max_txfer_len;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7496 uint64_t cur_txfer_len;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7497
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7498 ASSERT(spx->txlt_sata_pkt != NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7499 bp = spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7500 ASSERT(bp != NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7501
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7502
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7503 if (spx->txlt_buf_dma_handle == NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7504 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7505 * No DMA resources allocated so far - this is a first call
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7506 * for this sata pkt.
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 rval = ddi_dma_alloc_handle(SATA_DIP(spx->txlt_sata_hba_inst),
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7509 cur_dma_attr, callback, arg, &spx->txlt_buf_dma_handle);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7510
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7511 if (rval != DDI_SUCCESS) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7512 SATA_LOG_D((spx->txlt_sata_hba_inst, CE_WARN,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7513 "sata_dma_buf_setup: no buf DMA resources %x",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7514 rval));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7515 return (rval);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7516 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7517
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7518 if (bp->b_flags & B_READ)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7519 dma_flags = DDI_DMA_READ;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7520 else
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7521 dma_flags = DDI_DMA_WRITE;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7522
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7523 if (flags & PKT_CONSISTENT)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7524 dma_flags |= DDI_DMA_CONSISTENT;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7525
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7526 if (flags & PKT_DMA_PARTIAL)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7527 dma_flags |= DDI_DMA_PARTIAL;
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 rval = ddi_dma_buf_bind_handle(spx->txlt_buf_dma_handle,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7530 bp, dma_flags, callback, arg,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7531 &cookie, &spx->txlt_curwin_num_dma_cookies);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7532
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7533 switch (rval) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7534 case DDI_DMA_PARTIAL_MAP:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7535 SATADBG1(SATA_DBG_DMA_SETUP, spx->txlt_sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7536 "sata_dma_buf_setup: DMA Partial Map\n", NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7537 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7538 * Partial DMA mapping.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7539 * Retrieve number of DMA windows for this request.
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 if (ddi_dma_numwin(spx->txlt_buf_dma_handle,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7542 &spx->txlt_num_dma_win) != DDI_SUCCESS) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7543 (void) ddi_dma_unbind_handle(
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7544 spx->txlt_buf_dma_handle);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7545 (void) ddi_dma_free_handle(
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7546 &spx->txlt_buf_dma_handle);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7547 spx->txlt_buf_dma_handle = NULL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7548 SATA_LOG_D((spx->txlt_sata_hba_inst, CE_WARN,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7549 "sata_dma_buf_setup: numwin failed\n"));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7550 return (DDI_FAILURE);
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 spx->txlt_cur_dma_win = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7553 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7554
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7555 case DDI_DMA_MAPPED:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7556 /* DMA fully mapped */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7557 spx->txlt_num_dma_win = 1;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7558 spx->txlt_cur_dma_win = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7559 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7560
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7561 default:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7562 /* DMA mapping failed */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7563 (void) ddi_dma_free_handle(&spx->txlt_buf_dma_handle);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7564 spx->txlt_buf_dma_handle = NULL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7565 SATA_LOG_D((spx->txlt_sata_hba_inst, CE_WARN,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7566 "sata_dma_buf_setup: buf dma handle binding "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7567 "failed %x\n", rval));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7568 return (rval);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7569 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7570 spx->txlt_curwin_processed_dma_cookies = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7571 spx->txlt_dma_cookie_list = NULL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7572 } else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7573 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7574 * DMA setup is reused. Check if we need to process more
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7575 * cookies in current window, or to get next window, if any.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7576 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7577
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7578 ASSERT(spx->txlt_curwin_processed_dma_cookies <=
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7579 spx->txlt_curwin_num_dma_cookies);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7580
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7581 if (spx->txlt_curwin_processed_dma_cookies ==
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7582 spx->txlt_curwin_num_dma_cookies) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7583 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7584 * All cookies from current DMA window were processed.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7585 * Get next DMA window.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7586 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7587 spx->txlt_cur_dma_win++;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7588 if (spx->txlt_cur_dma_win < spx->txlt_num_dma_win) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7589 (void) ddi_dma_getwin(spx->txlt_buf_dma_handle,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7590 spx->txlt_cur_dma_win, &offset, &size,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7591 &cookie,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7592 &spx->txlt_curwin_num_dma_cookies);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7593 spx->txlt_curwin_processed_dma_cookies = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7594
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7595 } else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7596 /* No more windows! End of request! */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7597 /* What to do? - panic for now */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7598 ASSERT(spx->txlt_cur_dma_win >=
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7599 spx->txlt_num_dma_win);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7600
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7601 spx->txlt_curwin_num_dma_cookies = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7602 spx->txlt_curwin_processed_dma_cookies = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7603 spx->txlt_sata_pkt->
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7604 satapkt_cmd.satacmd_num_dma_cookies = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7605 return (DDI_SUCCESS);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7606 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7607 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7608 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7609 /* There better be at least one DMA cookie */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7610 ASSERT((spx->txlt_curwin_num_dma_cookies -
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7611 spx->txlt_curwin_processed_dma_cookies) > 0);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7612
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7613 if (spx->txlt_curwin_processed_dma_cookies == 0) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7614 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7615 * Processing a new DMA window - set-up dma cookies list.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7616 * We may reuse previously allocated cookie array if it is
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7617 * possible.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7618 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7619 if (spx->txlt_dma_cookie_list != NULL &&
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7620 spx->txlt_dma_cookie_list_len <
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7621 spx->txlt_curwin_num_dma_cookies) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7622 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7623 * New DMA window contains more cookies than
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7624 * the previous one. We need larger cookie list - free
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7625 * the old one.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7626 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7627 (void) kmem_free(spx->txlt_dma_cookie_list,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7628 spx->txlt_dma_cookie_list_len *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7629 sizeof (ddi_dma_cookie_t));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7630 spx->txlt_dma_cookie_list = NULL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7631 spx->txlt_dma_cookie_list_len = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7632 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7633 if (spx->txlt_dma_cookie_list == NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7634 /* Allocate new dma cookie array */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7635 spx->txlt_dma_cookie_list = kmem_zalloc(
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7636 sizeof (ddi_dma_cookie_t) *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7637 spx->txlt_curwin_num_dma_cookies, KM_SLEEP);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7638 spx->txlt_dma_cookie_list_len =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7639 spx->txlt_curwin_num_dma_cookies;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7640 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7641 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7642 * Copy all DMA cookies into local list, so we will know their
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7643 * dma_size in advance of setting the sata_pkt.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7644 * One cookie was already fetched, so copy it.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7645 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7646 *(&spx->txlt_dma_cookie_list[0]) = cookie;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7647 for (i = 1; i < spx->txlt_curwin_num_dma_cookies; i++) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7648 ddi_dma_nextcookie(spx->txlt_buf_dma_handle, &cookie);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7649 *(&spx->txlt_dma_cookie_list[i]) = cookie;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7650 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7651 } else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7652 SATADBG2(SATA_DBG_DMA_SETUP, spx->txlt_sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7653 "sata_dma_buf_setup: sliding within DMA window, "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7654 "cur cookie %d, total cookies %d\n",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7655 spx->txlt_curwin_processed_dma_cookies,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7656 spx->txlt_curwin_num_dma_cookies);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7657 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7658
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7659 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7660 * Set-up sata_pkt cookie list.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7661 * No single cookie transfer size would exceed max transfer size of
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7662 * an ATA command used for addressed device (tha adjustment of the dma
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7663 * attributes took care of this). But there may be more
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7664 * then one cookie, so the cmd cookie list has to be
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7665 * constrained by both a maximum scatter gather list length and
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7666 * a maximum transfer size restriction of an ATA command.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7667 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7668
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7669 max_sg_len = cur_dma_attr->dma_attr_sgllen;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7670 req_sg_len = MIN(max_sg_len,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7671 (spx->txlt_curwin_num_dma_cookies -
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7672 spx->txlt_curwin_processed_dma_cookies));
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 ASSERT(req_sg_len > 0);
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 max_txfer_len = MAX((cur_dma_attr->dma_attr_granular * 0x100),
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7677 cur_dma_attr->dma_attr_maxxfer);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7678
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7679 /* One cookie should be always available */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7680 spx->txlt_sata_pkt->satapkt_cmd.satacmd_dma_cookie_list =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7681 &spx->txlt_dma_cookie_list[spx->txlt_curwin_processed_dma_cookies];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7682
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7683 spx->txlt_sata_pkt->satapkt_cmd.satacmd_num_dma_cookies = 1;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7684
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7685 cur_txfer_len =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7686 (uint64_t)spx->txlt_dma_cookie_list[
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7687 spx->txlt_curwin_processed_dma_cookies].dmac_size;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7688
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7689 spx->txlt_curwin_processed_dma_cookies++;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7690
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7691 ASSERT(cur_txfer_len <= max_txfer_len);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7692
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7693 /* Add more cookies to the scatter-gather list */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7694 for (i = 1; i < req_sg_len; i++) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7695 if (cur_txfer_len < max_txfer_len) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7696 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7697 * Check if the next cookie could be used by
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7698 * this sata_pkt.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7699 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7700 if ((cur_txfer_len +
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7701 spx->txlt_dma_cookie_list[
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7702 spx->txlt_curwin_processed_dma_cookies].
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7703 dmac_size) <= max_txfer_len) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7704 /* Yes, transfer lenght is within bounds */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7705 spx->txlt_sata_pkt->
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7706 satapkt_cmd.satacmd_num_dma_cookies++;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7707 cur_txfer_len +=
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7708 spx->txlt_dma_cookie_list[
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7709 spx->txlt_curwin_processed_dma_cookies].
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7710 dmac_size;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7711 spx->txlt_curwin_processed_dma_cookies++;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7712 } else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7713 /* No, transfer would exceed max lenght. */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7714 SATADBG3(SATA_DBG_DMA_SETUP,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7715 spx->txlt_sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7716 "ncookies %d, size 0x%lx, "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7717 "max_size 0x%lx\n",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7718 spx->txlt_sata_pkt->
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7719 satapkt_cmd.satacmd_num_dma_cookies,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7720 cur_txfer_len, max_txfer_len);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7721 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7722 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7723 } else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7724 /* Cmd max transfer length reached */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7725 SATADBG3(SATA_DBG_DMA_SETUP, spx->txlt_sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7726 "Max transfer length? "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7727 "ncookies %d, size 0x%lx, max_size 0x%lx\n",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7728 spx->txlt_sata_pkt->
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7729 satapkt_cmd.satacmd_num_dma_cookies,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7730 cur_txfer_len, max_txfer_len);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7731 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7732 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7733 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7734
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7735 ASSERT(cur_txfer_len != 0);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7736 spx->txlt_total_residue -= cur_txfer_len;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7737
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7738 return (DDI_SUCCESS);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7739 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7740
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7741 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7742 * Fetch Device Identify data.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7743 * Send DEVICE IDENTIFY command to a device and get the device identify data.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7744 * 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
7745 * device identify command).
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7746 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7747 * Returns 0 if success, -1 otherwise.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7748 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7749 * Cannot be called in an interrupt context.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7750 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7751
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7752 static int
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7753 sata_fetch_device_identify_data(sata_hba_inst_t *sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7754 sata_drive_info_t *sdinfo)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7755 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7756 struct buf *bp;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7757 sata_pkt_t *spkt;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7758 sata_cmd_t *scmd;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7759 sata_pkt_txlate_t *spx;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7760 int rval;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7761
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7762 spx = kmem_zalloc(sizeof (sata_pkt_txlate_t), KM_SLEEP);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7763 spx->txlt_sata_hba_inst = sata_hba_inst;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7764 spx->txlt_scsi_pkt = NULL; /* No scsi pkt involved */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7765 spkt = sata_pkt_alloc(spx, SLEEP_FUNC);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7766 if (spkt == NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7767 kmem_free(spx, sizeof (sata_pkt_txlate_t));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7768 return (-1);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7769 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7770 /* address is needed now */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7771 spkt->satapkt_device.satadev_addr = sdinfo->satadrv_addr;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7772
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7773 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7774 * Allocate buffer for Identify Data return data
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7775 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7776 bp = sata_alloc_local_buffer(spx, sizeof (sata_id_t));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7777 if (bp == NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7778 sata_pkt_free(spx);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7779 kmem_free(spx, sizeof (sata_pkt_txlate_t));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7780 SATA_LOG_D((sata_hba_inst, CE_WARN,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7781 "sata_fetch_device_identify_data: "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7782 "cannot allocate buffer for ID"));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7783 return (-1);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7784 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7785
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7786 /* Fill sata_pkt */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7787 sdinfo->satadrv_state = SATA_STATE_PROBING;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7788 spkt->satapkt_device.satadev_addr = sdinfo->satadrv_addr;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7789 spkt->satapkt_op_mode = SATA_OPMODE_SYNCH | SATA_OPMODE_INTERRUPTS;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7790 /* Synchronous mode, no callback */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7791 spkt->satapkt_comp = NULL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7792 /* Timeout 30s */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7793 spkt->satapkt_time = sata_default_pkt_time;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7794
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7795 scmd = &spkt->satapkt_cmd;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7796 scmd->satacmd_bp = bp;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7797 scmd->satacmd_flags = SATA_DIR_READ | SATA_IGNORE_DEV_RESET_STATE;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7798
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7799 /* Build Identify Device cmd in the sata_pkt */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7800 scmd->satacmd_addr_type = 0; /* N/A */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7801 scmd->satacmd_sec_count_lsb = 0; /* N/A */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7802 scmd->satacmd_lba_low_lsb = 0; /* N/A */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7803 scmd->satacmd_lba_mid_lsb = 0; /* N/A */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7804 scmd->satacmd_lba_high_lsb = 0; /* N/A */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7805 scmd->satacmd_features_reg = 0; /* N/A */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7806 scmd->satacmd_device_reg = 0; /* Always device 0 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7807 if (sdinfo->satadrv_type == SATA_DTYPE_ATAPICD) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7808 /* Identify Packet Device cmd */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7809 scmd->satacmd_cmd_reg = SATAC_ID_PACKET_DEVICE;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7810 } else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7811 /* Identify Device cmd - mandatory for all other devices */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7812 scmd->satacmd_cmd_reg = SATAC_ID_DEVICE;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7813 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7814
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7815 /* Send pkt to SATA HBA driver */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7816 if ((*SATA_START_FUNC(sata_hba_inst))(SATA_DIP(sata_hba_inst), spkt) !=
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7817 SATA_TRAN_ACCEPTED ||
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7818 spkt->satapkt_reason != SATA_PKT_COMPLETED) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7819 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7820 * Woops, no Identify Data.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7821 * Invalidate sata_drive_info ?
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7822 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7823 rval = -1;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7824 } else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7825 /* Update sata_drive_info */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7826 rval = ddi_dma_sync(spx->txlt_buf_dma_handle, 0, 0,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7827 DDI_DMA_SYNC_FORKERNEL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7828 if (rval != DDI_SUCCESS) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7829 SATA_LOG_D((spx->txlt_sata_hba_inst, CE_WARN,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7830 "sata_fetch_device_identify_data: "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7831 "sync pkt failed"));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7832 rval = -1;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7833 goto fail;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7834 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7835 bcopy(bp->b_un.b_addr, &sdinfo->satadrv_id,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7836 sizeof (sata_id_t));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7837
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7838 sdinfo->satadrv_features_support = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7839 if (sdinfo->satadrv_type == SATA_DTYPE_ATADISK) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7840 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7841 * Retrieve capacity (disks only) and addressing mode
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7842 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7843 sdinfo->satadrv_capacity = sata_check_capacity(sdinfo);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7844 } else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7845 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7846 * For ATAPI devices one has to issue Get Capacity cmd
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7847 * (not needed at the moment)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7848 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7849 sdinfo->satadrv_capacity = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7850 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7851 /* Setup supported features flags */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7852 if (sdinfo->satadrv_id.ai_cap & SATA_DMA_SUPPORT)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7853 sdinfo->satadrv_features_support |= SATA_DEV_F_DMA;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7854
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7855 /* Check for NCQ support */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7856 if (sdinfo->satadrv_id.ai_satacap != 0 &&
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7857 sdinfo->satadrv_id.ai_satacap != 0xffff) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7858 /* SATA compliance */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7859 if (sdinfo->satadrv_id.ai_satacap & SATA_NCQ)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7860 sdinfo->satadrv_features_support |=
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7861 SATA_DEV_F_NCQ;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7862 if (sdinfo->satadrv_id.ai_satacap &
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7863 (SATA_1_SPEED | SATA_2_SPEED)) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7864 if (sdinfo->satadrv_id.ai_satacap &
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7865 SATA_2_SPEED)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7866 sdinfo->satadrv_features_support |=
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7867 SATA_DEV_F_SATA2;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7868 if (sdinfo->satadrv_id.ai_satacap &
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7869 SATA_1_SPEED)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7870 sdinfo->satadrv_features_support |=
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7871 SATA_DEV_F_SATA1;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7872 } else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7873 sdinfo->satadrv_features_support |=
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7874 SATA_DEV_F_SATA1;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7875 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7876 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7877
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7878 sdinfo->satadrv_queue_depth = sdinfo->satadrv_id.ai_qdepth;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7879 if (sdinfo->satadrv_id.ai_cmdset83 & SATA_RW_DMA_QUEUED_CMD)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7880 if (sdinfo->satadrv_queue_depth == 0)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7881 sdinfo->satadrv_queue_depth = 1;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7882
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7883 rval = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7884 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7885 fail:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7886 /* Free allocated resources */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7887 sata_free_local_buffer(spx);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7888 spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp = NULL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7889 sata_pkt_free(spx);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7890 kmem_free(spx, sizeof (sata_pkt_txlate_t));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7891
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7892 return (rval);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7893 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7894
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7895
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7896 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7897 * SATA spec requires that the device supports at least UDMA 4 mode and
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7898 * UDMA mode is selected.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7899 * Some devices (bridged devices) may not come-up with default UDMA mode
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7900 * set correctly, so this function is setting it.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7901 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7902 * Returns SATA_SUCCESS if proper UDMA mode is selected.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7903 * Returns SATA_FAILURE if proper UDMA mode could not be selected.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7904 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7905 static int
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7906 sata_set_udma_mode(sata_hba_inst_t *sata_hba_inst, sata_drive_info_t *sdinfo)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7907 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7908 sata_pkt_t *spkt;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7909 sata_cmd_t *scmd;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7910 sata_pkt_txlate_t *spx;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7911 int result = SATA_SUCCESS;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7912 int i, mode;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7913
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7914 ASSERT(sdinfo != NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7915 ASSERT(sata_hba_inst != NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7916
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7917 /* Find highest Ultra DMA mode supported */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7918 for (mode = 6; mode >= 0; --mode) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7919 if (sdinfo->satadrv_id.ai_ultradma & (1 << mode))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7920 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7921 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7922 if (mode < 4)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7923 return (SATA_FAILURE);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7924
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7925 /* Find UDMA mode currently selected */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7926 for (i = 6; i >= 0; --i) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7927 if (sdinfo->satadrv_id.ai_ultradma & (1 << (i + 8)))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7928 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7929 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7930
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7931 if (i < mode) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7932 /* Set UDMA mode via SET FEATURES COMMAND */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7933 /* Prepare packet for SET FEATURES COMMAND */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7934 spx = kmem_zalloc(sizeof (sata_pkt_txlate_t), KM_SLEEP);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7935 spx->txlt_sata_hba_inst = sata_hba_inst;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7936 spx->txlt_scsi_pkt = NULL; /* No scsi pkt involved */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7937 spkt = sata_pkt_alloc(spx, SLEEP_FUNC);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7938 if (spkt == NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7939 result = SATA_FAILURE;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7940 goto failure;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7941 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7942 /* Fill sata_pkt */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7943 spkt->satapkt_device.satadev_addr = sdinfo->satadrv_addr;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7944 /* Timeout 30s */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7945 spkt->satapkt_time = sata_default_pkt_time;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7946 /* Synchronous mode, no callback, interrupts */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7947 spkt->satapkt_op_mode =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7948 SATA_OPMODE_SYNCH | SATA_OPMODE_INTERRUPTS;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7949 spkt->satapkt_comp = NULL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7950 scmd = &spkt->satapkt_cmd;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7951 scmd->satacmd_flags = SATA_DIR_NODATA_XFER |
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7952 SATA_IGNORE_DEV_RESET_STATE;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7953 scmd->satacmd_addr_type = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7954 scmd->satacmd_device_reg = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7955 scmd->satacmd_status_reg = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7956 scmd->satacmd_error_reg = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7957 scmd->satacmd_cmd_reg = SATAC_SET_FEATURES;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7958 scmd->satacmd_features_reg = SATAC_SF_TRANSFER_MODE;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7959 scmd->satacmd_sec_count_lsb =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7960 SATAC_TRANSFER_MODE_ULTRA_DMA | mode;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7961
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7962 /* Transfer command to HBA */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7963 if ((*SATA_START_FUNC(sata_hba_inst))(SATA_DIP(sata_hba_inst),
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7964 spkt) != SATA_TRAN_ACCEPTED ||
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7965 spkt->satapkt_reason != SATA_PKT_COMPLETED) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7966 /* Pkt execution failed */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7967 result = SATA_FAILURE;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7968 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7969 failure:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7970 if (result == SATA_FAILURE)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7971 SATA_LOG_D((sata_hba_inst, CE_WARN,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7972 "sata_set_udma_mode: could not set UDMA "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7973 "mode %", mode));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7974
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7975 /* Free allocated resources */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7976 if (spkt != NULL)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7977 sata_pkt_free(spx);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7978 (void) kmem_free(spx, sizeof (sata_pkt_txlate_t));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7979 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7980 return (result);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7981 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7982
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7983
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7984 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7985 * Update port SCR block
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7986 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7987 static void
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7988 sata_update_port_scr(sata_port_scr_t *port_scr, sata_device_t *device)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7989 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7990 port_scr->sstatus = device->satadev_scr.sstatus;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7991 port_scr->serror = device->satadev_scr.serror;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7992 port_scr->scontrol = device->satadev_scr.scontrol;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7993 port_scr->sactive = device->satadev_scr.sactive;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7994 port_scr->snotific = device->satadev_scr.snotific;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7995 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7996
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7997 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7998 * Update state and copy port ss* values from passed sata_device structure.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7999 * 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
8000 * configuration struct.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8001 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8002 * 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
8003 * regardless of the state in device argument.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8004 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8005 * Port mutex should be held while calling this function.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8006 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8007 static void
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8008 sata_update_port_info(sata_hba_inst_t *sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8009 sata_device_t *sata_device)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8010 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8011 ASSERT(mutex_owned(&SATA_CPORT_MUTEX(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8012 sata_device->satadev_addr.cport)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8013
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8014 if (sata_device->satadev_addr.qual == SATA_ADDR_CPORT ||
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8015 sata_device->satadev_addr.qual == SATA_ADDR_DCPORT) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8016
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8017 sata_cport_info_t *cportinfo;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8018
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8019 if (SATA_NUM_CPORTS(sata_hba_inst) <=
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8020 sata_device->satadev_addr.cport)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8021 return;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8022
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8023 cportinfo = SATA_CPORT_INFO(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8024 sata_device->satadev_addr.cport);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8025 sata_update_port_scr(&cportinfo->cport_scr, sata_device);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8026
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8027 /* Preserve SATA_PSTATE_SHUTDOWN flag */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8028 cportinfo->cport_state &= ~(SATA_PSTATE_PWRON |
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8029 SATA_PSTATE_PWROFF | SATA_PSTATE_FAILED);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8030 cportinfo->cport_state |=
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8031 sata_device->satadev_state & SATA_PSTATE_VALID;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8032 } else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8033 sata_pmport_info_t *pmportinfo;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8034
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8035 if ((sata_device->satadev_addr.qual != SATA_ADDR_PMPORT) ||
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8036 (sata_device->satadev_addr.qual != SATA_ADDR_DPMPORT) ||
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8037 SATA_NUM_PMPORTS(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8038 sata_device->satadev_addr.cport) <
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8039 sata_device->satadev_addr.pmport)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8040 return;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8041
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8042 pmportinfo = SATA_PMPORT_INFO(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8043 sata_device->satadev_addr.cport,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8044 sata_device->satadev_addr.pmport);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8045 sata_update_port_scr(&pmportinfo->pmport_scr, sata_device);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8046
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8047 /* Preserve SATA_PSTATE_SHUTDOWN flag */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8048 pmportinfo->pmport_state &=
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8049 ~(SATA_PSTATE_PWRON | SATA_PSTATE_PWROFF |
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8050 SATA_PSTATE_FAILED);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8051 pmportinfo->pmport_state |=
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8052 sata_device->satadev_state & SATA_PSTATE_VALID;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8053 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8054 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8055
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8056
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8057
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8058 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8059 * Extract SATA port specification from an IOCTL argument.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8060 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8061 * 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
8062 * cannot retrieve port spec, then -1 is returned.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8063 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8064 * Note: Only cport - no port multiplier port.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8065 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8066 static int32_t
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8067 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
8068 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8069 int32_t port;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8070
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8071 /* Extract port number from nvpair in dca structure */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8072 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
8073 SATA_LOG_D((sata_hba_inst, CE_NOTE,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8074 "sata_get_port_num: invalid port spec 0x%x in ioctl",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8075 port));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8076 port = -1;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8077 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8078
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8079 return (port);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8080 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8081
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8082 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8083 * 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
8084 * NOTE: target argument is a value used in ioctls to identify
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8085 * the AP - it is not a sata_address.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8086 * It is a combination of cport, pmport and address qualifier, encodded same
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8087 * way as a scsi target number.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8088 * At this moment it carries only cport number.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8089 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8090 * No PMult hotplug support.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8091 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8092 * Returns dev_info_t pointer if target device was found, NULL otherwise.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8093 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8094
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8095 static dev_info_t *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8096 sata_get_target_dip(dev_info_t *dip, int32_t port)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8097 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8098 dev_info_t *cdip = NULL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8099 int target, tgt;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8100 int ncport;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8101 int circ;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8102
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8103 ncport = port & SATA_CFGA_CPORT_MASK;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8104 target = SATA_TO_SCSI_TARGET(ncport, 0, SATA_ADDR_DCPORT);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8105
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8106 ndi_devi_enter(dip, &circ);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8107 for (cdip = ddi_get_child(dip); cdip != NULL; ) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8108 dev_info_t *next = ddi_get_next_sibling(cdip);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8109
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8110 tgt = ddi_prop_get_int(DDI_DEV_T_ANY, cdip,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8111 DDI_PROP_DONTPASS, "target", -1);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8112 if (tgt == -1) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8113 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8114 * This is actually an error condition, but not
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8115 * a fatal one. Just continue the search.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8116 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8117 cdip = next;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8118 continue;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8119 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8120
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8121 if (tgt == target)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8122 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8123
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8124 cdip = next;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8125 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8126 ndi_devi_exit(dip, circ);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8127
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8128 return (cdip);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8129 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8130
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8131
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8132 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8133 * sata_cfgadm_state:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8134 * 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
8135 * the cfgadm_state.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8136 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8137 * The port argument is a value with encoded cport,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8138 * 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
8139 * SCSI_TO_SATA_CPORT macro extracts cport number,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8140 * SCSI_TO_SATA_PMPORT extracts pmport number and
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8141 * SCSI_TO_SATA_ADDR_QUAL extracts port mulitplier qualifier flag.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8142 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8143 * For now, support is for cports only - no pmultiplier ports.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8144 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8145
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8146 static void
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8147 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
8148 devctl_ap_state_t *ap_state)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8149 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8150 uint16_t cport;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8151 int port_state;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8152
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8153 /* Cport only */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8154 cport = SCSI_TO_SATA_CPORT(port);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8155
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8156 port_state = SATA_CPORT_STATE(sata_hba_inst, cport);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8157 if (port_state & SATA_PSTATE_SHUTDOWN ||
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8158 port_state & SATA_PSTATE_FAILED) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8159 ap_state->ap_rstate = AP_RSTATE_DISCONNECTED;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8160 ap_state->ap_ostate = AP_OSTATE_UNCONFIGURED;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8161 if (port_state & SATA_PSTATE_FAILED)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8162 ap_state->ap_condition = AP_COND_FAILED;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8163 else
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8164 ap_state->ap_condition = AP_COND_UNKNOWN;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8165
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8166 return;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8167 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8168
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8169 /* Need to check pmult device port here as well, when supported */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8170
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8171 /* Port is enabled and ready */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8172
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8173 switch (SATA_CPORT_DEV_TYPE(sata_hba_inst, cport)) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8174 case SATA_DTYPE_NONE:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8175 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8176 /* No device attached */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8177 ap_state->ap_rstate = AP_RSTATE_EMPTY;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8178 ap_state->ap_ostate = AP_OSTATE_UNCONFIGURED;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8179 ap_state->ap_condition = AP_COND_OK;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8180 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8181 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8182 case SATA_DTYPE_UNKNOWN:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8183 case SATA_DTYPE_ATAPINONCD:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8184 case SATA_DTYPE_PMULT: /* Until PMult is supported */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8185 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8186 /* Unknown device attached */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8187 ap_state->ap_rstate = AP_RSTATE_CONNECTED;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8188 ap_state->ap_ostate = AP_OSTATE_UNCONFIGURED;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8189 ap_state->ap_condition = AP_COND_UNKNOWN;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8190 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8191 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8192 case SATA_DTYPE_ATADISK:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8193 case SATA_DTYPE_ATAPICD:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8194 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8195 dev_info_t *tdip = NULL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8196 dev_info_t *dip = NULL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8197 int circ;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8198
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8199 dip = SATA_DIP(sata_hba_inst);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8200 tdip = sata_get_target_dip(dip, port);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8201 ap_state->ap_rstate = AP_RSTATE_CONNECTED;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8202 if (tdip != NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8203 ndi_devi_enter(dip, &circ);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8204 mutex_enter(&(DEVI(tdip)->devi_lock));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8205 if ((DEVI_IS_DEVICE_OFFLINE(tdip)) ||
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8206 (DEVI_IS_DEVICE_DOWN(tdip))) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8207 ap_state->ap_ostate = AP_OSTATE_UNCONFIGURED;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8208 } else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8209 ap_state->ap_ostate = AP_OSTATE_CONFIGURED;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8210 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8211 ap_state->ap_condition = AP_COND_OK;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8212 mutex_exit(&(DEVI(tdip)->devi_lock));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8213 ndi_devi_exit(dip, circ);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8214 } else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8215 ap_state->ap_ostate = AP_OSTATE_UNCONFIGURED;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8216 ap_state->ap_condition = AP_COND_UNKNOWN;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8217 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8218 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8219 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8220 default:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8221 ap_state->ap_rstate = AP_RSTATE_CONNECTED;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8222 ap_state->ap_ostate = AP_OSTATE_UNCONFIGURED;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8223 ap_state->ap_condition = AP_COND_UNKNOWN;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8224 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8225 * This is actually internal error condition (non fatal),
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8226 * beacuse we already checked all defined device types.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8227 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8228 SATA_LOG_D((sata_hba_inst, CE_WARN,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8229 "sata_cfgadm_state: Internal error: "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8230 "unknown device type"));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8231 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8232 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8233 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8234
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8235 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8236 * Start or terminate the thread, depending on flag arg and current state
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8237 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8238 static void
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8239 sata_event_thread_control(int startstop)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8240 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8241 static int sata_event_thread_terminating = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8242 static int sata_event_thread_starting = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8243 int i;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8244
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8245 mutex_enter(&sata_event_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8246
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8247 if (startstop == 0 && (sata_event_thread_starting == 1 ||
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8248 sata_event_thread_terminating == 1)) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8249 mutex_exit(&sata_event_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8250 return;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8251 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8252 if (startstop == 1 && sata_event_thread_starting == 1) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8253 mutex_exit(&sata_event_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8254 return;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8255 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8256 if (startstop == 1 && sata_event_thread_terminating == 1) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8257 sata_event_thread_starting = 1;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8258 /* wait til terminate operation completes */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8259 i = SATA_EVNT_DAEMON_TERM_WAIT/SATA_EVNT_DAEMON_TERM_TIMEOUT;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8260 while (sata_event_thread_terminating == 1) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8261 if (i-- <= 0) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8262 sata_event_thread_starting = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8263 mutex_exit(&sata_event_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8264 #ifdef SATA_DEBUG
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8265 cmn_err(CE_WARN, "sata_event_thread_control: "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8266 "timeout waiting for thread to terminate");
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8267 #endif
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8268 return;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8269 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8270 mutex_exit(&sata_event_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8271 delay(drv_usectohz(SATA_EVNT_DAEMON_TERM_TIMEOUT));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8272 mutex_enter(&sata_event_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8273 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8274 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8275 if (startstop == 1) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8276 if (sata_event_thread == NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8277 sata_event_thread = thread_create(NULL, 0,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8278 (void (*)())sata_event_daemon,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8279 &sata_hba_list, 0, &p0, TS_RUN, minclsyspri);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8280 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8281 sata_event_thread_starting = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8282 mutex_exit(&sata_event_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8283 return;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8284 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8285
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8286 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8287 * If we got here, thread may need to be terminated
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8288 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8289 if (sata_event_thread != NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8290 int i;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8291 /* Signal event thread to go away */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8292 sata_event_thread_terminating = 1;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8293 sata_event_thread_terminate = 1;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8294 cv_signal(&sata_event_cv);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8295 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8296 * Wait til daemon terminates.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8297 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8298 i = SATA_EVNT_DAEMON_TERM_WAIT/SATA_EVNT_DAEMON_TERM_TIMEOUT;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8299 while (sata_event_thread_terminate == 1) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8300 mutex_exit(&sata_event_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8301 if (i-- <= 0) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8302 /* Daemon did not go away !!! */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8303 #ifdef SATA_DEBUG
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8304 cmn_err(CE_WARN, "sata_event_thread_control: "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8305 "cannot terminate event daemon thread");
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8306 #endif
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8307 mutex_enter(&sata_event_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8308 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8309 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8310 delay(drv_usectohz(SATA_EVNT_DAEMON_TERM_TIMEOUT));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8311 mutex_enter(&sata_event_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8312 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8313 sata_event_thread_terminating = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8314 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8315 ASSERT(sata_event_thread_terminating == 0);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8316 ASSERT(sata_event_thread_starting == 0);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8317 mutex_exit(&sata_event_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8318 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8319
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8320
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8321 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8322 * Log sata message
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8323 * dev pathname msg line preceeds the logged message.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8324 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8325
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8326 static void
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8327 sata_log(sata_hba_inst_t *sata_hba_inst, uint_t level, char *fmt, ...)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8328 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8329 char pathname[128];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8330 dev_info_t *dip;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8331 va_list ap;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8332
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8333 mutex_enter(&sata_log_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8334
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8335 va_start(ap, fmt);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8336 (void) vsprintf(sata_log_buf, fmt, ap);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8337 va_end(ap);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8338
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8339 if (sata_hba_inst != NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8340 dip = SATA_DIP(sata_hba_inst);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8341 (void) ddi_pathname(dip, pathname);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8342 } else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8343 pathname[0] = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8344 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8345 if (level == CE_CONT) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8346 if (sata_debug_flags == 0)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8347 cmn_err(level, "?%s:\n %s\n", pathname, sata_log_buf);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8348 else
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8349 cmn_err(level, "%s:\n %s\n", pathname, sata_log_buf);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8350 } else
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8351 cmn_err(level, "%s:\n %s", pathname, sata_log_buf);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8352
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8353 mutex_exit(&sata_log_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8354 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8355
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8356
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8357 /* ******** Asynchronous HBA events handling & hotplugging support ******** */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8358
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8359 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8360 * SATA HBA event notification function.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8361 * 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
8362 * a port and/or device state or a controller itself.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8363 * Events for different addresses/addr types cannot be combined.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8364 * A warning message is generated for each event type.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8365 * Events are not processed by this function, so only the
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8366 * 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
8367 * waken up. Event daemon thread processes all events.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8368 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8369 * 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
8370 * cannot determine a sequence of events when opposite event are reported, eg.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8371 * LINK_LOST and LINK_ESTABLISHED. Actual port status during event processing
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8372 * is taking precedence over reported events, i.e. may cause ignoring some
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8373 * events.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8374 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8375 #define SATA_EVENT_MAX_MSG_LENGTH 79
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8376
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8377 void
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8378 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
8379 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8380 sata_hba_inst_t *sata_hba_inst = NULL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8381 sata_address_t *saddr;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8382 sata_drive_info_t *sdinfo;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8383 sata_port_stats_t *pstats;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8384 int cport, pmport;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8385 char buf1[SATA_EVENT_MAX_MSG_LENGTH + 1];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8386 char buf2[SATA_EVENT_MAX_MSG_LENGTH + 1];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8387 char *lcp;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8388 static char *err_msg_evnt_1 =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8389 "sata_hba_event_notify: invalid port event 0x%x ";
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8390 static char *err_msg_evnt_2 =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8391 "sata_hba_event_notify: invalid device event 0x%x ";
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8392 int linkevent;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8393
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8394 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8395 * There is a possibility that an event will be generated on HBA
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8396 * that has not completed attachment or is detaching.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8397 * HBA driver should prevent this, but just in case it does not,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8398 * we need to ignore events for such HBA.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8399 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8400 mutex_enter(&sata_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8401 for (sata_hba_inst = sata_hba_list; sata_hba_inst != NULL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8402 sata_hba_inst = sata_hba_inst->satahba_next) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8403 if (SATA_DIP(sata_hba_inst) == dip)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8404 if (sata_hba_inst->satahba_attached == 1)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8405 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8406 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8407 mutex_exit(&sata_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8408 if (sata_hba_inst == NULL)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8409 /* HBA not attached */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8410 return;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8411
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8412 ASSERT(sata_device != NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8413
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8414 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8415 * Validate address before - do not proceed with invalid address.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8416 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8417 saddr = &sata_device->satadev_addr;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8418 if (saddr->cport >= SATA_NUM_CPORTS(sata_hba_inst))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8419 return;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8420 if (saddr->qual == SATA_ADDR_PMPORT ||
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8421 saddr->qual == SATA_ADDR_DPMPORT)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8422 /* Port Multiplier not supported yet */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8423 return;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8424
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8425 cport = saddr->cport;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8426 pmport = saddr->pmport;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8427
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8428 buf1[0] = buf2[0] = '\0';
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8429
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8430 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8431 * Events refer to devices, ports and controllers - each has
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8432 * unique address. Events for different addresses cannot be combined.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8433 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8434 if (saddr->qual & (SATA_ADDR_CPORT | SATA_ADDR_PMPORT)) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8435
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8436 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8437
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8438 /* qualify this event(s) */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8439 if ((event & SATA_EVNT_PORT_EVENTS) == 0) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8440 /* Invalid event for the device port */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8441 (void) sprintf(buf2, err_msg_evnt_1,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8442 event & SATA_EVNT_PORT_EVENTS);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8443 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8444 goto event_info;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8445 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8446 if (saddr->qual == SATA_ADDR_CPORT) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8447 /* Controller's device port event */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8448
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8449 (SATA_CPORT_INFO(sata_hba_inst, cport))->
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8450 cport_event_flags |=
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8451 event & SATA_EVNT_PORT_EVENTS;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8452 pstats =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8453 &(SATA_CPORT_INFO(sata_hba_inst, cport))->
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8454 cport_stats;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8455 } else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8456 /* Port multiplier's device port event */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8457 (SATA_PMPORT_INFO(sata_hba_inst, cport, pmport))->
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8458 pmport_event_flags |=
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8459 event & SATA_EVNT_PORT_EVENTS;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8460 pstats =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8461 &(SATA_PMPORT_INFO(sata_hba_inst, cport, pmport))->
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8462 pmport_stats;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8463 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8464
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8465 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8466 * Add to statistics and log the message. We have to do it
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8467 * here rather than in the event daemon, because there may be
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8468 * multiple events occuring before they are processed.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8469 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8470 linkevent = event &
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8471 (SATA_EVNT_LINK_LOST | SATA_EVNT_LINK_ESTABLISHED);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8472 if (linkevent) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8473 if (linkevent == (SATA_EVNT_LINK_LOST |
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8474 SATA_EVNT_LINK_ESTABLISHED)) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8475 /* This is likely event combination */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8476 (void) strlcat(buf1, "link lost/established, ",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8477 SATA_EVENT_MAX_MSG_LENGTH);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8478
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8479 if (pstats->link_lost < 0xffffffffffffffff)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8480 pstats->link_lost++;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8481 if (pstats->link_established <
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8482 0xffffffffffffffff)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8483 pstats->link_established++;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8484 linkevent = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8485 } else if (linkevent & SATA_EVNT_LINK_LOST) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8486 (void) strlcat(buf1, "link lost, ",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8487 SATA_EVENT_MAX_MSG_LENGTH);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8488
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8489 if (pstats->link_lost < 0xffffffffffffffff)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8490 pstats->link_lost++;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8491 } else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8492 (void) strlcat(buf1, "link established, ",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8493 SATA_EVENT_MAX_MSG_LENGTH);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8494 if (pstats->link_established <
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8495 0xffffffffffffffff)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8496 pstats->link_established++;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8497 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8498 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8499 if (event & SATA_EVNT_DEVICE_ATTACHED) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8500 (void) strlcat(buf1, "device attached, ",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8501 SATA_EVENT_MAX_MSG_LENGTH);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8502 if (pstats->device_attached < 0xffffffffffffffff)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8503 pstats->device_attached++;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8504 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8505 if (event & SATA_EVNT_DEVICE_DETACHED) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8506 (void) strlcat(buf1, "device detached, ",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8507 SATA_EVENT_MAX_MSG_LENGTH);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8508 if (pstats->device_detached < 0xffffffffffffffff)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8509 pstats->device_detached++;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8510 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8511 if (event & SATA_EVNT_PWR_LEVEL_CHANGED) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8512 SATADBG1(SATA_DBG_EVENTS, sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8513 "port %d power level changed", cport);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8514 if (pstats->port_pwr_changed < 0xffffffffffffffff)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8515 pstats->port_pwr_changed++;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8516 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8517
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8518 if ((event & ~SATA_EVNT_PORT_EVENTS) != 0) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8519 /* There should be no other events for this address */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8520 (void) sprintf(buf2, err_msg_evnt_1,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8521 event & ~SATA_EVNT_PORT_EVENTS);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8522 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8523 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8524
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8525 } else if (saddr->qual & (SATA_ADDR_DCPORT | SATA_ADDR_DPMPORT)) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8526 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8527
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8528 /* qualify this event */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8529 if ((event & SATA_EVNT_DEVICE_RESET) == 0) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8530 /* Invalid event for a device */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8531 (void) sprintf(buf2, err_msg_evnt_2,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8532 event & SATA_EVNT_DEVICE_RESET);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8533 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8534 goto event_info;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8535 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8536 /* drive event */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8537 sdinfo = sata_get_device_info(sata_hba_inst, sata_device);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8538 if (sdinfo != NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8539 if (event & SATA_EVNT_DEVICE_RESET) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8540 (void) strlcat(buf1, "device reset, ",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8541 SATA_EVENT_MAX_MSG_LENGTH);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8542 if (sdinfo->satadrv_stats.drive_reset <
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8543 0xffffffffffffffff)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8544 sdinfo->satadrv_stats.drive_reset++;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8545 sdinfo->satadrv_event_flags |=
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8546 SATA_EVNT_DEVICE_RESET;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8547 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8548 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8549 if ((event & ~SATA_EVNT_DEVICE_RESET) != 0) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8550 /* Invalid event for a device */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8551 (void) sprintf(buf2, err_msg_evnt_2,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8552 event & ~SATA_EVNT_DRIVE_EVENTS);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8553 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8554 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8555 } else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8556 if (saddr->qual != SATA_ADDR_NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8557 /* Wrong address qualifier */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8558 SATA_LOG_D((sata_hba_inst, CE_WARN,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8559 "sata_hba_event_notify: invalid address 0x%x",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8560 *(uint32_t *)saddr));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8561 return;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8562 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8563 if ((event & SATA_EVNT_CONTROLLER_EVENTS) == 0 ||
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8564 (event & ~SATA_EVNT_CONTROLLER_EVENTS) != 0) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8565 /* Invalid event for the controller */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8566 SATA_LOG_D((sata_hba_inst, CE_WARN,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8567 "sata_hba_event_notify: invalid event 0x%x for "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8568 "controller",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8569 event & SATA_EVNT_CONTROLLER_EVENTS));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8570 return;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8571 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8572 buf1[0] = '\0';
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8573 /* This may be a frequent and not interesting event */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8574 SATADBG1(SATA_DBG_EVENTS, sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8575 "controller power level changed\n", NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8576
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8577 mutex_enter(&sata_hba_inst->satahba_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8578 if (sata_hba_inst->satahba_stats.ctrl_pwr_change <
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8579 0xffffffffffffffff)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8580 sata_hba_inst->satahba_stats.ctrl_pwr_change++;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8581
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8582 sata_hba_inst->satahba_event_flags |=
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8583 SATA_EVNT_PWR_LEVEL_CHANGED;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8584 mutex_exit(&sata_hba_inst->satahba_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8585 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8586 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8587 * If we got here, there is something to do with this HBA
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8588 * instance.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8589 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8590 mutex_enter(&sata_hba_inst->satahba_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8591 sata_hba_inst->satahba_event_flags |= SATA_EVNT_MAIN;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8592 mutex_exit(&sata_hba_inst->satahba_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8593 mutex_enter(&sata_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8594 sata_event_pending |= SATA_EVNT_MAIN; /* global event indicator */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8595 mutex_exit(&sata_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8596
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8597 /* Tickle event thread */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8598 mutex_enter(&sata_event_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8599 if (sata_event_thread_active == 0)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8600 cv_signal(&sata_event_cv);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8601 mutex_exit(&sata_event_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8602
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8603 event_info:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8604 if (buf1[0] != '\0') {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8605 lcp = strrchr(buf1, ',');
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8606 if (lcp != NULL)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8607 *lcp = '\0';
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8608 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8609 if (saddr->qual == SATA_ADDR_CPORT ||
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8610 saddr->qual == SATA_ADDR_DCPORT) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8611 if (buf1[0] != '\0') {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8612 sata_log(sata_hba_inst, CE_NOTE, "port %d: %s\n",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8613 cport, buf1);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8614 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8615 if (buf2[0] != '\0') {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8616 sata_log(sata_hba_inst, CE_NOTE, "port %d: %s\n",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8617 cport, buf2);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8618 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8619 } else if (saddr->qual == SATA_ADDR_PMPORT ||
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8620 saddr->qual == SATA_ADDR_DPMPORT) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8621 if (buf1[0] != '\0') {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8622 sata_log(sata_hba_inst, CE_NOTE,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8623 "port %d pmport %d: %s\n", cport, pmport, buf1);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8624 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8625 if (buf2[0] != '\0') {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8626 sata_log(sata_hba_inst, CE_NOTE,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8627 "port %d pmport %d: %s\n", cport, pmport, buf2);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8628 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8629 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8630 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8631
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8632
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8633 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8634 * Event processing thread.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8635 * Arg is a pointer to the sata_hba_list pointer.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8636 * 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
8637 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8638 static void
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8639 sata_event_daemon(void *arg)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8640 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8641 #ifndef __lock_lint
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8642 _NOTE(ARGUNUSED(arg))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8643 #endif
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8644 sata_hba_inst_t *sata_hba_inst;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8645 clock_t lbolt;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8646
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8647 SATADBG1(SATA_DBG_EVENTS_DAEMON, NULL,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8648 "SATA event daemon started\n", NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8649 loop:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8650 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8651 * Process events here. Walk through all registered HBAs
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8652 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8653 mutex_enter(&sata_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8654 for (sata_hba_inst = sata_hba_list; sata_hba_inst != NULL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8655 sata_hba_inst = sata_hba_inst->satahba_next) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8656 ASSERT(sata_hba_inst != NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8657 mutex_enter(&sata_hba_inst->satahba_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8658 if (sata_hba_inst->satahba_attached != 1 ||
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8659 (sata_hba_inst->satahba_event_flags &
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8660 SATA_EVNT_SKIP) != 0) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8661 mutex_exit(&sata_hba_inst->satahba_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8662 continue;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8663 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8664 if (sata_hba_inst->satahba_event_flags & SATA_EVNT_MAIN) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8665 sata_hba_inst->satahba_event_flags |= SATA_EVNT_SKIP;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8666 mutex_exit(&sata_hba_inst->satahba_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8667 mutex_exit(&sata_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8668 /* Got the controller with pending event */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8669 sata_process_controller_events(sata_hba_inst);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8670 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8671 * Since global mutex was released, there is a
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8672 * possibility that HBA list has changed, so start
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8673 * over from the top. Just processed controller
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8674 * will be passed-over because of the SKIP flag.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8675 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8676 goto loop;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8677 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8678 mutex_exit(&sata_hba_inst->satahba_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8679 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8680 /* Clear SKIP flag in all controllers */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8681 for (sata_hba_inst = sata_hba_list; sata_hba_inst != NULL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8682 sata_hba_inst = sata_hba_inst->satahba_next) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8683 mutex_enter(&sata_hba_inst->satahba_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8684 sata_hba_inst->satahba_event_flags &= ~SATA_EVNT_SKIP;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8685 mutex_exit(&sata_hba_inst->satahba_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8686 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8687 mutex_exit(&sata_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8688
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8689 SATADBG1(SATA_DBG_EVENTS_DAEMON, NULL,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8690 "SATA EVENT DAEMON suspending itself", NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8691
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8692 #ifdef SATA_DEBUG
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8693 if ((sata_func_enable & SATA_ENABLE_PROCESS_EVENTS) == 0) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8694 sata_log(sata_hba_inst, CE_WARN,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8695 "SATA EVENTS PROCESSING DISABLED\n");
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8696 thread_exit(); /* Daemon will not run again */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8697 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8698 #endif
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8699 mutex_enter(&sata_event_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8700 sata_event_thread_active = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8701 mutex_exit(&sata_event_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8702 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8703 * 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
8704 * wait timeout. Exit if there is a termination request (driver
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8705 * unload).
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8706 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8707 do {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8708 lbolt = ddi_get_lbolt();
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8709 lbolt += drv_usectohz(SATA_EVNT_DAEMON_SLEEP_TIME);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8710 mutex_enter(&sata_event_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8711 (void) cv_timedwait(&sata_event_cv, &sata_event_mutex, lbolt);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8712
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8713 if (sata_event_thread_active != 0) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8714 mutex_exit(&sata_event_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8715 continue;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8716 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8717
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8718 /* Check if it is time to go away */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8719 if (sata_event_thread_terminate == 1) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8720 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8721 * It is up to the thread setting above flag to make
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8722 * sure that this thread is not killed prematurely.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8723 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8724 sata_event_thread_terminate = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8725 sata_event_thread = NULL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8726 mutex_exit(&sata_event_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8727 SATADBG1(SATA_DBG_EVENTS_DAEMON, NULL,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8728 "SATA_EVENT_DAEMON_TERMINATING", NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8729 thread_exit(); { _NOTE(NOT_REACHED) }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8730 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8731 mutex_exit(&sata_event_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8732 } while (!(sata_event_pending & SATA_EVNT_MAIN));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8733
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8734 mutex_enter(&sata_event_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8735 sata_event_thread_active = 1;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8736 mutex_exit(&sata_event_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8737
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8738 mutex_enter(&sata_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8739 sata_event_pending &= ~SATA_EVNT_MAIN;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8740 mutex_exit(&sata_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8741
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8742 SATADBG1(SATA_DBG_EVENTS_DAEMON, NULL,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8743 "SATA EVENT DAEMON READY TO PROCESS EVENT", NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8744
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8745 goto loop;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8746 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8747
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8748 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8749 * Specific HBA instance event processing.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8750 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8751 * NOTE: At the moment, device event processing is limited to hard disks
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8752 * only.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8753 * cports only are supported - no pmports.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8754 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8755 static void
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8756 sata_process_controller_events(sata_hba_inst_t *sata_hba_inst)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8757 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8758 int ncport;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8759 uint32_t event_flags;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8760 sata_address_t *saddr;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8761
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8762 SATADBG1(SATA_DBG_EVENTS_CNTRL, sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8763 "Processing controller %d event(s)",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8764 ddi_get_instance(SATA_DIP(sata_hba_inst)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8765
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8766 mutex_enter(&sata_hba_inst->satahba_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8767 sata_hba_inst->satahba_event_flags &= ~SATA_EVNT_MAIN;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8768 event_flags = sata_hba_inst->satahba_event_flags;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8769 mutex_exit(&sata_hba_inst->satahba_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8770 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8771 * Process controller power change first
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8772 * HERE
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8773 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8774 if (event_flags & SATA_EVNT_PWR_LEVEL_CHANGED)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8775 sata_process_cntrl_pwr_level_change(sata_hba_inst);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8776
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8777 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8778 * Search through ports/devices to identify affected port/device.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8779 * We may have to process events for more than one port/device.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8780 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8781 for (ncport = 0; ncport < SATA_NUM_CPORTS(sata_hba_inst); ncport++) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8782 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst, ncport)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8783 event_flags = (SATA_CPORT_INFO(sata_hba_inst, ncport))->
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8784 cport_event_flags;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8785 /* Check if port was locked by IOCTL processing */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8786 if (event_flags & SATA_APCTL_LOCK_PORT_BUSY) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8787 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8788 * We ignore port events because port is busy
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8789 * with AP control processing. Set again
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8790 * controller and main event flag, so that
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8791 * events may be processed by the next daemon
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8792 * run.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8793 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8794 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, ncport)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8795 mutex_enter(&sata_hba_inst->satahba_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8796 sata_hba_inst->satahba_event_flags |= SATA_EVNT_MAIN;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8797 mutex_exit(&sata_hba_inst->satahba_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8798 mutex_enter(&sata_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8799 sata_event_pending |= SATA_EVNT_MAIN;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8800 mutex_exit(&sata_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8801 SATADBG1(SATA_DBG_EVENTS_PROCPST, sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8802 "Event processing postponed until "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8803 "AP control processing completes",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8804 NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8805 /* Check other ports */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8806 continue;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8807 } else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8808 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8809 * Set BSY flag so that AP control would not
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8810 * interfere with events processing for
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8811 * this port.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8812 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8813 (SATA_CPORT_INFO(sata_hba_inst, ncport))->
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8814 cport_event_flags |= SATA_EVNT_LOCK_PORT_BUSY;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8815 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8816 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, ncport)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8817
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8818 saddr = &(SATA_CPORT_INFO(sata_hba_inst, ncport))->cport_addr;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8819
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8820 if ((event_flags &
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8821 (SATA_EVNT_PORT_EVENTS | SATA_EVNT_DRIVE_EVENTS)) != 0) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8822 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8823 * Got port event.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8824 * We need some hierarchy of event processing as they
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8825 * are affecting each other:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8826 * 1. port failed
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8827 * 2. device detached/attached
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8828 * 3. link events - link events may trigger device
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8829 * detached or device attached events in some
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8830 * circumstances.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8831 * 4. port power level changed
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8832 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8833 if (event_flags & SATA_EVNT_PORT_FAILED) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8834 sata_process_port_failed_event(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8835 saddr);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8836 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8837 if (event_flags & SATA_EVNT_DEVICE_DETACHED) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8838 sata_process_device_detached(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8839 saddr);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8840 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8841 if (event_flags & SATA_EVNT_DEVICE_ATTACHED) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8842 sata_process_device_attached(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8843 saddr);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8844 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8845 if (event_flags &
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8846 (SATA_EVNT_LINK_ESTABLISHED |
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8847 SATA_EVNT_LINK_LOST)) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8848 sata_process_port_link_events(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8849 saddr);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8850 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8851 if (event_flags & SATA_EVNT_PWR_LEVEL_CHANGED) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8852 sata_process_port_pwr_change(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8853 saddr);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8854 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8855 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8856 if (SATA_CPORT_DEV_TYPE(sata_hba_inst, ncport) !=
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8857 SATA_DTYPE_NONE) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8858 /* May have device event */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8859 sata_process_device_reset(sata_hba_inst, saddr);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8860 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8861 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst, ncport)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8862 /* Release PORT_BUSY flag */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8863 (SATA_CPORT_INFO(sata_hba_inst, ncport))->
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8864 cport_event_flags &= ~SATA_EVNT_LOCK_PORT_BUSY;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8865 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, ncport)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8866
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8867 } /* End of loop through the controller SATA ports */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8868 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8869
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8870 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8871 * Process HBA power level change reported by HBA driver.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8872 * Not implemented at this time - event is ignored.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8873 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8874 static void
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8875 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
8876 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8877 SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8878 "Processing controller power level change", NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8879
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8880 /* Ignoring it for now */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8881 mutex_enter(&sata_hba_inst->satahba_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8882 sata_hba_inst->satahba_event_flags &= ~SATA_EVNT_PWR_LEVEL_CHANGED;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8883 mutex_exit(&sata_hba_inst->satahba_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8884 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8885
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8886 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8887 * Process port power level change reported by HBA driver.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8888 * Not implemented at this time - event is ignored.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8889 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8890 static void
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8891 sata_process_port_pwr_change(sata_hba_inst_t *sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8892 sata_address_t *saddr)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8893 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8894 sata_cport_info_t *cportinfo;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8895
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8896 SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8897 "Processing port power level change", NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8898
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8899 cportinfo = SATA_CPORT_INFO(sata_hba_inst, saddr->cport);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8900 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8901 /* Reset event flag */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8902 cportinfo->cport_event_flags &= ~SATA_EVNT_PWR_LEVEL_CHANGED;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8903 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8904 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8905
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8906 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8907 * Process port failure reported by HBA driver.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8908 * cports support only - no pmports.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8909 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8910 static void
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8911 sata_process_port_failed_event(sata_hba_inst_t *sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8912 sata_address_t *saddr)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8913 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8914 sata_cport_info_t *cportinfo;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8915
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8916 cportinfo = SATA_CPORT_INFO(sata_hba_inst, saddr->cport);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8917 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8918 /* Reset event flag first */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8919 cportinfo->cport_event_flags &= ~SATA_EVNT_PORT_FAILED;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8920 /* If the port is in SHUTDOWN or FAILED state, ignore this event. */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8921 if ((cportinfo->cport_state &
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8922 (SATA_PSTATE_SHUTDOWN | SATA_PSTATE_FAILED)) == 0) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8923 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8924 cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8925 return;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8926 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8927 /* Fail the port */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8928 cportinfo->cport_state = SATA_PSTATE_FAILED;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8929 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8930 sata_log(sata_hba_inst, CE_WARN, "port %d failed", saddr->cport);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8931 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8932
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8933 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8934 * Device Reset Event processing.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8935 * The seqeunce is managed by 3 stage flags:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8936 * - reset event reported,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8937 * - reset event being processed,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8938 * - request to clear device reset state.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8939 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8940 static void
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8941 sata_process_device_reset(sata_hba_inst_t *sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8942 sata_address_t *saddr)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8943 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8944 sata_drive_info_t old_sdinfo; /* local copy of the drive info */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8945 sata_drive_info_t *sdinfo;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8946 sata_cport_info_t *cportinfo;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8947 sata_device_t sata_device;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8948 int rval;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8949
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8950 /* We only care about host sata cport for now */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8951 cportinfo = SATA_CPORT_INFO(sata_hba_inst, saddr->cport);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8952
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8953 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8954
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8955 /* If the port is in SHUTDOWN or FAILED state, ignore reset event. */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8956 if ((cportinfo->cport_state &
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8957 (SATA_PSTATE_SHUTDOWN | SATA_PSTATE_FAILED)) != 0) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8958 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8959 cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8960 return;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8961 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8962
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8963 if ((SATA_CPORT_DEV_TYPE(sata_hba_inst, saddr->cport) &
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8964 SATA_VALID_DEV_TYPE) == 0) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8965 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8966 cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8967 return;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8968 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8969 sdinfo = SATA_CPORT_DRV_INFO(sata_hba_inst, saddr->cport);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8970 if (sdinfo == NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8971 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8972 cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8973 return;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8974 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8975
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8976 if ((sdinfo->satadrv_event_flags & SATA_EVNT_DEVICE_RESET) == 0) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8977 /* Nothing to do */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8978 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8979 cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8980 return;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8981 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8982
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8983 SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8984 "Processing port %d device reset", saddr->cport);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8985
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8986 if (sdinfo->satadrv_event_flags & SATA_EVNT_INPROC_DEVICE_RESET) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8987 /* Something is weird - new device reset event */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8988 SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8989 "Overlapping device reset events!", NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8990 /* Just leave */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8991 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8992 cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8993 return;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8994 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8995
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8996 /* Clear event flag */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8997 sdinfo->satadrv_event_flags &= ~SATA_EVNT_DEVICE_RESET;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8998
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8999 /* It seems that we always need to check the port state first */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9000 sata_device.satadev_rev = SATA_DEVICE_REV;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9001 sata_device.satadev_addr = *saddr;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9002 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9003 * We have to exit mutex, because the HBA probe port function may
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9004 * block on its own mutex.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9005 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9006 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9007 rval = (*SATA_PROBE_PORT_FUNC(sata_hba_inst))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9008 (SATA_DIP(sata_hba_inst), &sata_device);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9009 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9010 sata_update_port_info(sata_hba_inst, &sata_device);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9011 if (rval != SATA_SUCCESS) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9012 /* Something went wrong? Fail the port */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9013 cportinfo->cport_state = SATA_PSTATE_FAILED;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9014 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9015 cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9016 SATA_LOG_D((sata_hba_inst, CE_WARN, "Port %d probing failed",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9017 saddr->cport));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9018 return;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9019 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9020 if ((sata_device.satadev_scr.sstatus &
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9021 SATA_PORT_DEVLINK_UP_MASK) !=
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9022 SATA_PORT_DEVLINK_UP ||
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9023 sata_device.satadev_type == SATA_DTYPE_NONE) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9024 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9025 * No device to process, anymore. Some other event processing
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9026 * would or have already performed port info cleanup.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9027 * To be safe (HBA may need it), request clearing device
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9028 * reset condition.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9029 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9030 sdinfo->satadrv_event_flags = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9031 sdinfo->satadrv_event_flags |= SATA_EVNT_CLEAR_DEVICE_RESET;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9032 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9033 cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9034 return;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9035 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9036
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9037 /* Mark device reset processing as active */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9038 sdinfo->satadrv_event_flags |= SATA_EVNT_INPROC_DEVICE_RESET;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9039
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9040 old_sdinfo = *sdinfo; /* local copy of the drive info */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9041 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9042
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9043 if (sata_restore_drive_settings(sata_hba_inst, &old_sdinfo) ==
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9044 SATA_FAILURE) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9045 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9046 * Restoring drive setting failed.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9047 * Probe the port first, to check if the port state has changed
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9048 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9049 sata_device.satadev_rev = SATA_DEVICE_REV;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9050 sata_device.satadev_addr = *saddr;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9051 sata_device.satadev_addr.qual = SATA_ADDR_CPORT;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9052 /* probe port */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9053 rval = (*SATA_PROBE_PORT_FUNC(sata_hba_inst))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9054 (SATA_DIP(sata_hba_inst), &sata_device);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9055 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9056 cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9057 if (rval == SATA_SUCCESS &&
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9058 (sata_device.satadev_state &
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9059 (SATA_PSTATE_SHUTDOWN | SATA_PSTATE_FAILED)) == 0 &&
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9060 (sata_device.satadev_scr.sstatus &
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9061 SATA_PORT_DEVLINK_UP_MASK) == SATA_PORT_DEVLINK_UP &&
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9062 (sata_device.satadev_type & SATA_DTYPE_ATADISK) != 0) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9063 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9064 * We may retry this a bit later - reinstate reset
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9065 * condition
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9066 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9067 if ((cportinfo->cport_dev_type &
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9068 SATA_VALID_DEV_TYPE) != 0 &&
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9069 SATA_CPORTINFO_DRV_INFO(cportinfo) != NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9070 sdinfo = SATA_CPORTINFO_DRV_INFO(cportinfo);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9071 sdinfo->satadrv_event_flags |=
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9072 SATA_EVNT_DEVICE_RESET;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9073 sdinfo->satadrv_event_flags &=
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9074 ~SATA_EVNT_INPROC_DEVICE_RESET;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9075 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9076 saddr->cport)->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9077 mutex_enter(&sata_hba_inst->satahba_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9078 sata_hba_inst->satahba_event_flags |=
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9079 SATA_EVNT_MAIN;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9080 mutex_exit(&sata_hba_inst->satahba_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9081 return;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9082 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9083 } else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9084 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9085 * No point of retrying - some other event processing
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9086 * would or already did port info cleanup.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9087 * To be safe (HBA may need it),
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9088 * request clearing device reset condition.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9089 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9090 sdinfo->satadrv_event_flags = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9091 sdinfo->satadrv_event_flags |=
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9092 SATA_EVNT_CLEAR_DEVICE_RESET;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9093 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9094 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9095 cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9096 return;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9097 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9098
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9099 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9100 * Raise the flag indicating that the next sata command could
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9101 * 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
9102 * reset is reported.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9103 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9104 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9105 if ((cportinfo->cport_dev_type & SATA_VALID_DEV_TYPE) != 0 &&
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9106 SATA_CPORTINFO_DRV_INFO(cportinfo) != NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9107 sdinfo = SATA_CPORTINFO_DRV_INFO(cportinfo);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9108 sdinfo->satadrv_event_flags &= ~SATA_EVNT_INPROC_DEVICE_RESET;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9109 sdinfo->satadrv_event_flags |= SATA_EVNT_CLEAR_DEVICE_RESET;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9110 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9111 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9112 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9113
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9114
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9115 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9116 * Port Link Events processing.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9117 * Every link established event may involve device reset (due to
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9118 * COMRESET signal, equivalent of the hard reset) so arbitrarily
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9119 * set device reset event for an attached device (if any).
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9120 * If the port is in SHUTDOWN or FAILED state, ignore link events.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9121 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9122 * The link established event processing varies, depending on the state
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9123 * of the target node, HBA hotplugging capabilities, state of the port.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9124 * If the link is not active, the link established event is ignored.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9125 * If HBA cannot detect device attachment and there is no target node,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9126 * the link established event triggers device attach event processing.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9127 * Else, link established event triggers device reset event processing.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9128 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9129 * The link lost event processing varies, depending on a HBA hotplugging
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9130 * capability and the state of the port (link active or not active).
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9131 * If the link is active, the lost link event is ignored.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9132 * If HBA cannot detect device removal, the lost link event triggers
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9133 * device detached event processing after link lost timeout.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9134 * Else, the event is ignored.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9135 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9136 * NOTE: Only cports are processed for now, i.e. no port multiplier ports
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9137 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9138 static void
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9139 sata_process_port_link_events(sata_hba_inst_t *sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9140 sata_address_t *saddr)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9141 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9142 sata_device_t sata_device;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9143 sata_cport_info_t *cportinfo;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9144 sata_drive_info_t *sdinfo;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9145 int event_flags;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9146 int rval;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9147
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9148 SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9149 "Processing port %d link event(s)", saddr->cport);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9150
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9151 cportinfo = SATA_CPORT_INFO(sata_hba_inst, saddr->cport);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9152 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9153 event_flags = cportinfo->cport_event_flags;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9154
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9155 /* Reset event flags first */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9156 cportinfo->cport_event_flags &=
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9157 ~(SATA_EVNT_LINK_ESTABLISHED | SATA_EVNT_LINK_LOST);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9158
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9159 /* If the port is in SHUTDOWN or FAILED state, ignore link events. */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9160 if ((cportinfo->cport_state &
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9161 (SATA_PSTATE_SHUTDOWN | SATA_PSTATE_FAILED)) != 0) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9162 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9163 cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9164 return;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9165 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9166
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9167 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9168 * For the sanity sake get current port state.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9169 * Set device address only. Other sata_device fields should be
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9170 * set by HBA driver.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9171 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9172 sata_device.satadev_rev = SATA_DEVICE_REV;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9173 sata_device.satadev_addr = *saddr;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9174 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9175 * We have to exit mutex, because the HBA probe port function may
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9176 * block on its own mutex.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9177 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9178 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9179 rval = (*SATA_PROBE_PORT_FUNC(sata_hba_inst))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9180 (SATA_DIP(sata_hba_inst), &sata_device);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9181 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9182 sata_update_port_info(sata_hba_inst, &sata_device);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9183 if (rval != SATA_SUCCESS) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9184 /* Something went wrong? Fail the port */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9185 cportinfo->cport_state = SATA_PSTATE_FAILED;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9186 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9187 cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9188 SATA_LOG_D((sata_hba_inst, CE_WARN, "Port %d probing failed",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9189 saddr->cport));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9190 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9191 * We may want to release device info structure, but
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9192 * it is not necessary.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9193 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9194 return;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9195 } else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9196 /* port probed successfully */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9197 cportinfo->cport_state |= SATA_STATE_PROBED | SATA_STATE_READY;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9198 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9199 if (event_flags & SATA_EVNT_LINK_ESTABLISHED) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9200
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9201 if ((sata_device.satadev_scr.sstatus &
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9202 SATA_PORT_DEVLINK_UP_MASK) != SATA_PORT_DEVLINK_UP) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9203 /* Ignore event */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9204 SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9205 "Ignoring port %d link established event - "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9206 "link down",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9207 saddr->cport);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9208 goto linklost;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9209 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9210
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9211 SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9212 "Processing port %d link established event",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9213 saddr->cport);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9214
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9215 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9216 * For the sanity sake check if a device is attached - check
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9217 * return state of a port probing.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9218 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9219 if (sata_device.satadev_type != SATA_DTYPE_NONE &&
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9220 sata_device.satadev_type != SATA_DTYPE_PMULT) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9221 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9222 * HBA port probe indicated that there is a device
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9223 * attached. Check if the framework had device info
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9224 * structure attached for this device.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9225 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9226 if (cportinfo->cport_dev_type != SATA_DTYPE_NONE) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9227 ASSERT(SATA_CPORTINFO_DRV_INFO(cportinfo) !=
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9228 NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9229
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9230 sdinfo = SATA_CPORTINFO_DRV_INFO(cportinfo);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9231 if ((sdinfo->satadrv_type &
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9232 SATA_VALID_DEV_TYPE) != 0) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9233 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9234 * Dev info structure is present.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9235 * If dev_type is set to known type in
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9236 * the framework's drive info struct
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9237 * then the device existed before and
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9238 * the link was probably lost
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9239 * momentarily - in such case
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9240 * we may want to check device
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9241 * identity.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9242 * Identity check is not supported now.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9243 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9244 * Link established event
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9245 * triggers device reset event.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9246 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9247 (SATA_CPORTINFO_DRV_INFO(cportinfo))->
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9248 satadrv_event_flags |=
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9249 SATA_EVNT_DEVICE_RESET;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9250 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9251 } else if (cportinfo->cport_dev_type ==
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9252 SATA_DTYPE_NONE) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9253 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9254 * We got new device attached! If HBA does not
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9255 * generate device attached events, trigger it
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9256 * here.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9257 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9258 if (!(SATA_FEATURES(sata_hba_inst) &
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9259 SATA_CTLF_HOTPLUG)) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9260 cportinfo->cport_event_flags |=
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9261 SATA_EVNT_DEVICE_ATTACHED;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9262 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9263 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9264 /* Reset link lost timeout */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9265 cportinfo->cport_link_lost_time = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9266 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9267 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9268 linklost:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9269 if (event_flags & SATA_EVNT_LINK_LOST) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9270 if ((sata_device.satadev_scr.sstatus &
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9271 SATA_PORT_DEVLINK_UP_MASK) == SATA_PORT_DEVLINK_UP) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9272 /* Ignore event */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9273 SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9274 "Ignoring port %d link lost event - link is up",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9275 saddr->cport);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9276 goto done;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9277 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9278 #ifdef SATA_DEBUG
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9279 if (cportinfo->cport_link_lost_time == 0) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9280 SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9281 "Processing port %d link lost event",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9282 saddr->cport);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9283 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9284 #endif
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9285 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9286 * When HBA cannot generate device attached/detached events,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9287 * we need to track link lost time and eventually generate
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9288 * device detach event.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9289 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9290 if (!(SATA_FEATURES(sata_hba_inst) & SATA_CTLF_HOTPLUG)) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9291 /* We are tracking link lost time */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9292 if (cportinfo->cport_link_lost_time == 0) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9293 /* save current time (lbolt value) */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9294 cportinfo->cport_link_lost_time =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9295 ddi_get_lbolt();
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9296 /* just keep link lost event */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9297 cportinfo->cport_event_flags |=
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9298 SATA_EVNT_LINK_LOST;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9299 } else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9300 clock_t cur_time = ddi_get_lbolt();
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9301 if ((cur_time -
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9302 cportinfo->cport_link_lost_time) >=
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9303 drv_usectohz(
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9304 SATA_EVNT_LINK_LOST_TIMEOUT)) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9305 /* trigger device detach event */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9306 cportinfo->cport_event_flags |=
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9307 SATA_EVNT_DEVICE_DETACHED;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9308 cportinfo->cport_link_lost_time = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9309 SATADBG1(SATA_DBG_EVENTS,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9310 sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9311 "Triggering port %d "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9312 "device detached event",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9313 saddr->cport);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9314 } else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9315 /* keep link lost event */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9316 cportinfo->cport_event_flags |=
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9317 SATA_EVNT_LINK_LOST;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9318 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9319 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9320 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9321 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9322 * We could change port state to disable/delay access to
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9323 * the attached device until the link is recovered.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9324 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9325 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9326 done:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9327 event_flags = cportinfo->cport_event_flags;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9328 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9329 if (event_flags != 0) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9330 mutex_enter(&sata_hba_inst->satahba_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9331 sata_hba_inst->satahba_event_flags |= SATA_EVNT_MAIN;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9332 mutex_exit(&sata_hba_inst->satahba_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9333 mutex_enter(&sata_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9334 sata_event_pending |= SATA_EVNT_MAIN;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9335 mutex_exit(&sata_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9336 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9337 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9338
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9339 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9340 * Device Detached Event processing.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9341 * 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
9342 * the device info structure is detached from the SATA port info structure
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9343 * and released.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9344 * Port status is updated.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9345 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9346 * NOTE: Process cports event only, no port multiplier ports.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9347 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9348 static void
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9349 sata_process_device_detached(sata_hba_inst_t *sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9350 sata_address_t *saddr)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9351 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9352 sata_cport_info_t *cportinfo;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9353 sata_drive_info_t *sdevinfo;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9354 sata_device_t sata_device;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9355 dev_info_t *tdip;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9356 int rval;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9357
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9358 SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9359 "Processing port %d device detached", saddr->cport);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9360
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9361 cportinfo = SATA_CPORT_INFO(sata_hba_inst, saddr->cport);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9362 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9363 /* Clear event flag */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9364 cportinfo->cport_event_flags &= ~SATA_EVNT_DEVICE_DETACHED;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9365
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9366 /* If the port is in SHUTDOWN or FAILED state, ignore detach event. */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9367 if ((cportinfo->cport_state &
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9368 (SATA_PSTATE_SHUTDOWN | SATA_PSTATE_FAILED)) != 0) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9369 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9370 cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9371 return;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9372 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9373 /* For sanity, re-probe the port */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9374 sata_device.satadev_rev = SATA_DEVICE_REV;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9375 sata_device.satadev_addr = *saddr;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9376
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9377 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9378 * We have to exit mutex, because the HBA probe port function may
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9379 * block on its own mutex.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9380 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9381 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9382 rval = (*SATA_PROBE_PORT_FUNC(sata_hba_inst))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9383 (SATA_DIP(sata_hba_inst), &sata_device);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9384 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9385 sata_update_port_info(sata_hba_inst, &sata_device);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9386 if (rval != SATA_SUCCESS) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9387 /* Something went wrong? Fail the port */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9388 cportinfo->cport_state = SATA_PSTATE_FAILED;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9389 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9390 cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9391 SATA_LOG_D((sata_hba_inst, CE_WARN, "Port %d probing failed",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9392 saddr->cport));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9393 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9394 * We may want to release device info structure, but
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9395 * it is not necessary.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9396 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9397 return;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9398 } else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9399 /* port probed successfully */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9400 cportinfo->cport_state |= SATA_STATE_PROBED | SATA_STATE_READY;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9401 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9402 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9403 * Check if a device is still attached. For sanity, check also
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9404 * link status - if no link, there is no device.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9405 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9406 if ((sata_device.satadev_scr.sstatus & SATA_PORT_DEVLINK_UP_MASK) ==
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9407 SATA_PORT_DEVLINK_UP && sata_device.satadev_type !=
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9408 SATA_DTYPE_NONE) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9409 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9410 * Device is still attached - ignore detach event.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9411 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9412 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9413 cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9414 SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9415 "Ignoring detach - device still attached to port %d",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9416 sata_device.satadev_addr.cport);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9417 return;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9418 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9419 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9420 * We need to detach and release device info structure here
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9421 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9422 if (SATA_CPORTINFO_DRV_INFO(cportinfo) != NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9423 sdevinfo = SATA_CPORTINFO_DRV_INFO(cportinfo);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9424 SATA_CPORTINFO_DRV_INFO(cportinfo) = NULL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9425 (void) kmem_free((void *)sdevinfo,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9426 sizeof (sata_drive_info_t));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9427 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9428 cportinfo->cport_dev_type = SATA_DTYPE_NONE;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9429 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9430 * Device cannot be reached anymore, even if the target node may be
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9431 * still present.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9432 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9433
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9434 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9435 sata_log(sata_hba_inst, CE_WARN, "SATA device detached at port %d",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9436 sata_device.satadev_addr.cport);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9437
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9438 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9439 * 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
9440 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9441 tdip = sata_get_target_dip(SATA_DIP(sata_hba_inst), saddr->cport);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9442 if (tdip != NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9443 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9444 * target node exist - unconfigure device first, then remove
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9445 * the node
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9446 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9447 if (ndi_devi_offline(tdip, NDI_UNCONFIG) != NDI_SUCCESS) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9448 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9449 * PROBLEM - no device, but target node remained
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9450 * This happens when the file was open or node was
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9451 * waiting for resources.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9452 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9453 SATA_LOG_D((sata_hba_inst, CE_WARN,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9454 "sata_process_device_detached: "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9455 "Failed to unconfigure removed device."));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9456 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9457 if (ndi_devi_offline(tdip, NDI_DEVI_REMOVE) != NDI_SUCCESS) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9458 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9459 * PROBLEM - no device, but target node remained
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9460 * This happens when the file was open or node was
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9461 * waiting for resources.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9462 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9463 SATA_LOG_D((sata_hba_inst, CE_WARN,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9464 "sata_process_device_detached: "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9465 "Failed to remove target node for "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9466 "removed device."));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9467 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9468 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9469
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9470 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9471
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9472
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9473 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9474 * Device Attached Event processing.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9475 * 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
9476 * 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
9477 * structure.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9478 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9479 * This function cannot be called in interrupt context (it may sleep).
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9480 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9481 * NOTE: Process cports event only, no port multiplier ports.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9482 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9483 static void
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9484 sata_process_device_attached(sata_hba_inst_t *sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9485 sata_address_t *saddr)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9486 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9487 sata_cport_info_t *cportinfo;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9488 sata_drive_info_t *sdevinfo;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9489 sata_device_t sata_device;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9490 dev_info_t *tdip;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9491
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9492 SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9493 "Processing port %d device attached", saddr->cport);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9494
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9495 cportinfo = SATA_CPORT_INFO(sata_hba_inst, saddr->cport);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9496 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9497
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9498 /* Clear event flag first */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9499 cportinfo->cport_event_flags &= ~SATA_EVNT_DEVICE_ATTACHED;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9500 /* If the port is in SHUTDOWN or FAILED state, ignore event. */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9501 if ((cportinfo->cport_state &
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9502 (SATA_PSTATE_SHUTDOWN | SATA_PSTATE_FAILED)) != 0) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9503 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9504 cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9505 return;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9506 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9507
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9508 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9509 * If the sata_drive_info structure is found attached to the port info,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9510 * something went wrong in the event reporting and processing sequence.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9511 * To recover, arbitrarily release device info structure and issue
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9512 * a warning.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9513 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9514 if (SATA_CPORTINFO_DRV_INFO(cportinfo) != NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9515 sdevinfo = SATA_CPORTINFO_DRV_INFO(cportinfo);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9516 SATA_CPORTINFO_DRV_INFO(cportinfo) = NULL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9517 (void) kmem_free((void *)sdevinfo,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9518 sizeof (sata_drive_info_t));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9519 SATA_LOG_D((sata_hba_inst, CE_WARN,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9520 "Arbitrarily detaching old device info."));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9521 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9522 cportinfo->cport_dev_type = SATA_DTYPE_NONE;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9523 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9524 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9525 * Make sure that there is no target node for that device.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9526 * If so, release it. It should not happen, unless we had problem
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9527 * removing the node when device was detached.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9528 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9529 tdip = sata_get_target_dip(SATA_DIP(sata_hba_inst), saddr->cport);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9530 if (tdip != NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9531
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9532 SATA_LOG_D((sata_hba_inst, CE_WARN,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9533 "sata_process_device_attached: "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9534 "old device target node exists!!!"));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9535 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9536 * target node exist - unconfigure device first, then remove
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9537 * the node
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9538 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9539 if (ndi_devi_offline(tdip, NDI_UNCONFIG) != NDI_SUCCESS) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9540 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9541 * PROBLEM - no device, but target node remained
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9542 * This happens when the file was open or node was
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9543 * waiting for resources.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9544 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9545 SATA_LOG_D((sata_hba_inst, CE_WARN,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9546 "sata_process_device_attached: "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9547 "Failed to unconfigure old target node!"));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9548 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9549 /* Following call will retry node offlining and removing it */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9550 if (ndi_devi_offline(tdip, NDI_DEVI_REMOVE) != NDI_SUCCESS) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9551 /* PROBLEM - no device, but target node remained */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9552 SATA_LOG_D((sata_hba_inst, CE_WARN,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9553 "sata_process_device_attached: "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9554 "Failed to remove old target node!"));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9555 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9556 * It is not clear, what should be done here.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9557 * For now, we will not attach a new device
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9558 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9559 return;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9560 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9561 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9562
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9563 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9564 * Reprobing port will take care of detecting device presence,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9565 * creation of the device info structure and determination of the
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9566 * device type.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9567 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9568 sata_device.satadev_addr = *saddr;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9569 (void) sata_reprobe_port(sata_hba_inst, &sata_device);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9570 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9571 * If device was successfully attached, an explicit
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9572 * 'configure' command is needed to configure it.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9573 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9574 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9575 if ((cportinfo->cport_state & SATA_STATE_READY) &&
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9576 cportinfo->cport_dev_type != SATA_DTYPE_NONE &&
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9577 SATA_CPORTINFO_DRV_INFO(cportinfo) != NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9578 sata_drive_info_t new_sdinfo;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9579
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9580 /* Log device info data */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9581 new_sdinfo = *(SATA_CPORTINFO_DRV_INFO(cportinfo));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9582 sata_show_drive_info(sata_hba_inst, &new_sdinfo);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9583 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9584 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9585 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9586
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9587
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9588 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9589 * sata_restore_drive_settings function compares current device setting
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9590 * with the saved device setting and, if there is a difference, restores
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9591 * device setting to the stored state.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9592 * Device Identify data has to be current.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9593 * At the moment only read ahead and write cache settings are considered.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9594 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9595 * This function cannot be called in the interrupt context (it may sleep).
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9596 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9597 * Returns TRUE if successful or there was nothing to do.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9598 * Returns FALSE if device setting could not be restored.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9599 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9600 * Note: This function may fail the port, making it inaccessible.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9601 * Explicit port disconnect/connect or physical device
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9602 * detach/attach is required to re-evaluate it's state afterwards
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9603 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9604 static int
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9605 sata_restore_drive_settings(sata_hba_inst_t *sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9606 sata_drive_info_t *sdinfo)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9607 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9608 sata_pkt_t *spkt;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9609 sata_cmd_t *scmd;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9610 sata_pkt_txlate_t *spx;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9611 int rval = SATA_SUCCESS;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9612 sata_drive_info_t new_sdinfo;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9613
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9614 bzero(&new_sdinfo, sizeof (sata_drive_info_t));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9615 new_sdinfo.satadrv_addr = sdinfo->satadrv_addr;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9616 new_sdinfo.satadrv_type = sdinfo->satadrv_type;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9617 if (sata_fetch_device_identify_data(sata_hba_inst, &new_sdinfo) != 0) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9618 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9619 * Cannot get device identification - retry later
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9620 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9621 SATA_LOG_D((sata_hba_inst, CE_WARN,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9622 "sata_restore_drive_settings: "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9623 "cannot fetch device identify data\n"));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9624 return (SATA_FAILURE);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9625 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9626 /* Arbitrarily set UDMA mode */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9627 if (sata_set_udma_mode(sata_hba_inst, &new_sdinfo) != SATA_SUCCESS) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9628 SATA_LOG_D((sata_hba_inst, CE_WARN,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9629 "sata_restore_drive_settings: cannot set UDMA mode\n"));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9630 return (SATA_FAILURE);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9631 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9632
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9633 if (!(new_sdinfo.satadrv_id.ai_cmdset82 & SATA_LOOK_AHEAD) &&
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9634 !(new_sdinfo.satadrv_id.ai_cmdset82 & SATA_WRITE_CACHE)) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9635 /* None of the features is supported - do nothing */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9636 SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9637 "restorable features not supported\n", NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9638 return (SATA_SUCCESS);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9639 }
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 if (((new_sdinfo.satadrv_id.ai_features85 & SATA_LOOK_AHEAD) &&
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9642 (sdinfo->satadrv_settings & SATA_DEV_READ_AHEAD)) &&
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9643 ((new_sdinfo.satadrv_id.ai_features85 & SATA_WRITE_CACHE) &&
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9644 (sdinfo->satadrv_settings & SATA_DEV_WRITE_CACHE))) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9645 /* Nothing to do */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9646 SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9647 "nothing to restore\n", NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9648 return (SATA_SUCCESS);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9649 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9650
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9651 /* Prepare packet for SET FEATURES COMMAND */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9652 spx = kmem_zalloc(sizeof (sata_pkt_txlate_t), KM_SLEEP);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9653 spx->txlt_sata_hba_inst = sata_hba_inst;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9654 spx->txlt_scsi_pkt = NULL; /* No scsi pkt involved */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9655 spkt = sata_pkt_alloc(spx, SLEEP_FUNC);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9656 if (spkt == NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9657 kmem_free(spx, sizeof (sata_pkt_txlate_t));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9658 SATA_LOG_D((sata_hba_inst, CE_WARN,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9659 "sata_restore_drive_settings: could not "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9660 "restore device settings\n"));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9661 return (SATA_FAILURE);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9662 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9663
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9664 /* Fill sata_pkt */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9665 spkt->satapkt_device.satadev_addr = sdinfo->satadrv_addr;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9666 /* Timeout 30s */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9667 spkt->satapkt_time = sata_default_pkt_time;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9668 /* Synchronous mode, no callback */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9669 spkt->satapkt_op_mode = SATA_OPMODE_SYNCH | SATA_OPMODE_INTERRUPTS;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9670 spkt->satapkt_comp = NULL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9671 scmd = &spkt->satapkt_cmd;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9672 scmd->satacmd_flags =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9673 SATA_DIR_NODATA_XFER | SATA_IGNORE_DEV_RESET_STATE;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9674 scmd->satacmd_addr_type = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9675 scmd->satacmd_device_reg = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9676 scmd->satacmd_status_reg = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9677 scmd->satacmd_error_reg = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9678 scmd->satacmd_cmd_reg = SATAC_SET_FEATURES;
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 if (!((new_sdinfo.satadrv_id.ai_features85 & SATA_LOOK_AHEAD) &&
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9681 (sdinfo->satadrv_settings & SATA_DEV_READ_AHEAD))) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9682 if (sdinfo->satadrv_settings & SATA_DEV_READ_AHEAD)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9683 /* Enable read ahead / read cache */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9684 scmd->satacmd_features_reg =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9685 SATAC_SF_ENABLE_READ_AHEAD;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9686 else
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9687 /* Disable read ahead / read cache */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9688 scmd->satacmd_features_reg =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9689 SATAC_SF_DISABLE_READ_AHEAD;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9690
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9691 /* Transfer command to HBA */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9692 if (((*SATA_START_FUNC(sata_hba_inst))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9693 (SATA_DIP(sata_hba_inst), spkt) != 0) ||
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9694 (spkt->satapkt_reason != SATA_PKT_COMPLETED)) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9695 /* Pkt execution failed */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9696 SATA_LOG_D((sata_hba_inst, CE_WARN,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9697 "sata_restore_drive_settings: could not "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9698 "restore device settings\n"));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9699 rval = SATA_FAILURE;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9700 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9701 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9702 /* Note that the sata packet is not removed, so it could be re-used */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9703
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9704 if (!((new_sdinfo.satadrv_id.ai_features85 & SATA_WRITE_CACHE) &&
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9705 (sdinfo->satadrv_settings & SATA_DEV_WRITE_CACHE))) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9706 if (sdinfo->satadrv_settings & SATA_DEV_WRITE_CACHE)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9707 /* Enable write cache */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9708 scmd->satacmd_features_reg =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9709 SATAC_SF_ENABLE_WRITE_CACHE;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9710 else
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9711 /* Disable write cache */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9712 scmd->satacmd_features_reg =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9713 SATAC_SF_DISABLE_WRITE_CACHE;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9714
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9715 /* Transfer command to HBA */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9716 if (((*SATA_START_FUNC(sata_hba_inst))(
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9717 SATA_DIP(sata_hba_inst), spkt) != 0) ||
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9718 (spkt->satapkt_reason != SATA_PKT_COMPLETED)) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9719 /* Pkt execution failed */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9720 SATA_LOG_D((sata_hba_inst, CE_WARN,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9721 "sata_restore_drive_settings: could not "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9722 "restore device settings\n"));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9723 rval = SATA_FAILURE;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9724 }
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 /* Free allocated resources */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9728 sata_pkt_free(spx);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9729 (void) kmem_free(spx, sizeof (sata_pkt_txlate_t));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9730
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9731 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9732 * We need to fetch Device Identify data again
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9733 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9734 if (sata_fetch_device_identify_data(sata_hba_inst, &new_sdinfo) != 0) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9735 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9736 * Cannot get device identification - retry later
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9737 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9738 SATA_LOG_D((sata_hba_inst, CE_WARN,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9739 "sata_restore_drive_settings: "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9740 "cannot re-fetch device identify data\n"));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9741 rval = SATA_FAILURE;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9742 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9743 /* Copy device sata info. */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9744 sdinfo->satadrv_id = new_sdinfo.satadrv_id;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9745
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9746 return (rval);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9747 }