annotate usr/src/uts/common/io/sata/impl/sata.c @ 2553:624f674f2ad8

6430966 SATA NCQ support is needed in SATA framework and hba drivers 6460173 sata module is not warlock clean
author ls24207
date Tue, 15 Aug 2006 15:13:46 -0700
parents 2a06303a9684
children 79c4a3cba4f1
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 /*
1529
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
23 * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
24 * Use is subject to license terms.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
25 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
26
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
27 #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>
1529
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
47 #include <sys/sysevent.h>
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
48 #include <sys/sysevent/eventdefs.h>
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
49 #include <sys/sysevent/dr.h>
1781
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
50 #include <sys/taskq.h>
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
51
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
52 #include <sys/sata/impl/sata.h>
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
53 #include <sys/sata/sata_hba.h>
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
54 #include <sys/sata/sata_defs.h>
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
55 #include <sys/sata/sata_cfgadm.h>
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
56
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
57
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
58 /* Debug flags - defined in sata.h */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
59 int sata_debug_flags = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
60 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
61 * Flags enabling selected SATA HBA framework functionality
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
62 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
63 #define SATA_ENABLE_QUEUING 1
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
64 #define SATA_ENABLE_NCQ 2
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
65 #define SATA_ENABLE_PROCESS_EVENTS 4
2553
624f674f2ad8 6430966 SATA NCQ support is needed in SATA framework and hba drivers
ls24207
parents: 2539
diff changeset
66 int sata_func_enable =
624f674f2ad8 6430966 SATA NCQ support is needed in SATA framework and hba drivers
ls24207
parents: 2539
diff changeset
67 SATA_ENABLE_PROCESS_EVENTS | SATA_ENABLE_QUEUING | SATA_ENABLE_NCQ;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
68
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
69 #ifdef SATA_DEBUG
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
70 #define SATA_LOG_D(args) sata_log args
2539
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
71 uint64_t mbuf_count = 0;
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
72 uint64_t mbuffail_count = 0;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
73 #else
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
74 #define SATA_LOG_D(arg)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
75 #endif
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
76
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
77
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 * SATA cb_ops functions
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
80 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
81 static int sata_hba_open(dev_t *, int, int, cred_t *);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
82 static int sata_hba_close(dev_t, int, int, cred_t *);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
83 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
84
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
85 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
86 * SCSA required entry points
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
87 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
88 static int sata_scsi_tgt_init(dev_info_t *, dev_info_t *,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
89 scsi_hba_tran_t *, struct scsi_device *);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
90 static int sata_scsi_tgt_probe(struct scsi_device *,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
91 int (*callback)(void));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
92 static void sata_scsi_tgt_free(dev_info_t *, dev_info_t *,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
93 scsi_hba_tran_t *, struct scsi_device *);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
94 static int sata_scsi_start(struct scsi_address *, struct scsi_pkt *);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
95 static int sata_scsi_abort(struct scsi_address *, struct scsi_pkt *);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
96 static int sata_scsi_reset(struct scsi_address *, int);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
97 static int sata_scsi_getcap(struct scsi_address *, char *, int);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
98 static int sata_scsi_setcap(struct scsi_address *, char *, int, int);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
99 static struct scsi_pkt *sata_scsi_init_pkt(struct scsi_address *,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
100 struct scsi_pkt *, struct buf *, int, int, int, int, int (*)(caddr_t),
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
101 caddr_t);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
102 static void sata_scsi_destroy_pkt(struct scsi_address *, struct scsi_pkt *);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
103 static void sata_scsi_dmafree(struct scsi_address *, struct scsi_pkt *);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
104 static void sata_scsi_sync_pkt(struct scsi_address *, struct scsi_pkt *);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
105
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
106
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
107 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
108 * Local functions
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
109 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
110 static void sata_remove_hba_instance(dev_info_t *);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
111 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
112 static void sata_probe_ports(sata_hba_inst_t *);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
113 static int sata_reprobe_port(sata_hba_inst_t *, sata_device_t *);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
114 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
115 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
116 sata_address_t *);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
117 static int sata_validate_scsi_address(sata_hba_inst_t *,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
118 struct scsi_address *, sata_device_t *);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
119 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
120 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
121 static void sata_pkt_free(sata_pkt_txlate_t *);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
122 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
123 caddr_t, ddi_dma_attr_t *);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
124 static int sata_probe_device(sata_hba_inst_t *, sata_device_t *);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
125 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
126 sata_device_t *);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
127 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
128 static struct buf *sata_alloc_local_buffer(sata_pkt_txlate_t *, int);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
129 static void sata_free_local_buffer(sata_pkt_txlate_t *);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
130 static uint64_t sata_check_capacity(sata_drive_info_t *);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
131 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
132 ddi_dma_attr_t *);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
133 static int sata_fetch_device_identify_data(sata_hba_inst_t *,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
134 sata_drive_info_t *);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
135 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
136 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
137 static int sata_set_udma_mode(sata_hba_inst_t *, sata_drive_info_t *);
1781
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
138 static int sata_set_cache_mode(sata_hba_inst_t *, sata_drive_info_t *, int);
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
139 static int sata_set_drive_features(sata_hba_inst_t *,
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
140 sata_drive_info_t *, int flag);
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
141 static int sata_init_write_cache_mode(sata_hba_inst_t *,
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
142 sata_drive_info_t *sdinfo);
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
143 static int sata_initialize_device(sata_hba_inst_t *, sata_drive_info_t *);
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
144
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
145 /* Event processing functions */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
146 static void sata_event_daemon(void *);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
147 static void sata_event_thread_control(int);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
148 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
149 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
150 static void sata_process_port_failed_event(sata_hba_inst_t *,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
151 sata_address_t *);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
152 static void sata_process_port_link_events(sata_hba_inst_t *,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
153 sata_address_t *);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
154 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
155 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
156 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
157 static void sata_process_cntrl_pwr_level_change(sata_hba_inst_t *);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
158
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
159 /* Local functions for ioctl */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
160 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
161 static void sata_cfgadm_state(sata_hba_inst_t *, int32_t,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
162 devctl_ap_state_t *);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
163 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
164 static dev_info_t *sata_devt_to_devinfo(dev_t);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
165
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
166 /* Local translation functions */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
167 static int sata_txlt_inquiry(sata_pkt_txlate_t *);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
168 static int sata_txlt_test_unit_ready(sata_pkt_txlate_t *);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
169 static int sata_txlt_start_stop_unit(sata_pkt_txlate_t *);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
170 static int sata_txlt_read_capacity(sata_pkt_txlate_t *);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
171 static int sata_txlt_request_sense(sata_pkt_txlate_t *);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
172 static int sata_txlt_read(sata_pkt_txlate_t *);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
173 static int sata_txlt_write(sata_pkt_txlate_t *);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
174 static int sata_txlt_atapi(sata_pkt_txlate_t *);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
175 static int sata_txlt_log_sense(sata_pkt_txlate_t *);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
176 static int sata_txlt_log_select(sata_pkt_txlate_t *);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
177 static int sata_txlt_mode_sense(sata_pkt_txlate_t *);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
178 static int sata_txlt_mode_select(sata_pkt_txlate_t *);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
179 static int sata_txlt_synchronize_cache(sata_pkt_txlate_t *);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
180 static int sata_txlt_nodata_cmd_immediate(sata_pkt_txlate_t *);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
181
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
182 static int sata_hba_start(sata_pkt_txlate_t *, int *);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
183 static int sata_txlt_invalid_command(sata_pkt_txlate_t *);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
184 static int sata_txlt_lba_out_of_range(sata_pkt_txlate_t *);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
185 static void sata_txlt_rw_completion(sata_pkt_t *);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
186 static void sata_txlt_atapi_completion(sata_pkt_t *);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
187 static void sata_txlt_nodata_cmd_completion(sata_pkt_t *);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
188
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
189 static struct scsi_extended_sense *sata_immediate_error_response(
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
190 sata_pkt_txlate_t *, int);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
191 static struct scsi_extended_sense *sata_arq_sense(sata_pkt_txlate_t *);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
192
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
193 /* Local functions */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
194 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
195 uint8_t *);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
196 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
197 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
198 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
199 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
200 static int sata_mode_select_page_8(sata_pkt_txlate_t *,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
201 struct mode_cache_scsi3 *, int, int *, int *, int *);
1675
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
202 static int sata_mode_select_page_1c(sata_pkt_txlate_t *,
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
203 struct mode_info_excpt_page *, int, int *, int *, int *);
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
204 static int sata_build_lsense_page_0(sata_drive_info_t *, uint8_t *);
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
205 static int sata_build_lsense_page_10(sata_drive_info_t *, uint8_t *,
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
206 sata_hba_inst_t *);
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
207 static int sata_build_lsense_page_2f(sata_drive_info_t *, uint8_t *,
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
208 sata_hba_inst_t *);
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
209 static int sata_build_lsense_page_30(sata_drive_info_t *, uint8_t *,
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
210 sata_hba_inst_t *);
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
211 static void sata_save_drive_settings(sata_drive_info_t *);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
212 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
213 static void sata_log(sata_hba_inst_t *, uint_t, char *fmt, ...);
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
214 static int sata_fetch_smart_return_status(sata_hba_inst_t *,
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
215 sata_drive_info_t *);
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
216 static int sata_fetch_smart_data(sata_hba_inst_t *, sata_drive_info_t *,
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
217 struct smart_data *);
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
218 static int sata_smart_selftest_log(sata_hba_inst_t *,
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
219 sata_drive_info_t *,
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
220 struct smart_selftest_log *);
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
221 static int sata_ext_smart_selftest_read_log(sata_hba_inst_t *,
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
222 sata_drive_info_t *, struct smart_ext_selftest_log *, uint16_t);
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
223 static int sata_smart_read_log(sata_hba_inst_t *, sata_drive_info_t *,
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
224 uint8_t *, uint8_t, uint8_t);
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
225 static int sata_read_log_ext_directory(sata_hba_inst_t *, sata_drive_info_t *,
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
226 struct read_log_ext_directory *);
1529
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
227 static void sata_gen_sysevent(sata_hba_inst_t *, sata_address_t *, int);
1675
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
228 static void sata_xlate_errors(sata_pkt_txlate_t *);
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
229
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
230 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
231 * SATA Framework will ignore SATA HBA driver cb_ops structure and
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
232 * register following one with SCSA framework.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
233 * Open & close are provided, so scsi framework will not use its own
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
234 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
235 static struct cb_ops sata_cb_ops = {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
236 sata_hba_open, /* open */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
237 sata_hba_close, /* close */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
238 nodev, /* strategy */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
239 nodev, /* print */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
240 nodev, /* dump */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
241 nodev, /* read */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
242 nodev, /* write */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
243 sata_hba_ioctl, /* ioctl */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
244 nodev, /* devmap */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
245 nodev, /* mmap */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
246 nodev, /* segmap */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
247 nochpoll, /* chpoll */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
248 ddi_prop_op, /* cb_prop_op */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
249 0, /* streamtab */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
250 D_NEW | D_MP, /* cb_flag */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
251 CB_REV, /* rev */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
252 nodev, /* aread */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
253 nodev /* awrite */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
254 };
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
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
257 extern struct mod_ops mod_miscops;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
258 extern uchar_t scsi_cdb_size[];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
259
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
260 static struct modlmisc modlmisc = {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
261 &mod_miscops, /* Type of module */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
262 "Generic SATA Driver v%I%" /* module name */
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
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
265
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
266 static struct modlinkage modlinkage = {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
267 MODREV_1,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
268 (void *)&modlmisc,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
269 NULL
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
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
272 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
273 * 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
274 * i.e. when scsi_pkt has not timeout specified.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
275 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
276 static int sata_default_pkt_time = 60; /* 60 seconds */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
277
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
278 /*
2539
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
279 * Intermediate buffer device access attributes - they are required,
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
280 * but not necessarily used.
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
281 */
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
282 static ddi_device_acc_attr_t sata_acc_attr = {
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
283 DDI_DEVICE_ATTR_V0,
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
284 DDI_STRUCTURE_LE_ACC,
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
285 DDI_STRICTORDER_ACC
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
286 };
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
287
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
288
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
289 /*
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
290 * Mutexes protecting structures in multithreaded operations.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
291 * Because events are relatively rare, a single global mutex protecting
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
292 * data structures should be sufficient. To increase performance, add
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
293 * 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
294 * common data structures.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
295 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
296 static kmutex_t sata_mutex; /* protects sata_hba_list */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
297 static kmutex_t sata_log_mutex; /* protects log */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
298
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
299 static char sata_log_buf[256];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
300
1781
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
301 /* Default write cache setting */
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
302 int sata_write_cache = 1;
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
303
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
304 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
305 * Linked list of HBA instances
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
306 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
307 static sata_hba_inst_t *sata_hba_list = NULL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
308 static sata_hba_inst_t *sata_hba_list_tail = NULL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
309 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
310 * 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
311 * structure and in sata soft state.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
312 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
313
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
314 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
315 * Event daemon related variables
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
316 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
317 static kmutex_t sata_event_mutex;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
318 static kcondvar_t sata_event_cv;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
319 static kthread_t *sata_event_thread = NULL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
320 static int sata_event_thread_terminate = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
321 static int sata_event_pending = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
322 static int sata_event_thread_active = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
323 extern pri_t minclsyspri;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
324
2553
624f674f2ad8 6430966 SATA NCQ support is needed in SATA framework and hba drivers
ls24207
parents: 2539
diff changeset
325 /*
624f674f2ad8 6430966 SATA NCQ support is needed in SATA framework and hba drivers
ls24207
parents: 2539
diff changeset
326 * NCQ specific data
624f674f2ad8 6430966 SATA NCQ support is needed in SATA framework and hba drivers
ls24207
parents: 2539
diff changeset
327 */
624f674f2ad8 6430966 SATA NCQ support is needed in SATA framework and hba drivers
ls24207
parents: 2539
diff changeset
328 static const sata_cmd_t sata_rle_cmd = {
624f674f2ad8 6430966 SATA NCQ support is needed in SATA framework and hba drivers
ls24207
parents: 2539
diff changeset
329 SATA_CMD_REV,
624f674f2ad8 6430966 SATA NCQ support is needed in SATA framework and hba drivers
ls24207
parents: 2539
diff changeset
330 NULL,
624f674f2ad8 6430966 SATA NCQ support is needed in SATA framework and hba drivers
ls24207
parents: 2539
diff changeset
331 {
624f674f2ad8 6430966 SATA NCQ support is needed in SATA framework and hba drivers
ls24207
parents: 2539
diff changeset
332 SATA_DIR_READ
624f674f2ad8 6430966 SATA NCQ support is needed in SATA framework and hba drivers
ls24207
parents: 2539
diff changeset
333 },
624f674f2ad8 6430966 SATA NCQ support is needed in SATA framework and hba drivers
ls24207
parents: 2539
diff changeset
334 ATA_ADDR_LBA48,
624f674f2ad8 6430966 SATA NCQ support is needed in SATA framework and hba drivers
ls24207
parents: 2539
diff changeset
335 0,
624f674f2ad8 6430966 SATA NCQ support is needed in SATA framework and hba drivers
ls24207
parents: 2539
diff changeset
336 0,
624f674f2ad8 6430966 SATA NCQ support is needed in SATA framework and hba drivers
ls24207
parents: 2539
diff changeset
337 0,
624f674f2ad8 6430966 SATA NCQ support is needed in SATA framework and hba drivers
ls24207
parents: 2539
diff changeset
338 0,
624f674f2ad8 6430966 SATA NCQ support is needed in SATA framework and hba drivers
ls24207
parents: 2539
diff changeset
339 0,
624f674f2ad8 6430966 SATA NCQ support is needed in SATA framework and hba drivers
ls24207
parents: 2539
diff changeset
340 1,
624f674f2ad8 6430966 SATA NCQ support is needed in SATA framework and hba drivers
ls24207
parents: 2539
diff changeset
341 READ_LOG_EXT_NCQ_ERROR_RECOVERY,
624f674f2ad8 6430966 SATA NCQ support is needed in SATA framework and hba drivers
ls24207
parents: 2539
diff changeset
342 0,
624f674f2ad8 6430966 SATA NCQ support is needed in SATA framework and hba drivers
ls24207
parents: 2539
diff changeset
343 0,
624f674f2ad8 6430966 SATA NCQ support is needed in SATA framework and hba drivers
ls24207
parents: 2539
diff changeset
344 0,
624f674f2ad8 6430966 SATA NCQ support is needed in SATA framework and hba drivers
ls24207
parents: 2539
diff changeset
345 SATAC_READ_LOG_EXT,
624f674f2ad8 6430966 SATA NCQ support is needed in SATA framework and hba drivers
ls24207
parents: 2539
diff changeset
346 0,
624f674f2ad8 6430966 SATA NCQ support is needed in SATA framework and hba drivers
ls24207
parents: 2539
diff changeset
347 0,
624f674f2ad8 6430966 SATA NCQ support is needed in SATA framework and hba drivers
ls24207
parents: 2539
diff changeset
348 0,
624f674f2ad8 6430966 SATA NCQ support is needed in SATA framework and hba drivers
ls24207
parents: 2539
diff changeset
349 };
624f674f2ad8 6430966 SATA NCQ support is needed in SATA framework and hba drivers
ls24207
parents: 2539
diff changeset
350
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
351 /* Warlock directives */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
352
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
353 _NOTE(SCHEME_PROTECTS_DATA("No Mutex Needed", scsi_hba_tran))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
354 _NOTE(SCHEME_PROTECTS_DATA("No Mutex Needed", scsi_device))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
355 _NOTE(SCHEME_PROTECTS_DATA("No Mutex Needed", dev_ops))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
356 _NOTE(SCHEME_PROTECTS_DATA("No Mutex Needed", scsi_extended_sense))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
357 _NOTE(SCHEME_PROTECTS_DATA("No Mutex Needed", scsi_arq_status))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
358 _NOTE(SCHEME_PROTECTS_DATA("No Mutex Needed", ddi_dma_attr))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
359 _NOTE(SCHEME_PROTECTS_DATA("No Mutex Needed", ddi_dma_cookie_t))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
360 _NOTE(SCHEME_PROTECTS_DATA("No Mutex Needed", devctl_ap_state))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
361 _NOTE(MUTEX_PROTECTS_DATA(sata_mutex, sata_hba_list))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
362 _NOTE(DATA_READABLE_WITHOUT_LOCK(sata_hba_list))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
363 _NOTE(MUTEX_PROTECTS_DATA(sata_mutex, sata_hba_inst::satahba_next))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
364 _NOTE(MUTEX_PROTECTS_DATA(sata_mutex, sata_hba_inst::satahba_prev))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
365 _NOTE(SCHEME_PROTECTS_DATA("No Mutex Needed", \
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
366 sata_hba_inst::satahba_scsi_tran))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
367 _NOTE(SCHEME_PROTECTS_DATA("No Mutex Needed", sata_hba_inst::satahba_tran))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
368 _NOTE(SCHEME_PROTECTS_DATA("No Mutex Needed", sata_hba_inst::satahba_dip))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
369 _NOTE(SCHEME_PROTECTS_DATA("Scheme", sata_hba_inst::satahba_attached))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
370 _NOTE(DATA_READABLE_WITHOUT_LOCK(sata_hba_inst::satahba_dev_port))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
371 _NOTE(MUTEX_PROTECTS_DATA(sata_hba_inst::satahba_mutex,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
372 sata_hba_inst::satahba_event_flags))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
373 _NOTE(MUTEX_PROTECTS_DATA(sata_cport_info::cport_mutex, \
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
374 sata_cport_info::cport_devp))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
375 _NOTE(DATA_READABLE_WITHOUT_LOCK(sata_cport_info::cport_devp))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
376 _NOTE(SCHEME_PROTECTS_DATA("Scheme", sata_cport_info::cport_addr))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
377 _NOTE(MUTEX_PROTECTS_DATA(sata_cport_info::cport_mutex, \
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
378 sata_cport_info::cport_dev_type))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
379 _NOTE(DATA_READABLE_WITHOUT_LOCK(sata_cport_info::cport_dev_type))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
380 _NOTE(MUTEX_PROTECTS_DATA(sata_cport_info::cport_mutex, \
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
381 sata_cport_info::cport_state))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
382 _NOTE(DATA_READABLE_WITHOUT_LOCK(sata_cport_info::cport_state))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
383 _NOTE(DATA_READABLE_WITHOUT_LOCK(sata_pmport_info::pmport_dev_type))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
384 _NOTE(DATA_READABLE_WITHOUT_LOCK(sata_pmport_info::pmport_sata_drive))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
385 _NOTE(DATA_READABLE_WITHOUT_LOCK(sata_pmult_info::pmult_dev_port))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
386 _NOTE(DATA_READABLE_WITHOUT_LOCK(sata_pmult_info::pmult_num_dev_ports))
2553
624f674f2ad8 6430966 SATA NCQ support is needed in SATA framework and hba drivers
ls24207
parents: 2539
diff changeset
387 #ifdef SATA_DEBUG
624f674f2ad8 6430966 SATA NCQ support is needed in SATA framework and hba drivers
ls24207
parents: 2539
diff changeset
388 _NOTE(SCHEME_PROTECTS_DATA("No Mutex Needed", mbuf_count))
624f674f2ad8 6430966 SATA NCQ support is needed in SATA framework and hba drivers
ls24207
parents: 2539
diff changeset
389 _NOTE(SCHEME_PROTECTS_DATA("No Mutex Needed", mbuffail_count))
624f674f2ad8 6430966 SATA NCQ support is needed in SATA framework and hba drivers
ls24207
parents: 2539
diff changeset
390 #endif
1258
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 /* End of warlock directives */
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 /* ************** loadable module configuration functions ************** */
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 int
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
397 _init()
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 int rval;
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 mutex_init(&sata_mutex, NULL, MUTEX_DRIVER, NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
402 mutex_init(&sata_event_mutex, NULL, MUTEX_DRIVER, NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
403 mutex_init(&sata_log_mutex, NULL, MUTEX_DRIVER, NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
404 cv_init(&sata_event_cv, NULL, CV_DRIVER, NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
405 if ((rval = mod_install(&modlinkage)) != 0) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
406 #ifdef SATA_DEBUG
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
407 cmn_err(CE_WARN, "sata: _init: mod_install failed\n");
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
408 #endif
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
409 mutex_destroy(&sata_log_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
410 cv_destroy(&sata_event_cv);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
411 mutex_destroy(&sata_event_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
412 mutex_destroy(&sata_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
413 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
414 return (rval);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
415 }
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 int
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
418 _fini()
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 int rval;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
421
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
422 if ((rval = mod_remove(&modlinkage)) != 0)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
423 return (rval);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
424
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
425 mutex_destroy(&sata_log_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
426 cv_destroy(&sata_event_cv);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
427 mutex_destroy(&sata_event_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
428 mutex_destroy(&sata_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
429 return (rval);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
430 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
431
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
432 int
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
433 _info(struct modinfo *modinfop)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
434 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
435 return (mod_info(&modlinkage, modinfop));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
436 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
437
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
438
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 /* ********************* SATA HBA entry points ********************* */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
441
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 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
444 * Called by SATA HBA from _init().
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
445 * Registers HBA driver instance/sata framework pair with scsi framework, by
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
446 * calling scsi_hba_init().
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
447 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
448 * 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
449 * instead. SATA HBA framework cb_ops pointer overwrites SATA HBA driver
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
450 * cb_ops pointer in SATA HBA driver dev_ops structure.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
451 * 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
452 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
453 * 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
454 * driver.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
455 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
456 int
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
457 sata_hba_init(struct modlinkage *modlp)
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 int rval;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
460 struct dev_ops *hba_ops;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
461
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
462 SATADBG1(SATA_DBG_HBA_IF, NULL,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
463 "sata_hba_init: name %s \n",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
464 ((struct modldrv *)(modlp->ml_linkage[0]))->drv_linkinfo);
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 * Fill-up cb_ops and dev_ops when necessary
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
467 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
468 hba_ops = ((struct modldrv *)(modlp->ml_linkage[0]))->drv_dev_ops;
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 * Provide pointer to SATA dev_ops
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 hba_ops->devo_cb_ops = &sata_cb_ops;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
473
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
474 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
475 * Register SATA HBA with SCSI framework
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 if ((rval = scsi_hba_init(modlp)) != 0) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
478 SATADBG1(SATA_DBG_HBA_IF, NULL,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
479 "sata_hba_init: scsi hba init failed\n", NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
480 return (rval);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
481 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
482
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
483 return (0);
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
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
486
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
487 /* HBA attach stages */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
488 #define HBA_ATTACH_STAGE_SATA_HBA_INST 1
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
489 #define HBA_ATTACH_STAGE_SCSI_ATTACHED 2
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
490 #define HBA_ATTACH_STAGE_SETUP 4
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
491 #define HBA_ATTACH_STAGE_LINKED 8
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 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
495 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
496 * 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
497 * the HBA.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
498 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
499 * For DDI_ATTACH command:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
500 * sata_hba_inst structure is allocated here and initialized with pointers to
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
501 * SATA framework implementation of required scsi tran functions.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
502 * 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
503 * to the soft structure (sata_hba_inst) allocated by SATA framework for
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
504 * SATA HBA instance related data.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
505 * 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
506 * store a pointer to per-HBA-instance of sata_hba_inst structure.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
507 * The sata_hba_inst structure is cross-linked to scsi tran structure.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
508 * 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
509 * 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
510 * linked together into the list, pointed to by sata_hba_list.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
511 * On the first HBA instance attach the sata event thread is initialized.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
512 * 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
513 * 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
514 * 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
515 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
516 * DDI_SUCCESS is returned when attachment process is successful,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
517 * DDI_FAILURE is returned otherwise.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
518 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
519 * For DDI_RESUME command:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
520 * Not implemented at this time (postponed until phase 2 of the development).
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 int
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
523 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
524 ddi_attach_cmd_t cmd)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
525 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
526 sata_hba_inst_t *sata_hba_inst;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
527 scsi_hba_tran_t *scsi_tran = NULL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
528 int hba_attach_state = 0;
1781
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
529 char taskq_name[MAXPATHLEN];
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
530
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
531 SATADBG3(SATA_DBG_HBA_IF, NULL,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
532 "sata_hba_attach: node %s (%s%d)\n",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
533 ddi_node_name(dip), ddi_driver_name(dip),
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
534 ddi_get_instance(dip));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
535
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
536 if (cmd == DDI_RESUME) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
537 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
538 * Postponed until phase 2 of the development
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 return (DDI_FAILURE);
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
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
543 if (cmd != DDI_ATTACH) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
544 return (DDI_FAILURE);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
545 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
546
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
547 /* cmd == DDI_ATTACH */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
548
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
549 if (sata_validate_sata_hba_tran(dip, sata_tran) != SATA_SUCCESS) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
550 SATA_LOG_D((NULL, CE_WARN,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
551 "sata_hba_attach: invalid sata_hba_tran"));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
552 return (DDI_FAILURE);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
553 }
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 * Allocate and initialize SCSI tran structure.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
556 * SATA copy of tran_bus_config is provided to create port nodes.
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 scsi_tran = scsi_hba_tran_alloc(dip, SCSI_HBA_CANSLEEP);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
559 if (scsi_tran == NULL)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
560 return (DDI_FAILURE);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
561 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
562 * Allocate soft structure for SATA HBA instance.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
563 * There is a separate softstate for each HBA instance.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
564 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
565 sata_hba_inst = kmem_zalloc(sizeof (struct sata_hba_inst), KM_SLEEP);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
566 ASSERT(sata_hba_inst != NULL); /* this should not fail */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
567 mutex_init(&sata_hba_inst->satahba_mutex, NULL, MUTEX_DRIVER, NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
568 hba_attach_state |= HBA_ATTACH_STAGE_SATA_HBA_INST;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
569
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
570 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
571 * 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
572 * soft structure allocated by SATA framework for
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
573 * SATA HBA instance related data.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
574 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
575 scsi_tran->tran_hba_private = sata_hba_inst;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
576 scsi_tran->tran_tgt_private = NULL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
577
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
578 scsi_tran->tran_tgt_init = sata_scsi_tgt_init;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
579 scsi_tran->tran_tgt_probe = sata_scsi_tgt_probe;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
580 scsi_tran->tran_tgt_free = sata_scsi_tgt_free;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
581
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
582 scsi_tran->tran_start = sata_scsi_start;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
583 scsi_tran->tran_reset = sata_scsi_reset;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
584 scsi_tran->tran_abort = sata_scsi_abort;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
585 scsi_tran->tran_getcap = sata_scsi_getcap;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
586 scsi_tran->tran_setcap = sata_scsi_setcap;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
587 scsi_tran->tran_init_pkt = sata_scsi_init_pkt;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
588 scsi_tran->tran_destroy_pkt = sata_scsi_destroy_pkt;
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 scsi_tran->tran_dmafree = sata_scsi_dmafree;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
591 scsi_tran->tran_sync_pkt = sata_scsi_sync_pkt;
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 scsi_tran->tran_reset_notify = NULL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
594 scsi_tran->tran_get_bus_addr = NULL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
595 scsi_tran->tran_quiesce = NULL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
596 scsi_tran->tran_unquiesce = NULL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
597 scsi_tran->tran_bus_reset = NULL;
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 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
600 scsi_tran, 0) != DDI_SUCCESS) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
601 #ifdef SATA_DEBUG
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
602 cmn_err(CE_WARN, "?SATA: %s%d hba scsi attach failed",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
603 ddi_driver_name(dip), ddi_get_instance(dip));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
604 #endif
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
605 goto fail;
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 hba_attach_state |= HBA_ATTACH_STAGE_SCSI_ATTACHED;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
608
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
609 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
610 if (ddi_prop_update_int(DDI_DEV_T_NONE, dip,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
611 "sata", 1) != DDI_PROP_SUCCESS) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
612 SATA_LOG_D((NULL, CE_WARN, "sata_hba_attach: "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
613 "failed to create hba sata prop"));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
614 goto fail;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
615 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
616 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
617
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
618 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
619 * Save pointers in hba instance soft state.
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 sata_hba_inst->satahba_scsi_tran = scsi_tran;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
622 sata_hba_inst->satahba_tran = sata_tran;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
623 sata_hba_inst->satahba_dip = dip;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
624
1781
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
625 /*
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
626 * Create a task queue to handle emulated commands completion
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
627 * Use node name, dash, instance number as the queue name.
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
628 */
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
629 taskq_name[0] = '\0';
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
630 (void) strlcat(taskq_name, DEVI(dip)->devi_node_name,
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
631 sizeof (taskq_name));
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
632 (void) snprintf(taskq_name + strlen(taskq_name),
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
633 sizeof (taskq_name) - strlen(taskq_name),
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
634 "-%d", DEVI(dip)->devi_instance);
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
635 sata_hba_inst->satahba_taskq = taskq_create(taskq_name, 1,
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
636 minclsyspri, 1, sata_tran->sata_tran_hba_num_cports,
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
637 TASKQ_DYNAMIC);
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
638
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
639 hba_attach_state |= HBA_ATTACH_STAGE_SETUP;
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 * Create events thread if not created yet.
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 sata_event_thread_control(1);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
645
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
646 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
647 * Link this hba instance into the list.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
648 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
649 mutex_enter(&sata_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
650
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
651
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
652 sata_hba_inst->satahba_next = NULL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
653 sata_hba_inst->satahba_prev = sata_hba_list_tail;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
654 if (sata_hba_list == NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
655 sata_hba_list = sata_hba_inst;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
656 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
657 if (sata_hba_list_tail != NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
658 sata_hba_list_tail->satahba_next = sata_hba_inst;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
659 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
660 sata_hba_list_tail = sata_hba_inst;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
661 mutex_exit(&sata_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
662 hba_attach_state |= HBA_ATTACH_STAGE_LINKED;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
663
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
664 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
665 * Create SATA HBA devctl minor node for sata_hba_open, close, ioctl
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
666 * SATA HBA driver should not use its own open/close entry points.
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 * Make sure that instance number doesn't overflow
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
669 * when forming minor numbers.
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 ASSERT(ddi_get_instance(dip) <= (L_MAXMIN >> INST_MINOR_SHIFT));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
672 if (ddi_create_minor_node(dip, "devctl", S_IFCHR,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
673 INST2DEVCTL(ddi_get_instance(dip)),
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
674 DDI_NT_SATA_NEXUS, 0) != DDI_SUCCESS) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
675 #ifdef SATA_DEBUG
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
676 cmn_err(CE_WARN, "sata_hba_attach: "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
677 "cannot create devctl minor node");
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
678 #endif
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
679 goto fail;
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
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
682
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
683 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
684 * Set-up kstats here, if necessary.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
685 * (postponed until phase 2 of the development).
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
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
688
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
689 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
690 * Probe controller ports. This operation will describe a current
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
691 * controller/port/multipliers/device configuration and will create
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
692 * attachment points.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
693 * We may end-up with just a controller with no devices attached.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
694 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
695 sata_probe_ports(sata_hba_inst);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
696
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
697 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
698 * Create child nodes for all possible target devices currently
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
699 * attached to controller's ports and port multiplier device ports.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
700 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
701 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
702
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
703 sata_hba_inst->satahba_attached = 1;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
704 return (DDI_SUCCESS);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
705
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
706 fail:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
707 if (hba_attach_state & HBA_ATTACH_STAGE_LINKED) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
708 (void) sata_remove_hba_instance(dip);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
709 if (sata_hba_list == NULL)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
710 sata_event_thread_control(0);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
711 }
1781
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
712
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
713 if (hba_attach_state & HBA_ATTACH_STAGE_SETUP) {
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
714 (void) ddi_prop_remove(DDI_DEV_T_ANY, dip, "sata");
1781
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
715 taskq_destroy(sata_hba_inst->satahba_taskq);
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
716 }
1258
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 if (hba_attach_state & HBA_ATTACH_STAGE_SCSI_ATTACHED)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
719 (void) scsi_hba_detach(dip);
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 if (hba_attach_state & HBA_ATTACH_STAGE_SATA_HBA_INST) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
722 mutex_destroy(&sata_hba_inst->satahba_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
723 kmem_free((void *)sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
724 sizeof (struct sata_hba_inst));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
725 scsi_hba_tran_free(scsi_tran);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
726 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
727
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
728 sata_log(NULL, CE_WARN, "?SATA: %s%d hba attach failed",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
729 ddi_driver_name(dip), ddi_get_instance(dip));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
730
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
731 return (DDI_FAILURE);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
732 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
733
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
734
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 * Called by SATA HBA from to detach an instance of the driver.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
737 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
738 * For DDI_DETACH command:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
739 * Free local structures allocated for SATA HBA instance during
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
740 * sata_hba_attach processing.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
741 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
742 * Returns DDI_SUCCESS when HBA was detached, DDI_FAILURE otherwise.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
743 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
744 * For DDI_SUSPEND command:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
745 * Not implemented at this time (postponed until phase 2 of the development)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
746 * Returnd DDI_SUCCESS.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
747 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
748 * When the last HBA instance is detached, the event daemon is terminated.
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 * NOTE: cport support only, no port multiplier support.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
751 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
752 int
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
753 sata_hba_detach(dev_info_t *dip, ddi_detach_cmd_t cmd)
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 dev_info_t *tdip;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
756 sata_hba_inst_t *sata_hba_inst;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
757 scsi_hba_tran_t *scsi_hba_tran;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
758 sata_cport_info_t *cportinfo;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
759 sata_drive_info_t *sdinfo;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
760 int ncport;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
761
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
762 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
763 ddi_node_name(dip), ddi_driver_name(dip), ddi_get_instance(dip));
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 switch (cmd) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
766 case DDI_DETACH:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
767
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
768 if ((scsi_hba_tran = ddi_get_driver_private(dip)) == NULL)
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 sata_hba_inst = scsi_hba_tran->tran_hba_private;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
772 if (sata_hba_inst == NULL)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
773 return (DDI_FAILURE);
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 if (scsi_hba_detach(dip) == DDI_FAILURE) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
776 sata_hba_inst->satahba_attached = 1;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
777 return (DDI_FAILURE);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
778 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
779
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 * Free all target nodes - at this point
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
782 * devices should be at least offlined
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
783 * otherwise scsi_hba_detach() should not be called.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
784 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
785 for (ncport = 0; ncport < SATA_NUM_CPORTS(sata_hba_inst);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
786 ncport++) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
787 cportinfo = SATA_CPORT_INFO(sata_hba_inst, ncport);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
788 if (cportinfo->cport_dev_type != SATA_DTYPE_PMULT) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
789 sdinfo = SATA_CPORTINFO_DRV_INFO(cportinfo);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
790 if (sdinfo != NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
791 tdip = sata_get_target_dip(dip,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
792 ncport);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
793 if (tdip != NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
794 if (ndi_devi_offline(tdip,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
795 NDI_DEVI_REMOVE) !=
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
796 NDI_SUCCESS) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
797 SATA_LOG_D((
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
798 sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
799 CE_WARN,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
800 "sata_hba_detach: "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
801 "Target node not "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
802 "removed !"));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
803 return (DDI_FAILURE);
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 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
806 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
807 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
808 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
809 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
810 * Disable sata event daemon processing for this HBA
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
811 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
812 sata_hba_inst->satahba_attached = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
813
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
814 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
815 * Remove event daemon thread, if it is last HBA instance.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
816 */
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 mutex_enter(&sata_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
819 if (sata_hba_list->satahba_next == NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
820 mutex_exit(&sata_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
821 sata_event_thread_control(0);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
822 mutex_enter(&sata_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
823 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
824 mutex_exit(&sata_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
825
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
826 /* Remove this HBA instance from the HBA list */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
827 sata_remove_hba_instance(dip);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
828
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
829 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
830 * At this point there should be no target nodes attached.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
831 * Detach and destroy device and port info structures.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
832 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
833 for (ncport = 0; ncport < SATA_NUM_CPORTS(sata_hba_inst);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
834 ncport++) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
835 cportinfo = SATA_CPORT_INFO(sata_hba_inst, ncport);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
836 if (cportinfo->cport_dev_type != SATA_DTYPE_PMULT) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
837 sdinfo =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
838 cportinfo->cport_devp.cport_sata_drive;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
839 if (sdinfo != NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
840 /* Release device structure */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
841 kmem_free(sdinfo,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
842 sizeof (sata_drive_info_t));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
843 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
844 /* Release cport info */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
845 mutex_destroy(&cportinfo->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
846 kmem_free(cportinfo,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
847 sizeof (sata_cport_info_t));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
848 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
849 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
850
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
851 scsi_hba_tran_free(sata_hba_inst->satahba_scsi_tran);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
852
1781
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
853 (void) ddi_prop_remove(DDI_DEV_T_ANY, dip, "sata");
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
854
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
855 taskq_destroy(sata_hba_inst->satahba_taskq);
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
856
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
857 mutex_destroy(&sata_hba_inst->satahba_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
858 kmem_free((void *)sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
859 sizeof (struct sata_hba_inst));
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 return (DDI_SUCCESS);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
862
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
863 case DDI_SUSPEND:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
864 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
865 * Postponed until phase 2
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
866 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
867 return (DDI_FAILURE);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
868
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
869 default:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
870 return (DDI_FAILURE);
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 }
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
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
875 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
876 * Called by an HBA drive from _fini() routine.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
877 * Unregisters SATA HBA instance/SATA framework pair from the scsi framework.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
878 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
879 void
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
880 sata_hba_fini(struct modlinkage *modlp)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
881 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
882 SATADBG1(SATA_DBG_HBA_IF, NULL,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
883 "sata_hba_fini: name %s\n",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
884 ((struct modldrv *)(modlp->ml_linkage[0]))->drv_linkinfo);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
885
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
886 scsi_hba_fini(modlp);
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
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
889
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
890 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
891 * Default open and close routine for sata_hba framework.
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 * Open devctl node.
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 * Returns:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
898 * 0 if node was open successfully, error code otherwise.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
899 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
900 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
901 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
902
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
903 static int
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
904 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
905 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
906 #ifndef __lock_lint
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
907 _NOTE(ARGUNUSED(credp))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
908 #endif
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
909 int rv = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
910 dev_info_t *dip;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
911 scsi_hba_tran_t *scsi_hba_tran;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
912 sata_hba_inst_t *sata_hba_inst;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
913
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
914 SATADBG1(SATA_DBG_IOCTL_IF, NULL, "sata_hba_open: entered", NULL);
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 if (otyp != OTYP_CHR)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
917 return (EINVAL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
918
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
919 dip = sata_devt_to_devinfo(*devp);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
920 if (dip == NULL)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
921 return (ENXIO);
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 if ((scsi_hba_tran = ddi_get_driver_private(dip)) == NULL)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
924 return (ENXIO);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
925
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
926 sata_hba_inst = scsi_hba_tran->tran_hba_private;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
927 if (sata_hba_inst == NULL || sata_hba_inst->satahba_attached == 0)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
928 return (ENXIO);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
929
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
930 mutex_enter(&sata_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
931 if (flags & FEXCL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
932 if (sata_hba_inst->satahba_open_flag != 0) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
933 rv = EBUSY;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
934 } else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
935 sata_hba_inst->satahba_open_flag =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
936 SATA_DEVCTL_EXOPENED;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
937 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
938 } else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
939 if (sata_hba_inst->satahba_open_flag == SATA_DEVCTL_EXOPENED) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
940 rv = EBUSY;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
941 } else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
942 sata_hba_inst->satahba_open_flag =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
943 SATA_DEVCTL_SOPENED;
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 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
946 mutex_exit(&sata_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
947
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
948 return (rv);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
949 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
950
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
951
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
952 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
953 * Close devctl node.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
954 * Returns:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
955 * 0 if node was closed successfully, error code otherwise.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
956 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
957 */
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 static int
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
960 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
961 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
962 #ifndef __lock_lint
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
963 _NOTE(ARGUNUSED(credp))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
964 _NOTE(ARGUNUSED(flag))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
965 #endif
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
966 dev_info_t *dip;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
967 scsi_hba_tran_t *scsi_hba_tran;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
968 sata_hba_inst_t *sata_hba_inst;
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 SATADBG1(SATA_DBG_IOCTL_IF, NULL, "sata_hba_close: entered", NULL);
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 if (otyp != OTYP_CHR)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
973 return (EINVAL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
974
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
975 dip = sata_devt_to_devinfo(dev);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
976 if (dip == NULL)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
977 return (ENXIO);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
978
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
979 if ((scsi_hba_tran = ddi_get_driver_private(dip)) == NULL)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
980 return (ENXIO);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
981
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
982 sata_hba_inst = scsi_hba_tran->tran_hba_private;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
983 if (sata_hba_inst == NULL || sata_hba_inst->satahba_attached == 0)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
984 return (ENXIO);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
985
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
986 mutex_enter(&sata_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
987 sata_hba_inst->satahba_open_flag = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
988 mutex_exit(&sata_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
989 return (0);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
990 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
991
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
992
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
993
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 * Standard IOCTL commands for SATA hotplugging.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
996 * Implemented DEVCTL_AP commands:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
997 * DEVCTL_AP_CONNECT
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
998 * DEVCTL_AP_DISCONNECT
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
999 * DEVCTL_AP_CONFIGURE
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1000 * DEVCTL_UNCONFIGURE
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1001 * DEVCTL_AP_CONTROL
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1002 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1003 * Commands passed to default ndi ioctl handler:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1004 * DEVCTL_DEVICE_GETSTATE
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1005 * DEVCTL_DEVICE_ONLINE
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1006 * DEVCTL_DEVICE_OFFLINE
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1007 * DEVCTL_DEVICE_REMOVE
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1008 * DEVCTL_DEVICE_INSERT
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1009 * DEVCTL_BUS_GETSTATE
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 * 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
1012 * if not.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1013 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1014 * Returns:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1015 * 0 if successful,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1016 * error code if operation failed.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1017 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1018 * NOTE: Port Multiplier is not supported.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1019 *
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
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1022 static int
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1023 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
1024 int *rvalp)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1025 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1026 #ifndef __lock_lint
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1027 _NOTE(ARGUNUSED(credp))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1028 _NOTE(ARGUNUSED(rvalp))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1029 #endif
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1030 int rv = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1031 int32_t comp_port = -1;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1032 dev_info_t *dip, *tdip;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1033 devctl_ap_state_t ap_state;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1034 struct devctl_iocdata *dcp = NULL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1035 scsi_hba_tran_t *scsi_hba_tran;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1036 sata_hba_inst_t *sata_hba_inst;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1037 sata_device_t sata_device;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1038 sata_drive_info_t *sdinfo;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1039 sata_cport_info_t *cportinfo;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1040 int cport, pmport, qual;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1041 int rval = SATA_SUCCESS;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1042
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1043 dip = sata_devt_to_devinfo(dev);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1044 if (dip == NULL)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1045 return (ENXIO);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1046
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1047 if ((scsi_hba_tran = ddi_get_driver_private(dip)) == NULL)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1048 return (ENXIO);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1049
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1050 sata_hba_inst = scsi_hba_tran->tran_hba_private;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1051 if (sata_hba_inst == NULL)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1052 return (ENXIO);
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 if (sata_hba_inst->satahba_tran == NULL)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1055 return (ENXIO);
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 switch (cmd) {
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 case DEVCTL_DEVICE_GETSTATE:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1060 case DEVCTL_DEVICE_ONLINE:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1061 case DEVCTL_DEVICE_OFFLINE:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1062 case DEVCTL_DEVICE_REMOVE:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1063 case DEVCTL_BUS_GETSTATE:
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 * There may be more cases that we want to pass to default
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1066 * handler rather then fail them.
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 return (ndi_devctl_ioctl(dip, cmd, arg, mode, 0));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1069 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1070
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1071 /* read devctl ioctl data */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1072 if (cmd != DEVCTL_AP_CONTROL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1073 if (ndi_dc_allochdl((void *)arg, &dcp) != NDI_SUCCESS)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1074 return (EFAULT);
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 if ((comp_port = sata_get_port_num(sata_hba_inst, dcp)) ==
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1077 -1) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1078 if (dcp)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1079 ndi_dc_freehdl(dcp);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1080 return (EINVAL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1081 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1082
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1083 cport = SCSI_TO_SATA_CPORT(comp_port);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1084 pmport = SCSI_TO_SATA_PMPORT(comp_port);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1085 /* Only cport is considered now, i.e. SATA_ADDR_CPORT */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1086 qual = SATA_ADDR_CPORT;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1087 if (sata_validate_sata_address(sata_hba_inst, cport, pmport,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1088 qual) != 0) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1089 ndi_dc_freehdl(dcp);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1090 return (EINVAL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1091 }
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 cportinfo = SATA_CPORT_INFO(sata_hba_inst, cport);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1094 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, cport)->
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1095 cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1096 if (cportinfo->cport_event_flags & SATA_EVNT_LOCK_PORT_BUSY) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1097 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1098 * Cannot process ioctl request now. Come back later.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1099 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1100 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1101 cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1102 ndi_dc_freehdl(dcp);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1103 return (EBUSY);
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 /* Block event processing for this port */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1106 cportinfo->cport_event_flags |= SATA_APCTL_LOCK_PORT_BUSY;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1107 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1108
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1109 sata_device.satadev_addr.cport = cport;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1110 sata_device.satadev_addr.pmport = pmport;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1111 sata_device.satadev_addr.qual = SATA_ADDR_CPORT;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1112 sata_device.satadev_rev = SATA_DEVICE_REV;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1113 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1114
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1115 switch (cmd) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1116
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1117 case DEVCTL_AP_DISCONNECT:
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 * Normally, cfgadm sata plugin will try to offline
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1120 * (unconfigure) device before this request. Nevertheless,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1121 * if a device is still configured, we need to
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1122 * attempt to offline and unconfigure device first, and we will
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1123 * deactivate the port regardless of the unconfigure
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1124 * operation results.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1125 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1126 * DEVCTL_AP_DISCONNECT invokes
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1127 * sata_hba_inst->satahba_tran->
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1128 * sata_tran_hotplug_ops->sata_tran_port_deactivate().
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1129 * If successful, the device structure (if any) attached
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1130 * to a port is removed and state of the port marked
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1131 * appropriately.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1132 * Failure of the port_deactivate may keep port in
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1133 * the active state, or may fail the port.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1134 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1135
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1136 /* Check the current state of the port */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1137 if (sata_reprobe_port(sata_hba_inst, &sata_device) !=
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1138 SATA_SUCCESS) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1139 rv = EIO;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1140 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1141 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1142 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, cport)->
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1143 cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1144 if (cportinfo->cport_state &
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1145 (SATA_PSTATE_SHUTDOWN | SATA_PSTATE_FAILED)) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1146 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1147 cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1148 rv = EIO;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1149 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1150 }
1529
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
1151 /* Sanity check */
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
1152 if (SATA_PORT_DEACTIVATE_FUNC(sata_hba_inst) == NULL) {
1940
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
1153 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
1154 cport_mutex);
1529
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
1155 /* No physical port deactivation supported. */
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
1156 break;
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
1157 }
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
1158
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1159 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1160 * set port's dev_state to not ready - this will disable
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1161 * an access to an attached device.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1162 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1163 cportinfo->cport_state &= ~SATA_STATE_READY;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1164
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1165 if (cportinfo->cport_dev_type != SATA_DTYPE_NONE) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1166 sdinfo = cportinfo->cport_devp.cport_sata_drive;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1167 ASSERT(sdinfo != NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1168 if ((sdinfo->satadrv_type &
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1169 (SATA_VALID_DEV_TYPE))) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1170 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1171 * If a target node exists, try to offline
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1172 * a device and remove target node.
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 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1175 cport)->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1176 tdip = sata_get_target_dip(dip, comp_port);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1177 if (tdip != NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1178 /* target node exist */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1179 if (ndi_devi_offline(tdip,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1180 NDI_DEVI_REMOVE) != NDI_SUCCESS) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1181 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1182 * Problem
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1183 * A target node remained
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1184 * attached. This happens when
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1185 * the file was open or a node
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1186 * was waiting for resources.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1187 * Cannot do anything about it.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1188 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1189 SATA_LOG_D((sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1190 CE_WARN,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1191 "sata_hba_ioctl: "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1192 "disconnect: cannot "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1193 "remove target node!!!"));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1194 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1195 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1196 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1197 cport)->cport_mutex);
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 * Remove and release sata_drive_info
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1200 * structure.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1201 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1202 if (SATA_CPORTINFO_DRV_INFO(cportinfo) !=
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1203 NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1204 SATA_CPORTINFO_DRV_INFO(cportinfo) =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1205 NULL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1206 (void) kmem_free((void *)sdinfo,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1207 sizeof (sata_drive_info_t));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1208 cportinfo->cport_dev_type =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1209 SATA_DTYPE_NONE;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1210 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1211 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1212 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1213 * Note: PMult info requires different handling.
1529
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
1214 * Put PMult handling code here, when PMult is
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1215 * supported.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1216 */
1529
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
1217
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1218 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1219 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1220 /* Just ask HBA driver to deactivate port */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1221 sata_device.satadev_addr.qual = SATA_ADDR_DCPORT;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1222
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1223 rval = (*SATA_PORT_DEACTIVATE_FUNC(sata_hba_inst))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1224 (dip, &sata_device);
1529
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
1225
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
1226 /*
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
1227 * Generate sysevent - EC_DR / ESC_DR_AP_STATE_CHANGE
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
1228 * without the hint.
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
1229 */
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
1230 sata_gen_sysevent(sata_hba_inst,
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
1231 &sata_device.satadev_addr, SE_NO_HINT);
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
1232
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1233 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, cport)->
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1234 cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1235 sata_update_port_info(sata_hba_inst, &sata_device);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1236
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1237 if (rval != SATA_SUCCESS) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1238 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1239 * Port deactivation failure - do not
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1240 * change port state unless the state
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1241 * returned by HBA indicates a port failure.
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_device.satadev_state & SATA_PSTATE_FAILED)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1244 cportinfo->cport_state = SATA_PSTATE_FAILED;
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 } else {
1529
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
1247 /*
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
1248 * Deactivation succeded. From now on the framework
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
1249 * will not know what is happening to the device, until
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
1250 * the port is activated again.
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
1251 */
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1252 cportinfo->cport_state |= SATA_PSTATE_SHUTDOWN;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1253 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1254 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
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 case DEVCTL_AP_UNCONFIGURE:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1258
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 * The unconfigure operation uses generic nexus operation to
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1261 * offline a device. It leaves a target device node attached.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1262 * and obviously sata_drive_info attached as well, because
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1263 * from the hardware point of view nothing has changed.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1264 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1265 if ((tdip = sata_get_target_dip(dip, comp_port)) != NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1266
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1267 if (ndi_devi_offline(tdip, NDI_UNCONFIG) !=
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1268 NDI_SUCCESS) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1269 SATA_LOG_D((sata_hba_inst, CE_WARN,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1270 "sata_hba_ioctl: unconfigure: "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1271 "failed to unconfigure "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1272 "device at cport %d", cport));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1273 rv = EIO;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1274 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1275 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1276 * The target node devi_state should be marked with
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1277 * DEVI_DEVICE_OFFLINE by ndi_devi_offline().
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1278 * This would be the indication for cfgadm that
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1279 * the AP node occupant state is 'unconfigured'.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1280 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1281
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1282 } else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1283 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1284 * This would indicate a failure on the part of cfgadm
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1285 * to detect correct state of the node prior to this
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1286 * call - one cannot unconfigure non-existing device.
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 SATA_LOG_D((sata_hba_inst, CE_WARN,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1289 "sata_hba_ioctl: unconfigure: "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1290 "attempt to unconfigure non-existing device "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1291 "at cport %d", cport));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1292 rv = ENXIO;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1293 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1294
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1295 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1296
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1297 case DEVCTL_AP_CONNECT:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1298 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1299 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1300 * The sata cfgadm pluging will invoke this operation only if
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1301 * port was found in the disconnect state (failed state
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1302 * is also treated as the disconnected state).
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1303 * DEVCTL_AP_CONNECT would invoke
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1304 * sata_hba_inst->satahba_tran->
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1305 * sata_tran_hotplug_ops->sata_tran_port_activate().
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1306 * If successful and a device is found attached to the port,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1307 * the initialization sequence is executed to attach
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1308 * a device structure to a port structure. The device is not
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1309 * set in configured state (system-wise) by this operation.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1310 * The state of the port and a device would be set
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1311 * appropriately.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1312 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1313 * Note, that activating the port may generate link events,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1314 * so is is important that following processing and the
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1315 * event processing does not interfere with each other!
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1316 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1317 * This operation may remove port failed state and will
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1318 * try to make port active and in good standing.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1319 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1320
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1321 /* We only care about host sata cport for now */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1322
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1323 if (SATA_PORT_ACTIVATE_FUNC(sata_hba_inst) != NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1324 /* Just let HBA driver to activate port */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1325
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1326 if ((*SATA_PORT_ACTIVATE_FUNC(sata_hba_inst))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1327 (dip, &sata_device) != SATA_SUCCESS) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1328 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1329 * Port activation failure.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1330 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1331 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1332 cport)->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1333 sata_update_port_info(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1334 &sata_device);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1335 if (sata_device.satadev_state &
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1336 SATA_PSTATE_FAILED) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1337 cportinfo->cport_state =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1338 SATA_PSTATE_FAILED;
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 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1341 cport)->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1342 SATA_LOG_D((sata_hba_inst, CE_WARN,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1343 "sata_hba_ioctl: connect: "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1344 "failed to activate SATA cport %d",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1345 cport));
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 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1350 /* Virgin port state - will be updated by the port re-probe. */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1351 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1352 cport)->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1353 cportinfo->cport_state = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1354 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1355 cport)->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1356
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1357 if (sata_reprobe_port(sata_hba_inst, &sata_device) ==
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1358 SATA_FAILURE)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1359 rv = EIO;
1529
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
1360 /*
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
1361 * Generate sysevent - EC_DR / ESC_DR_AP_STATE_CHANGE
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
1362 * without the hint
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
1363 */
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
1364 sata_gen_sysevent(sata_hba_inst,
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
1365 &sata_device.satadev_addr, SE_NO_HINT);
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1366 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1367 * If there is a device attached to the port, emit
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1368 * a message.
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 if (cportinfo->cport_dev_type != SATA_DTYPE_NONE) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1371 sata_log(sata_hba_inst, CE_WARN,
1529
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
1372 "SATA device detected at port %d", cport);
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1373 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1374 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1375 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1376
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1377 case DEVCTL_AP_CONFIGURE:
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 boolean_t target = TRUE;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1380
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1381 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1382 * A port may be in an active or shutdown state.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1383 * If port is in a failed state, operation is aborted - one
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1384 * has to use explicit connect or port activate request
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1385 * to try to get a port into non-failed mode.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1386 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1387 * If a port is in a shutdown state, arbitrarily invoke
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1388 * sata_tran_port_activate() prior to any other operation.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1389 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1390 * Verify that port state is READY and there is a device
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1391 * of a supported type attached to this port.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1392 * If target node exists, a device was most likely offlined.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1393 * If target node does not exist, create a target node an
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1394 * attempt to online it.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1395 * *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1396 * NO PMult or devices beyond PMult are supported yet.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1397 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1398
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1399 /* We only care about host controller's sata cport for now. */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1400 if (cportinfo->cport_state & SATA_PSTATE_FAILED) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1401 rv = ENXIO;
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 /* Check the current state of the port */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1405 sata_device.satadev_addr.qual = SATA_ADDR_CPORT;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1406
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1407 rval = (*SATA_PROBE_PORT_FUNC(sata_hba_inst))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1408 (dip, &sata_device);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1409 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, cport)->
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1410 cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1411 sata_update_port_info(sata_hba_inst, &sata_device);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1412 if (rval != SATA_SUCCESS ||
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1413 (sata_device.satadev_state & SATA_PSTATE_FAILED)) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1414 cportinfo->cport_state = SATA_PSTATE_FAILED;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1415 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1416 cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1417 rv = EIO;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1418 break;
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 if (cportinfo->cport_state & SATA_PSTATE_SHUTDOWN) {
1529
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
1421 target = FALSE;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1422 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1423 cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1424
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1425 if (SATA_PORT_ACTIVATE_FUNC(sata_hba_inst) != NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1426 /* Just let HBA driver to activate port */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1427 if ((*SATA_PORT_ACTIVATE_FUNC(sata_hba_inst))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1428 (dip, &sata_device) != SATA_SUCCESS) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1429 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1430 * Port activation failure - do not
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1431 * change port state unless the state
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1432 * returned by HBA indicates a port
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1433 * failure.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1434 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1435 mutex_enter(&SATA_CPORT_INFO(
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1436 sata_hba_inst, cport)->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1437 sata_update_port_info(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1438 &sata_device);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1439 if (sata_device.satadev_state &
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1440 SATA_PSTATE_FAILED) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1441 cportinfo->cport_state =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1442 SATA_PSTATE_FAILED;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1443 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1444 mutex_exit(&SATA_CPORT_INFO(
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1445 sata_hba_inst, cport)->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1446 SATA_LOG_D((sata_hba_inst, CE_WARN,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1447 "sata_hba_ioctl: configure: "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1448 "failed to activate SATA cport %d",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1449 cport));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1450 rv = EIO;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1451 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1452 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1453 }
1529
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
1454 /*
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
1455 * Generate sysevent - EC_DR / ESC_DR_AP_STATE_CHANGE
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
1456 * without the hint.
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
1457 */
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
1458 sata_gen_sysevent(sata_hba_inst,
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
1459 &sata_device.satadev_addr, SE_NO_HINT);
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
1460
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1461 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, cport)->
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1462 cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1463 /* Virgin port state */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1464 cportinfo->cport_state = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1465 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1466 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1467 * Always reprobe port, to get current device info.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1468 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1469 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1470 if (sata_reprobe_port(sata_hba_inst, &sata_device) !=
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1471 SATA_SUCCESS) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1472 rv = EIO;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1473 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1474 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1475 if (target == FALSE &&
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1476 cportinfo->cport_dev_type != SATA_DTYPE_NONE) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1477 /*
1529
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
1478 * That's the transition from "inactive" port
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
1479 * to active one with device attached.
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1480 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1481 sata_log(sata_hba_inst, CE_WARN,
1529
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
1482 "SATA device detected at port %d",
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1483 cport);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1484 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1485
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1486 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1487 * This is where real configure starts.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1488 * Change following check for PMult support.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1489 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1490 if (!(sata_device.satadev_type & SATA_VALID_DEV_TYPE)) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1491 /* No device to configure */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1492 rv = ENXIO; /* No device to configure */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1493 break;
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
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1496 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1497 * Here we may have a device in reset condition,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1498 * but because we are just configuring it, there is
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1499 * no need to process the reset other than just
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1500 * to clear device reset condition in the HBA driver.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1501 * Setting the flag SATA_EVNT_CLEAR_DEVICE_RESET will
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1502 * cause a first command sent the HBA driver with the request
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1503 * to clear device reset condition.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1504 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1505 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, cport)->
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1506 cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1507 sdinfo = sata_get_device_info(sata_hba_inst, &sata_device);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1508 if (sdinfo == NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1509 rv = ENXIO;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1510 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1511 cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1512 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1513 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1514 if (sdinfo->satadrv_event_flags &
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1515 (SATA_EVNT_DEVICE_RESET | SATA_EVNT_INPROC_DEVICE_RESET))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1516 sdinfo->satadrv_event_flags = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1517 sdinfo->satadrv_event_flags |= SATA_EVNT_CLEAR_DEVICE_RESET;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1518 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
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 if ((tdip = sata_get_target_dip(dip, comp_port)) != NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1521 /* target node still exists */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1522 if (ndi_devi_online(tdip, 0) != NDI_SUCCESS) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1523 SATA_LOG_D((sata_hba_inst, CE_WARN,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1524 "sata_hba_ioctl: configure: "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1525 "onlining device at cport %d failed",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1526 cport));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1527 rv = EIO;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1528 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1529 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1530 } else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1531 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1532 * No target node - need to create a new target node.
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 tdip = sata_create_target_node(dip, sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1535 &sata_device.satadev_addr);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1536 if (tdip == NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1537 /* configure failed */
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: configure: "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1540 "configuring device at cport %d "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1541 "failed", cport));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1542 rv = EIO;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1543 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1544 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1545 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1546
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1547 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1548 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1549
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1550 case DEVCTL_AP_GETSTATE:
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 sata_cfgadm_state(sata_hba_inst, comp_port, &ap_state);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1553
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1554 ap_state.ap_last_change = (time_t)-1;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1555 ap_state.ap_error_code = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1556 ap_state.ap_in_transition = 0;
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 /* Copy the return AP-state information to the user space */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1559 if (ndi_dc_return_ap_state(&ap_state, dcp) != NDI_SUCCESS) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1560 rv = EFAULT;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1561 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1562 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1563
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1564 case DEVCTL_AP_CONTROL:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1565 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1566 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1567 * Generic devctl for hardware specific functionality
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1568 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1569 sata_ioctl_data_t ioc;
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 ASSERT(dcp == NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1572
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1573 /* Copy in user ioctl data first */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1574 #ifdef _MULTI_DATAMODEL
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1575 if (ddi_model_convert_from(mode & FMODELS) ==
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1576 DDI_MODEL_ILP32) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1577
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1578 sata_ioctl_data_32_t ioc32;
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 if (ddi_copyin((void *)arg, (void *)&ioc32,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1581 sizeof (ioc32), mode) != 0) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1582 rv = EFAULT;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1583 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1584 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1585 ioc.cmd = (uint_t)ioc32.cmd;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1586 ioc.port = (uint_t)ioc32.port;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1587 ioc.get_size = (uint_t)ioc32.get_size;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1588 ioc.buf = (caddr_t)(uintptr_t)ioc32.buf;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1589 ioc.bufsiz = (uint_t)ioc32.bufsiz;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1590 ioc.misc_arg = (uint_t)ioc32.misc_arg;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1591 } else
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1592 #endif /* _MULTI_DATAMODEL */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1593 if (ddi_copyin((void *)arg, (void *)&ioc, sizeof (ioc),
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1594 mode) != 0) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1595 return (EFAULT);
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
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1598 SATADBG2(SATA_DBG_IOCTL_IF, sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1599 "sata_hba_ioctl: DEVCTL_AP_CONTROL "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1600 "cmd 0x%x, port 0x%x", ioc.cmd, ioc.port);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1601
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1602 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1603 * 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
1604 * a 32-bit number.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1605 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1606 if (ioc.get_size != 0 && ioc.bufsiz != (sizeof (uint32_t))) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1607 return (EINVAL);
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 /* validate address */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1610 cport = SCSI_TO_SATA_CPORT(ioc.port);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1611 pmport = SCSI_TO_SATA_PMPORT(ioc.port);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1612 qual = SCSI_TO_SATA_ADDR_QUAL(ioc.port);
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 /* Override address qualifier - handle cport only for now */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1615 qual = SATA_ADDR_CPORT;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1616
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1617 if (sata_validate_sata_address(sata_hba_inst, cport,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1618 pmport, qual) != 0)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1619 return (EINVAL);
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 cportinfo = SATA_CPORT_INFO(sata_hba_inst, cport);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1622 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, cport)->
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1623 cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1624 /* Is the port locked by event processing daemon ? */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1625 if (cportinfo->cport_event_flags & SATA_EVNT_LOCK_PORT_BUSY) {
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 * Cannot process ioctl request now. Come back later
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 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1630 cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1631 return (EBUSY);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1632 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1633 /* Block event processing for this port */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1634 cportinfo->cport_event_flags |= SATA_APCTL_LOCK_PORT_BUSY;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1635 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1636
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1637
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1638 sata_device.satadev_addr.cport = cport;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1639 sata_device.satadev_addr.pmport = pmport;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1640 sata_device.satadev_rev = SATA_DEVICE_REV;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1641
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1642 switch (ioc.cmd) {
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 case SATA_CFGA_RESET_PORT:
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 * There is no protection here for configured
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1647 * device.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1648 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1649
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1650 /* Sanity check */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1651 if (SATA_RESET_DPORT_FUNC(sata_hba_inst) == NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1652 SATA_LOG_D((sata_hba_inst, CE_WARN,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1653 "sata_hba_ioctl: "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1654 "sata_hba_tran missing required "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1655 "function sata_tran_reset_dport"));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1656 rv = EINVAL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1657 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1658 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1659
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1660 /* handle cport only for now */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1661 sata_device.satadev_addr.qual = SATA_ADDR_CPORT;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1662 if ((*SATA_RESET_DPORT_FUNC(sata_hba_inst))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1663 (dip, &sata_device) != SATA_SUCCESS) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1664 SATA_LOG_D((sata_hba_inst, CE_WARN,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1665 "sata_hba_ioctl: reset port: "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1666 "failed cport %d pmport %d",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1667 cport, pmport));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1668 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1669 cport)->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1670 sata_update_port_info(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1671 &sata_device);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1672 SATA_CPORT_STATE(sata_hba_inst, cport) =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1673 SATA_PSTATE_FAILED;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1674 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1675 cport)->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1676 rv = EIO;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1677 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1678 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1679 * Since the port was reset, it should be probed and
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1680 * attached device reinitialized. At this point the
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1681 * port state is unknown - it's state is HBA-specific.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1682 * Re-probe port to get its state.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1683 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1684 if (sata_reprobe_port(sata_hba_inst, &sata_device) !=
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1685 SATA_SUCCESS) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1686 rv = EIO;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1687 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1688 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1689 break;
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 case SATA_CFGA_RESET_DEVICE:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1692 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1693 * There is no protection here for configured
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1694 * device.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1695 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1696
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1697 /* Sanity check */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1698 if (SATA_RESET_DPORT_FUNC(sata_hba_inst) == NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1699 SATA_LOG_D((sata_hba_inst, CE_WARN,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1700 "sata_hba_ioctl: "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1701 "sata_hba_tran missing required "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1702 "function sata_tran_reset_dport"));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1703 rv = EINVAL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1704 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1705 }
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 /* handle only device attached to cports, for now */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1708 sata_device.satadev_addr.qual = SATA_ADDR_DCPORT;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1709
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1710 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, cport)->
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1711 cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1712 sdinfo = sata_get_device_info(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1713 &sata_device);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1714 if (sdinfo == NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1715 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1716 cport)->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1717 rv = EINVAL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1718 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1719 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1720 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1721 cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1722
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1723 /* only handle cport for now */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1724 sata_device.satadev_addr.qual = SATA_ADDR_DCPORT;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1725 if ((*SATA_RESET_DPORT_FUNC(sata_hba_inst))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1726 (dip, &sata_device) != SATA_SUCCESS) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1727 SATA_LOG_D((sata_hba_inst, CE_WARN,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1728 "sata_hba_ioctl: reset device: failed "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1729 "cport %d pmport %d", cport, pmport));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1730 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1731 cport)->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1732 sata_update_port_info(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1733 &sata_device);
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 * Device info structure remains
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1736 * attached. Another device reset or
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1737 * port disconnect/connect and re-probing is
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1738 * needed to change it's state
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1739 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1740 sdinfo->satadrv_state &= ~SATA_STATE_READY;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1741 sdinfo->satadrv_state |=
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1742 SATA_DSTATE_FAILED;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1743 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1744 cport)->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1745 rv = EIO;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1746 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1747 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1748 * Since the device was reset, we expect reset event
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1749 * to be reported and processed.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1750 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1751 break;
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 case SATA_CFGA_RESET_ALL:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1754 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1755 int tcport;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1756
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 * There is no protection here for configured
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1759 * devices.
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 /* Sanity check */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1762 if (SATA_RESET_DPORT_FUNC(sata_hba_inst) == NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1763 SATA_LOG_D((sata_hba_inst, CE_WARN,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1764 "sata_hba_ioctl: "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1765 "sata_hba_tran missing required "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1766 "function sata_tran_reset_dport"));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1767 rv = EINVAL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1768 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1769 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1770
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1771 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1772 * Need to lock all ports, not just one.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1773 * If any port is locked by event processing, fail
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1774 * the whole operation.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1775 * One port is already locked, but for simplicity
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1776 * lock it again.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1777 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1778 for (tcport = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1779 tcport < SATA_NUM_CPORTS(sata_hba_inst);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1780 tcport++) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1781 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1782 tcport)->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1783 if (((SATA_CPORT_INFO(sata_hba_inst, tcport)->
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1784 cport_event_flags) &
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1785 SATA_EVNT_LOCK_PORT_BUSY) != 0) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1786 rv = EBUSY;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1787 mutex_exit(
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1788 &SATA_CPORT_INFO(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1789 tcport)->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1790 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1791 } else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1792 SATA_CPORT_INFO(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1793 tcport)->cport_event_flags |=
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1794 SATA_APCTL_LOCK_PORT_BUSY;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1795 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1796 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1797 tcport)->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1798 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1799
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1800 if (rv == 0) {
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 * All cports successfully locked.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1803 * Reset main SATA controller only for now -
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1804 * no PMult.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1805 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1806 sata_device.satadev_addr.qual =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1807 SATA_ADDR_CNTRL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1808
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1809 if ((*SATA_RESET_DPORT_FUNC(sata_hba_inst))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1810 (dip, &sata_device) != SATA_SUCCESS) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1811 SATA_LOG_D((sata_hba_inst, CE_WARN,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1812 "sata_hba_ioctl: reset controller "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1813 "failed"));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1814 rv = EIO;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1815 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1816
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1817 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1818 * Since ports were reset, they should be
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1819 * re-probed and attached devices
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1820 * reinitialized.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1821 * At this point port states are unknown,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1822 * Re-probe ports to get their state -
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1823 * cports only for now.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1824 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1825 for (tcport = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1826 tcport < SATA_NUM_CPORTS(sata_hba_inst);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1827 tcport++) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1828 sata_device.satadev_addr.cport =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1829 tcport;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1830 sata_device.satadev_addr.qual =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1831 SATA_ADDR_CPORT;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1832
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1833 if (sata_reprobe_port(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1834 &sata_device) != SATA_SUCCESS)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1835 rv = EIO;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1836
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1837 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1838 }
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 * Unlock all ports
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1841 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1842 for (tcport = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1843 tcport < SATA_NUM_CPORTS(sata_hba_inst);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1844 tcport++) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1845 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1846 tcport)->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1847 SATA_CPORT_INFO(sata_hba_inst, tcport)->
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1848 cport_event_flags &=
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1849 ~SATA_APCTL_LOCK_PORT_BUSY;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1850 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1851 tcport)->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1852 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1853
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 * This operation returns EFAULT if either reset
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1856 * controller failed or a re-probbing of any ports
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1857 * failed.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1858 * We return here, because common return is for
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1859 * a single cport operation.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1860 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1861 return (rv);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1862 }
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 case SATA_CFGA_PORT_DEACTIVATE:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1865 /* Sanity check */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1866 if (SATA_PORT_DEACTIVATE_FUNC(sata_hba_inst) == NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1867 rv = ENOTSUP;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1868 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1869 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1870 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1871 * Arbitrarily unconfigure attached device, if any.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1872 * Even if the unconfigure fails, proceed with the
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1873 * port deactivation.
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
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1876 /* Handle only device attached to cports, for now */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1877 sata_device.satadev_addr.qual = SATA_ADDR_DCPORT;
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 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, cport)->
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1880 cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1881 cportinfo->cport_state &= ~SATA_STATE_READY;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1882 if (cportinfo->cport_dev_type != SATA_DTYPE_NONE) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1883 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1884 * Handle only device attached to cports,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1885 * for now
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1886 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1887 sata_device.satadev_addr.qual =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1888 SATA_ADDR_DCPORT;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1889 sdinfo = sata_get_device_info(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1890 &sata_device);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1891 if (sdinfo != NULL &&
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1892 (sdinfo->satadrv_type &
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1893 SATA_VALID_DEV_TYPE)) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1894 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1895 * If a target node exists, try to
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1896 * offline a device and remove target
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1897 * node.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1898 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1899 mutex_exit(&SATA_CPORT_INFO(
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1900 sata_hba_inst, cport)->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1901 tdip = sata_get_target_dip(dip, cport);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1902 if (tdip != NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1903 /* target node exist */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1904 SATADBG1(SATA_DBG_IOCTL_IF,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1905 sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1906 "sata_hba_ioctl: "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1907 "port deactivate: "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1908 "target node exists.",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1909 NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1910
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1911 if (ndi_devi_offline(tdip,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1912 NDI_UNCONFIG) !=
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1913 NDI_SUCCESS) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1914 SATA_LOG_D((
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1915 sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1916 CE_WARN,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1917 "sata_hba_ioctl:"
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1918 "port deactivate: "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1919 "failed to "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1920 "unconfigure "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1921 "device at cport "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1922 "%d", cport));
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 if (ndi_devi_offline(tdip,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1925 NDI_DEVI_REMOVE) !=
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1926 NDI_SUCCESS) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1927 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1928 * Problem;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1929 * target node remained
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1930 * attached.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1931 * Too bad...
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1932 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1933 SATA_LOG_D((
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1934 sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1935 CE_WARN,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1936 "sata_hba_ioctl: "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1937 "port deactivate: "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1938 "failed to "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1939 "unconfigure "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1940 "device at "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1941 "cport %d",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1942 cport));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1943 }
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 mutex_enter(&SATA_CPORT_INFO(
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1946 sata_hba_inst, cport)->cport_mutex);
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 * In any case,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1949 * remove and release sata_drive_info
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1950 * structure.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1951 * (cport attached device ony, for now)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1952 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1953 SATA_CPORTINFO_DRV_INFO(cportinfo) =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1954 NULL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1955 (void) kmem_free((void *)sdinfo,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1956 sizeof (sata_drive_info_t));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1957 cportinfo->cport_dev_type =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1958 SATA_DTYPE_NONE;
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 * Note: PMult info requires different
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1962 * handling. This comment is a placeholder for
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1963 * a code handling PMult, to be implemented
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1964 * in phase 2.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1965 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1966 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1967 cportinfo->cport_state &= ~(SATA_STATE_PROBED |
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1968 SATA_STATE_PROBING);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1969 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1970 cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1971 /* handle cport only for now */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1972 sata_device.satadev_addr.qual = SATA_ADDR_CPORT;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1973 /* Just let HBA driver to deactivate port */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1974 rval = (*SATA_PORT_DEACTIVATE_FUNC(sata_hba_inst))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1975 (dip, &sata_device);
1529
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
1976 /*
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
1977 * Generate sysevent -
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
1978 * EC_DR / ESC_DR_AP_STATE_CHANGE
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
1979 * without the hint
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
1980 */
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
1981 sata_gen_sysevent(sata_hba_inst,
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
1982 &sata_device.satadev_addr, SE_NO_HINT);
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
1983
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1984 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, cport)->
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1985 cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1986 sata_update_port_info(sata_hba_inst, &sata_device);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1987 if (rval != SATA_SUCCESS) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1988 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1989 * Port deactivation failure - do not
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1990 * change port state unless the state
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1991 * returned by HBA indicates a port failure.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1992 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1993 if (sata_device.satadev_state &
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1994 SATA_PSTATE_FAILED) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1995 SATA_CPORT_STATE(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1996 cport) = SATA_PSTATE_FAILED;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1997 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1998 SATA_LOG_D((sata_hba_inst, CE_WARN,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
1999 "sata_hba_ioctl: port deactivate: "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2000 "cannot deactivate SATA cport %d",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2001 cport));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2002 rv = EIO;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2003 } else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2004 cportinfo->cport_state |= SATA_PSTATE_SHUTDOWN;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2005 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2006 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2007 cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2008
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2009 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2010
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2011 case SATA_CFGA_PORT_ACTIVATE:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2012 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2013 boolean_t dev_existed = TRUE;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2014
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2015 /* Sanity check */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2016 if (SATA_PORT_ACTIVATE_FUNC(sata_hba_inst) == NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2017 rv = ENOTSUP;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2018 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2019 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2020 /* handle cport only for now */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2021 if (cportinfo->cport_state & SATA_PSTATE_SHUTDOWN ||
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2022 cportinfo->cport_dev_type == SATA_DTYPE_NONE)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2023 dev_existed = FALSE;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2024
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2025 sata_device.satadev_addr.qual = SATA_ADDR_CPORT;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2026 /* Just let HBA driver to activate port */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2027 if ((*SATA_PORT_ACTIVATE_FUNC(sata_hba_inst))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2028 (dip, &sata_device) != SATA_SUCCESS) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2029 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2030 * Port activation failure - do not
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2031 * change port state unless the state
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2032 * returned by HBA indicates a port failure.
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 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2035 cport)->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2036 sata_update_port_info(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2037 &sata_device);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2038 if (sata_device.satadev_state &
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2039 SATA_PSTATE_FAILED) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2040 SATA_CPORT_STATE(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2041 cport) = SATA_PSTATE_FAILED;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2042 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2043 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2044 cport)->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2045 SATA_LOG_D((sata_hba_inst, CE_WARN,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2046 "sata_hba_ioctl: port activate: "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2047 "cannot activate SATA cport %d",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2048 cport));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2049 rv = EIO;
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 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, cport)->
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2053 cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2054 cportinfo->cport_state &= ~SATA_PSTATE_SHUTDOWN;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2055 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2056 cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2057
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2058 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2059 * Re-probe port to find its current state and
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2060 * possibly attached device.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2061 * Port re-probing may change the cportinfo device
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2062 * type if device is found attached.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2063 * If port probing failed, the device type would be
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2064 * set to SATA_DTYPE_NONE.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2065 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2066 (void) sata_reprobe_port(sata_hba_inst, &sata_device);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2067
1529
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
2068 /*
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
2069 * Generate sysevent -
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
2070 * EC_DR / ESC_DR_AP_STATE_CHANGE
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
2071 * without the hint.
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
2072 */
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
2073 sata_gen_sysevent(sata_hba_inst,
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
2074 &sata_device.satadev_addr, SE_NO_HINT);
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
2075
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2076 if (dev_existed == FALSE &&
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2077 cportinfo->cport_dev_type != SATA_DTYPE_NONE) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2078 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2079 * That's the transition from "inactive" port
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2080 * state or active port without a device
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2081 * attached to the active port state with
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2082 * a device attached.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2083 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2084 sata_log(sata_hba_inst, CE_WARN,
1529
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
2085 "SATA device detected at port %d", cport);
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2086 }
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 break;
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
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2091 case SATA_CFGA_PORT_SELF_TEST:
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 /* Sanity check */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2094 if (SATA_SELFTEST_FUNC(sata_hba_inst) == NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2095 rv = ENOTSUP;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2096 break;
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 * There is no protection here for a configured
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2100 * device attached to this port.
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
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2103 /* only handle cport for now */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2104 sata_device.satadev_addr.qual = SATA_ADDR_CPORT;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2105
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2106 if ((*SATA_SELFTEST_FUNC(sata_hba_inst))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2107 (dip, &sata_device) != SATA_SUCCESS) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2108 SATA_LOG_D((sata_hba_inst, CE_WARN,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2109 "sata_hba_ioctl: port selftest: "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2110 "failed cport %d pmport %d",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2111 cport, pmport));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2112 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2113 cport)->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2114 sata_update_port_info(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2115 &sata_device);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2116 SATA_CPORT_STATE(sata_hba_inst, cport) =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2117 SATA_PSTATE_FAILED;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2118 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2119 cport)->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2120 rv = EIO;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2121 break;
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 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2124 * Since the port was reset, it should be probed and
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2125 * attached device reinitialized. At this point the
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2126 * port state is unknown - it's state is HBA-specific.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2127 * Force port re-probing to get it into a known state.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2128 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2129 if (sata_reprobe_port(sata_hba_inst, &sata_device) !=
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2130 SATA_SUCCESS) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2131 rv = EIO;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2132 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2133 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2134 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 case SATA_CFGA_GET_DEVICE_PATH:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2137 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2138 char path[MAXPATHLEN];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2139 uint32_t size;
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 (void) strcpy(path, "/devices");
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2142 if ((tdip = sata_get_target_dip(dip, ioc.port)) ==
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2143 NULL) {
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 * No such device.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2147 * If this is a request for a size, do not
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2148 * return EINVAL for non-exisiting target,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2149 * because cfgadm will indicate a meaningless
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2150 * ioctl failure.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2151 * If this is a real request for a path,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2152 * indicate invalid argument.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2153 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2154 if (!ioc.get_size) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2155 rv = EINVAL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2156 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2157 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2158 } else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2159 (void) ddi_pathname(tdip, path + strlen(path));
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 size = strlen(path) + 1;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2162
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2163 if (ioc.get_size) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2164 if (ddi_copyout((void *)&size,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2165 ioc.buf, ioc.bufsiz, mode) != 0) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2166 rv = EFAULT;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2167 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2168 } else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2169 if (ioc.bufsiz != size) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2170 rv = EINVAL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2171 } else if (ddi_copyout((void *)&path,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2172 ioc.buf, ioc.bufsiz, mode) != 0) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2173 rv = EFAULT;
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 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2176 break;
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
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2179 case SATA_CFGA_GET_AP_TYPE:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2180 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2181 uint32_t type_len;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2182 const char *ap_type;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2183
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2184 /* cport only, no port multiplier support */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2185 switch (SATA_CPORT_DEV_TYPE(sata_hba_inst, cport)) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2186 case SATA_DTYPE_NONE:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2187 ap_type = "port";
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2188 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2189
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2190 case SATA_DTYPE_ATADISK:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2191 ap_type = "disk";
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2192 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2193
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2194 case SATA_DTYPE_ATAPICD:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2195 ap_type = "cd/dvd";
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2196 break;
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 case SATA_DTYPE_PMULT:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2199 ap_type = "pmult";
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2200 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2201
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2202 case SATA_DTYPE_UNKNOWN:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2203 ap_type = "unknown";
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2204 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2205
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2206 default:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2207 ap_type = "unsupported";
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2208 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2209
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2210 } /* end of dev_type switch */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2211
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2212 type_len = strlen(ap_type) + 1;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2213
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2214 if (ioc.get_size) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2215 if (ddi_copyout((void *)&type_len,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2216 ioc.buf, ioc.bufsiz, mode) != 0) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2217 rv = EFAULT;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2218 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2219 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2220 } else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2221 if (ioc.bufsiz != type_len) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2222 rv = EINVAL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2223 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2224 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2225 if (ddi_copyout((void *)ap_type, ioc.buf,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2226 ioc.bufsiz, mode) != 0) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2227 rv = EFAULT;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2228 break;
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 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2231
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2232 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2233 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2234
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2235 case SATA_CFGA_GET_MODEL_INFO:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2236 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2237 uint32_t info_len;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2238 char ap_info[sizeof (sdinfo->satadrv_id.ai_model) + 1];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2239
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 * This operation should return to cfgadm the
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2242 * device model information string
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2243 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2244 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, cport)->
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2245 cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2246 /* only handle device connected to cport for now */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2247 sata_device.satadev_addr.qual = SATA_ADDR_DCPORT;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2248 sdinfo = sata_get_device_info(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2249 &sata_device);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2250 if (sdinfo == NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2251 rv = EINVAL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2252 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2253 cport)->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2254 break;
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 bcopy(sdinfo->satadrv_id.ai_model, ap_info,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2257 sizeof (sdinfo->satadrv_id.ai_model));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2258 swab(ap_info, ap_info,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2259 sizeof (sdinfo->satadrv_id.ai_model));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2260 ap_info[sizeof (sdinfo->satadrv_id.ai_model)] = '\0';
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 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2263 cport_mutex);
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 info_len = strlen(ap_info) + 1;
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 if (ioc.get_size) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2268 if (ddi_copyout((void *)&info_len,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2269 ioc.buf, ioc.bufsiz, mode) != 0) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2270 rv = EFAULT;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2271 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2272 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2273 } else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2274 if (ioc.bufsiz < info_len) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2275 rv = EINVAL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2276 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2277 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2278 if (ddi_copyout((void *)ap_info, ioc.buf,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2279 ioc.bufsiz, mode) != 0) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2280 rv = EFAULT;
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 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2284
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2285 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2286 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2287
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2288 case SATA_CFGA_GET_REVFIRMWARE_INFO:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2289 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2290 uint32_t info_len;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2291 char ap_info[
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2292 sizeof (sdinfo->satadrv_id.ai_fw) + 1];
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 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2295 * This operation should return to cfgadm the
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2296 * device firmware revision information string
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2297 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2298 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, cport)->
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2299 cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2300 /* only handle device connected to cport for now */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2301 sata_device.satadev_addr.qual = SATA_ADDR_DCPORT;
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 sdinfo = sata_get_device_info(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2304 &sata_device);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2305 if (sdinfo == NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2306 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2307 cport)->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2308 rv = EINVAL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2309 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2310 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2311 bcopy(sdinfo->satadrv_id.ai_fw, ap_info,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2312 sizeof (sdinfo->satadrv_id.ai_fw));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2313 swab(ap_info, ap_info,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2314 sizeof (sdinfo->satadrv_id.ai_fw));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2315 ap_info[sizeof (sdinfo->satadrv_id.ai_fw)] = '\0';
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 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2318 cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2319
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2320 info_len = strlen(ap_info) + 1;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2321
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2322 if (ioc.get_size) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2323 if (ddi_copyout((void *)&info_len,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2324 ioc.buf, ioc.bufsiz, mode) != 0) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2325 rv = EFAULT;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2326 break;
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 } else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2329 if (ioc.bufsiz < info_len) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2330 rv = EINVAL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2331 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2332 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2333 if (ddi_copyout((void *)ap_info, ioc.buf,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2334 ioc.bufsiz, mode) != 0) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2335 rv = EFAULT;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2336 break;
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 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2339
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2340 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2341 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2342
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2343 case SATA_CFGA_GET_SERIALNUMBER_INFO:
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 uint32_t info_len;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2346 char ap_info[
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2347 sizeof (sdinfo->satadrv_id.ai_drvser) + 1];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2348
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2349 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2350 * This operation should return to cfgadm the
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2351 * device serial number information string
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2352 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2353 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, cport)->
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2354 cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2355 /* only handle device connected to cport for now */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2356 sata_device.satadev_addr.qual = SATA_ADDR_DCPORT;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2357
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2358 sdinfo = sata_get_device_info(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2359 &sata_device);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2360 if (sdinfo == NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2361 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2362 cport)->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2363 rv = EINVAL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2364 break;
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 bcopy(sdinfo->satadrv_id.ai_drvser, ap_info,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2367 sizeof (sdinfo->satadrv_id.ai_drvser));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2368 swab(ap_info, ap_info,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2369 sizeof (sdinfo->satadrv_id.ai_drvser));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2370 ap_info[sizeof (sdinfo->satadrv_id.ai_drvser)] = '\0';
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2371
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2372 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2373 cport_mutex);
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 info_len = strlen(ap_info) + 1;
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 if (ioc.get_size) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2378 if (ddi_copyout((void *)&info_len,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2379 ioc.buf, ioc.bufsiz, mode) != 0) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2380 rv = EFAULT;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2381 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2382 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2383 } else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2384 if (ioc.bufsiz < info_len) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2385 rv = EINVAL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2386 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2387 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2388 if (ddi_copyout((void *)ap_info, ioc.buf,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2389 ioc.bufsiz, mode) != 0) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2390 rv = EFAULT;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2391 break;
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
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2395 break;
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
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2398 default:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2399 rv = EINVAL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2400 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2401
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2402 } /* End of DEVCTL_AP_CONTROL cmd switch */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2403
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2404 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2405 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2406
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2407 default:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2408 {
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 * If we got here, we got an IOCTL that SATA HBA Framework
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2411 * does not recognize. Pass ioctl to HBA driver, in case
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2412 * it could process it.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2413 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2414 sata_hba_tran_t *sata_tran = sata_hba_inst->satahba_tran;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2415 dev_info_t *mydip = SATA_DIP(sata_hba_inst);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2416
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2417 SATADBG1(SATA_DBG_IOCTL_IF, sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2418 "IOCTL 0x%2x not supported in SATA framework, "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2419 "passthrough to HBA", cmd);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2420
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2421 if (sata_tran->sata_tran_ioctl == NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2422 rv = EINVAL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2423 break;
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 rval = (*sata_tran->sata_tran_ioctl)(mydip, cmd, arg);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2426 if (rval != 0) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2427 SATADBG1(SATA_DBG_IOCTL_IF, sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2428 "IOCTL 0x%2x failed in HBA", cmd);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2429 rv = rval;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2430 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2431 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2432 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2433
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2434 } /* End of main IOCTL switch */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2435
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2436 if (dcp) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2437 ndi_dc_freehdl(dcp);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2438 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2439 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2440 cportinfo->cport_event_flags &= ~SATA_APCTL_LOCK_PORT_BUSY;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2441 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
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 return (rv);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2444 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2445
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2446
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2447
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2448
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2449 /* ****************** SCSA required entry points *********************** */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2450
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2451 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2452 * Implementation of scsi tran_tgt_init.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2453 * sata_scsi_tgt_init() initializes scsi_device structure
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 * If successful, DDI_SUCCESS is returned.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2456 * DDI_FAILURE is returned if addressed device does not exist
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2457 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2458
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2459 static int
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2460 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
2461 scsi_hba_tran_t *hba_tran, struct scsi_device *sd)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2462 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2463 #ifndef __lock_lint
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2464 _NOTE(ARGUNUSED(hba_dip))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2465 #endif
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2466 sata_device_t sata_device;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2467 sata_drive_info_t *sdinfo;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2468 sata_hba_inst_t *sata_hba_inst;
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 sata_hba_inst = (sata_hba_inst_t *)(hba_tran->tran_hba_private);
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 /* Validate scsi device address */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2473 if (sata_validate_scsi_address(sata_hba_inst, &sd->sd_address,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2474 &sata_device) != 0)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2475 return (DDI_FAILURE);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2476
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2477 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2478 sata_device.satadev_addr.cport)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2479
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2480 /* sata_device now contains a valid sata address */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2481 sdinfo = sata_get_device_info(sata_hba_inst, &sata_device);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2482 if (sdinfo == NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2483 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2484 sata_device.satadev_addr.cport)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2485 return (DDI_FAILURE);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2486 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2487 if (sata_device.satadev_type == SATA_DTYPE_ATAPICD) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2488 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2489 sata_device.satadev_addr.cport)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2490 if (ndi_prop_update_string(DDI_DEV_T_NONE, tgt_dip,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2491 "variant", "atapi") != DDI_PROP_SUCCESS) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2492 SATA_LOG_D((sata_hba_inst, CE_WARN,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2493 "sata_scsi_tgt_init: variant atapi "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2494 "property could not be created"));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2495 return (DDI_FAILURE);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2496 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2497 return (DDI_SUCCESS);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2498 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2499 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2500 sata_device.satadev_addr.cport)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2501 return (DDI_SUCCESS);
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
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2504 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2505 * Implementation of scsi tran_tgt_probe.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2506 * Probe target, by calling default scsi routine scsi_hba_probe()
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2507 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2508 static int
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2509 sata_scsi_tgt_probe(struct scsi_device *sd, int (*callback)(void))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2510 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2511 sata_hba_inst_t *sata_hba_inst =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2512 (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
2513 int rval;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2514
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2515 rval = scsi_hba_probe(sd, callback);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2516
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2517 if (rval == SCSIPROBE_EXISTS) {
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 * Set property "pm-capable" on the target device node, so that
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2520 * the target driver will not try to fetch scsi cycle counters
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2521 * before enabling device power-management.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2522 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2523 if ((ddi_prop_update_int(DDI_DEV_T_NONE, sd->sd_dev,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2524 "pm-capable", 1)) != DDI_PROP_SUCCESS) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2525 sata_log(sata_hba_inst, CE_WARN,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2526 "device at port %d: will not be power-managed ",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2527 SCSI_TO_SATA_CPORT(sd->sd_address.a_target));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2528 SATA_LOG_D((sata_hba_inst, CE_WARN,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2529 "failure updating pm-capable property"));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2530 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2531 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2532 return (rval);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2533 }
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 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2536 * Implementation of scsi tran_tgt_free.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2537 * Release all resources allocated for scsi_device
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2538 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2539 static void
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2540 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
2541 scsi_hba_tran_t *hba_tran, struct scsi_device *sd)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2542 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2543 #ifndef __lock_lint
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2544 _NOTE(ARGUNUSED(hba_dip))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2545 #endif
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2546 sata_device_t sata_device;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2547 sata_drive_info_t *sdinfo;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2548 sata_hba_inst_t *sata_hba_inst;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2549
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2550 sata_hba_inst = (sata_hba_inst_t *)(hba_tran->tran_hba_private);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2551
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2552 /* Validate scsi device address */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2553 if (sata_validate_scsi_address(sata_hba_inst, &sd->sd_address,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2554 &sata_device) != 0)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2555 return;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2556
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2557 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2558 sata_device.satadev_addr.cport)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2559
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2560 /* sata_device now should contain a valid sata address */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2561 sdinfo = sata_get_device_info(sata_hba_inst, &sata_device);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2562 if (sdinfo == NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2563 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2564 sata_device.satadev_addr.cport)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2565 return;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2566 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2567 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2568 * We did not allocate any resources in sata_scsi_tgt_init()
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2569 * other than property for ATAPI device, if any
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2570 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2571 if (sata_device.satadev_type == SATA_DTYPE_ATAPICD) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2572 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2573 sata_device.satadev_addr.cport)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2574 if (ndi_prop_remove(DDI_DEV_T_NONE, tgt_dip, "variant") !=
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2575 DDI_PROP_SUCCESS)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2576 SATA_LOG_D((sata_hba_inst, CE_WARN,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2577 "sata_scsi_tgt_free: variant atapi "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2578 "property could not be removed"));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2579 } else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2580 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2581 sata_device.satadev_addr.cport)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2582 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2583 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2584
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2585 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2586 * Implementation of scsi tran_init_pkt
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2587 * Upon successful return, scsi pkt buffer has DMA resources allocated.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2588 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2589 * 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
2590 * for non-existing device - just use some default for dma_attr.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2591 * 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
2592 * Subsequent call to sata_scsi_start may fail appropriately.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2593 * Simply returning NULL does not seem to discourage a target driver...
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 * Returns a pointer to initialized scsi_pkt, or NULL otherwise.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2596 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2597 static struct scsi_pkt *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2598 sata_scsi_init_pkt(struct scsi_address *ap, struct scsi_pkt *pkt,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2599 struct buf *bp, int cmdlen, int statuslen, int tgtlen, int flags,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2600 int (*callback)(caddr_t), caddr_t arg)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2601 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2602 sata_hba_inst_t *sata_hba_inst =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2603 (sata_hba_inst_t *)(ap->a_hba_tran->tran_hba_private);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2604 dev_info_t *dip = SATA_DIP(sata_hba_inst);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2605 sata_device_t sata_device;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2606 sata_drive_info_t *sdinfo;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2607 sata_pkt_txlate_t *spx;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2608 ddi_dma_attr_t cur_dma_attr;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2609 int rval;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2610 boolean_t new_pkt = TRUE;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2611
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2612 ASSERT(ap->a_hba_tran->tran_hba_dip == dip);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2613
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2614 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2615 * We need to translate the address, even if it could be
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2616 * a bogus one, for a non-existing device
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2617 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2618 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
2619 sata_device.satadev_addr.cport = SCSI_TO_SATA_CPORT(ap->a_target);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2620 sata_device.satadev_addr.pmport = SCSI_TO_SATA_PMPORT(ap->a_target);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2621 sata_device.satadev_rev = SATA_DEVICE_REV;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2622
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2623 if (pkt == NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2624 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2625 * Have to allocate a brand new scsi packet.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2626 * We need to operate with auto request sense enabled.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2627 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2628 pkt = scsi_hba_pkt_alloc(dip, ap, cmdlen,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2629 MAX(statuslen, sizeof (struct scsi_arq_status)),
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2630 tgtlen, sizeof (sata_pkt_txlate_t), callback, arg);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2631
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2632 if (pkt == NULL)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2633 return (NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2634
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2635 /* Fill scsi packet structure */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2636 pkt->pkt_comp = (void (*)())NULL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2637 pkt->pkt_time = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2638 pkt->pkt_resid = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2639 pkt->pkt_statistics = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2640 pkt->pkt_reason = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2641
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2642 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2643 * pkt_hba_private will point to sata pkt txlate structure
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 spx = (sata_pkt_txlate_t *)pkt->pkt_ha_private;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2646 bzero(spx, sizeof (sata_pkt_txlate_t));
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 spx->txlt_scsi_pkt = pkt;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2649 spx->txlt_sata_hba_inst = sata_hba_inst;
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 /* Allocate sata_pkt */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2652 spx->txlt_sata_pkt = sata_pkt_alloc(spx, callback);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2653 if (spx->txlt_sata_pkt == NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2654 /* Could not allocate sata pkt */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2655 scsi_hba_pkt_free(ap, pkt);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2656 return (NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2657 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2658 /* Set sata address */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2659 spx->txlt_sata_pkt->satapkt_device = sata_device;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2660
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2661 if ((bp == NULL) || (bp->b_bcount == 0))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2662 return (pkt);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2663
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2664 spx->txlt_total_residue = bp->b_bcount;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2665 } else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2666 new_pkt = FALSE;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2667 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2668 * Packet was preallocated/initialized by previous call
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2669 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2670 spx = (sata_pkt_txlate_t *)pkt->pkt_ha_private;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2671
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2672 if ((bp == NULL) || (bp->b_bcount == 0)) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2673 return (pkt);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2674 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2675 ASSERT(spx->txlt_buf_dma_handle != NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2676
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2677 /* Pkt is available already: spx->txlt_scsi_pkt == pkt; */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2678 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2679
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2680 spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp = bp;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2681
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2682 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2683 * We use an adjusted version of the dma_attr, to account
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2684 * for device addressing limitations.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2685 * sata_adjust_dma_attr() will handle sdinfo == NULL which may
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2686 * happen when a device is not yet configured.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2687 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2688 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2689 sata_device.satadev_addr.cport)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2690 sdinfo = sata_get_device_info(spx->txlt_sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2691 &spx->txlt_sata_pkt->satapkt_device);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2692 /* NULL sdinfo may be passsed to sata_adjust_dma_attr() */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2693 sata_adjust_dma_attr(sdinfo,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2694 SATA_DMA_ATTR(spx->txlt_sata_hba_inst), &cur_dma_attr);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2695 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2696 sata_device.satadev_addr.cport)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2697 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2698 * Allocate necessary DMA resources for the packet's buffer
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2699 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2700 if ((rval = sata_dma_buf_setup(spx, flags, callback, arg,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2701 &cur_dma_attr)) != DDI_SUCCESS) {
2071
01f4efa62f05 6430233 panic assertion failed: spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp == 0L
ls24207
parents: 1940
diff changeset
2702 spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp = NULL;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2703 sata_pkt_free(spx);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2704 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2705 * If a DMA allocation request fails with
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2706 * DDI_DMA_NOMAPPING, indicate the error by calling
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2707 * bioerror(9F) with bp and an error code of EFAULT.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2708 * If a DMA allocation request fails with
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2709 * DDI_DMA_TOOBIG, indicate the error by calling
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2710 * bioerror(9F) with bp and an error code of EINVAL.
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 switch (rval) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2713 case DDI_DMA_NORESOURCES:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2714 bioerror(bp, 0);
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 case DDI_DMA_NOMAPPING:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2717 case DDI_DMA_BADATTR:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2718 bioerror(bp, EFAULT);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2719 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2720 case DDI_DMA_TOOBIG:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2721 default:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2722 bioerror(bp, EINVAL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2723 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2724 }
2177
7fd6af926424 6430603 Misc marvell88sx driver clean up
ls24207
parents: 2071
diff changeset
2725 if (new_pkt == TRUE)
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2726 scsi_hba_pkt_free(ap, pkt);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2727 return (NULL);
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 /* Set number of bytes that are not yet accounted for */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2730 pkt->pkt_resid = spx->txlt_total_residue;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2731 ASSERT(pkt->pkt_resid >= 0);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2732
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2733 return (pkt);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2734 }
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 * Implementation of scsi tran_start.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2738 * Translate scsi cmd into sata operation and return status.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2739 * Supported scsi commands:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2740 * SCMD_INQUIRY
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2741 * SCMD_TEST_UNIT_READY
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2742 * SCMD_START_STOP
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2743 * SCMD_READ_CAPACITY
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2744 * SCMD_REQUEST_SENSE
1781
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
2745 * SCMD_LOG_SENSE_G1
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
2746 * SCMD_LOG_SELECT_G1
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2747 * SCMD_MODE_SENSE (specific pages)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2748 * SCMD_MODE_SENSE_G1 (specific pages)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2749 * SCMD_MODE_SELECT (specific pages)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2750 * SCMD_MODE_SELECT_G1 (specific pages)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2751 * SCMD_SYNCHRONIZE_CACHE
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2752 * SCMD_SYNCHRONIZE_CACHE_G1
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2753 * SCMD_READ
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2754 * SCMD_READ_G1
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2755 * SCMD_READ_G4
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2756 * SCMD_READ_G5
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2757 * SCMD_WRITE
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2758 * SCMD_WRITE_G1
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2759 * SCMD_WRITE_G4
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2760 * SCMD_WRITE_G5
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2761 * SCMD_SEEK (noop)
1940
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
2762 * SCMD_SDIAG
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2763 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2764 * All other commands are rejected as unsupported.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2765 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2766 * Returns:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2767 * TRAN_ACCEPT if command was executed successfully or accepted by HBA driver
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2768 * for execution.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2769 * TRAN_BADPKT if cmd was directed to invalid address.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2770 * TRAN_FATAL_ERROR is command was rejected due to hardware error, including
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2771 * unexpected removal of a device or some other unspecified error.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2772 * 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
2773 * framework was busy performing some other operation(s).
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 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2776 static int
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2777 sata_scsi_start(struct scsi_address *ap, struct scsi_pkt *pkt)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2778 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2779 sata_hba_inst_t *sata_hba_inst =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2780 (sata_hba_inst_t *)(ap->a_hba_tran->tran_hba_private);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2781 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
2782 sata_drive_info_t *sdinfo;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2783 struct buf *bp;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2784 int cport;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2785 int rval;
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 SATADBG1(SATA_DBG_SCSI_IF, sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2788 "sata_scsi_start: cmd 0x%02x\n", pkt->pkt_cdbp[0]);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2789
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2790 ASSERT(spx != NULL &&
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2791 spx->txlt_scsi_pkt == pkt && spx->txlt_sata_pkt != NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2792
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2793 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2794 * Mutex-protected section below is just to identify device type
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2795 * and switch to ATAPI processing, if necessary
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 cport = SCSI_TO_SATA_CPORT(ap->a_target);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2798
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2799 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
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 sdinfo = sata_get_device_info(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2802 &spx->txlt_sata_pkt->satapkt_device);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2803 if (sdinfo == NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2804 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2805 spx->txlt_scsi_pkt->pkt_reason = CMD_DEV_GONE;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2806 return (TRAN_FATAL_ERROR);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2807 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2808
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2809 if (sdinfo->satadrv_type == SATA_DTYPE_ATAPICD) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2810 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2811 rval = sata_txlt_atapi(spx);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2812 SATADBG1(SATA_DBG_SCSI_IF, sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2813 "sata_scsi_start atapi: rval %d\n", rval);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2814 return (rval);
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 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2817
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2818 /* ATA Disk commands processing starts here */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2819
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2820 bp = spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp;
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 switch (pkt->pkt_cdbp[0]) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2823
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2824 case SCMD_INQUIRY:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2825 /* Mapped to identify device */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2826 if (bp != NULL && (bp->b_flags & (B_PHYS | B_PAGEIO)))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2827 bp_mapin(bp);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2828 rval = sata_txlt_inquiry(spx);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2829 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2830
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2831 case SCMD_TEST_UNIT_READY:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2832 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2833 * SAT "SATA to ATA Translation" doc specifies translation
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2834 * to ATA CHECK POWER MODE.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2835 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2836 rval = sata_txlt_test_unit_ready(spx);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2837 break;
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 case SCMD_START_STOP:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2840 /* Mapping depends on the command */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2841 rval = sata_txlt_start_stop_unit(spx);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2842 break;
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 case SCMD_READ_CAPACITY:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2845 if (bp != NULL && (bp->b_flags & (B_PHYS | B_PAGEIO)))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2846 bp_mapin(bp);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2847 rval = sata_txlt_read_capacity(spx);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2848 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2849
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2850 case SCMD_REQUEST_SENSE:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2851 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2852 * Always No Sense, since we force ARQ
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2853 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2854 if (bp != NULL && (bp->b_flags & (B_PHYS | B_PAGEIO)))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2855 bp_mapin(bp);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2856 rval = sata_txlt_request_sense(spx);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2857 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2858
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2859 case SCMD_LOG_SENSE_G1:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2860 if (bp != NULL && (bp->b_flags & (B_PHYS | B_PAGEIO)))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2861 bp_mapin(bp);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2862 rval = sata_txlt_log_sense(spx);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2863 break;
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 case SCMD_LOG_SELECT_G1:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2866 if (bp != NULL && (bp->b_flags & (B_PHYS | B_PAGEIO)))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2867 bp_mapin(bp);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2868 rval = sata_txlt_log_select(spx);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2869 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2870
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2871 case SCMD_MODE_SENSE:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2872 case SCMD_MODE_SENSE_G1:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2873 if (bp != NULL && (bp->b_flags & (B_PHYS | B_PAGEIO)))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2874 bp_mapin(bp);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2875 rval = sata_txlt_mode_sense(spx);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2876 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2877
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 case SCMD_MODE_SELECT:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2880 case SCMD_MODE_SELECT_G1:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2881 if (bp != NULL && (bp->b_flags & (B_PHYS | B_PAGEIO)))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2882 bp_mapin(bp);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2883 rval = sata_txlt_mode_select(spx);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2884 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2885
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2886 case SCMD_SYNCHRONIZE_CACHE:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2887 case SCMD_SYNCHRONIZE_CACHE_G1:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2888 rval = sata_txlt_synchronize_cache(spx);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2889 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2890
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2891 case SCMD_READ:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2892 case SCMD_READ_G1:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2893 case SCMD_READ_G4:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2894 case SCMD_READ_G5:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2895 rval = sata_txlt_read(spx);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2896 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2897
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2898 case SCMD_WRITE:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2899 case SCMD_WRITE_G1:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2900 case SCMD_WRITE_G4:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2901 case SCMD_WRITE_G5:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2902 rval = sata_txlt_write(spx);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2903 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2904
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2905 case SCMD_SEEK:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2906 rval = sata_txlt_nodata_cmd_immediate(spx);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2907 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2908
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2909 /* Other cases will be filed later */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2910 /* postponed until phase 2 of the development */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2911 default:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2912 rval = sata_txlt_invalid_command(spx);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2913 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2914 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2915
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2916 SATADBG1(SATA_DBG_SCSI_IF, sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2917 "sata_scsi_start: rval %d\n", rval);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2918
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2919 return (rval);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2920 }
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 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2923 * Implementation of scsi tran_abort.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2924 * Abort specific pkt or all packets.
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 * Returns 1 if one or more packets were aborted, returns 0 otherwise
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2927 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2928 * May be called from an interrupt level.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2929 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2930 static int
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2931 sata_scsi_abort(struct scsi_address *ap, struct scsi_pkt *scsi_pkt)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2932 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2933 sata_hba_inst_t *sata_hba_inst =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2934 (sata_hba_inst_t *)(ap->a_hba_tran->tran_hba_private);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2935 sata_device_t sata_device;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2936 sata_pkt_t *sata_pkt;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2937
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2938 SATADBG2(SATA_DBG_SCSI_IF, sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2939 "sata_scsi_abort: %s at target: 0x%x\n",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2940 scsi_pkt == NULL ? "all packets" : "one pkt", ap->a_target);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2941
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2942 /* Validate address */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2943 if (sata_validate_scsi_address(sata_hba_inst, ap, &sata_device) != 0)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2944 /* Invalid address */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2945 return (0);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2946
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2947 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2948 sata_device.satadev_addr.cport)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2949 if (sata_get_device_info(sata_hba_inst, &sata_device) == NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2950 /* invalid address */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2951 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2952 sata_device.satadev_addr.cport)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2953 return (0);
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 if (scsi_pkt == NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2956 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2957 * Abort all packets.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2958 * Although we do not have specific packet, we still need
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2959 * dummy packet structure to pass device address to HBA.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2960 * Allocate one, without sleeping. Fail if pkt cannot be
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2961 * allocated.
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 sata_pkt = kmem_zalloc(sizeof (sata_pkt_t), KM_NOSLEEP);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2964 if (sata_pkt == NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2965 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2966 sata_device.satadev_addr.cport)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2967 SATA_LOG_D((sata_hba_inst, CE_WARN, "sata_pkt_abort: "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2968 "could not allocate sata_pkt"));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2969 return (0);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2970 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2971 sata_pkt->satapkt_rev = SATA_PKT_REV;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2972 sata_pkt->satapkt_device = sata_device;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2973 sata_pkt->satapkt_device.satadev_rev = SATA_DEVICE_REV;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2974 } else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2975 if (scsi_pkt->pkt_ha_private == NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2976 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2977 sata_device.satadev_addr.cport)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2978 return (0); /* Bad scsi pkt */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2979 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2980 /* extract pointer to sata pkt */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2981 sata_pkt = ((sata_pkt_txlate_t *)scsi_pkt->pkt_ha_private)->
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2982 txlt_sata_pkt;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2983 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2984
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2985 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2986 sata_device.satadev_addr.cport)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2987 /* Send abort request to HBA */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2988 if ((*SATA_ABORT_FUNC(sata_hba_inst))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2989 (SATA_DIP(sata_hba_inst), sata_pkt,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2990 scsi_pkt == NULL ? SATA_ABORT_ALL_PACKETS : SATA_ABORT_PACKET) ==
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2991 SATA_SUCCESS) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2992 if (scsi_pkt == NULL)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2993 kmem_free(sata_pkt, sizeof (sata_pkt_t));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2994 /* Success */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2995 return (1);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2996 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2997 /* Else, something did not go right */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2998 if (scsi_pkt == NULL)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
2999 kmem_free(sata_pkt, sizeof (sata_pkt_t));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3000 /* Failure */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3001 return (0);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3002 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3003
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3004
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3005 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3006 * Implementation os scsi tran_reset.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3007 * RESET_ALL request is translated into port reset.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3008 * RESET_TARGET requests is translated into a device reset,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3009 * RESET_LUN request is accepted only for LUN 0 and translated into
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3010 * device reset.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3011 * The target reset should cause all HBA active and queued packets to
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3012 * be terminated and returned with pkt reason SATA_PKT_RESET prior to
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3013 * the return. HBA should report reset event for the device.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3014 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3015 * Returns 1 upon success, 0 upon failure.
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 static int
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3018 sata_scsi_reset(struct scsi_address *ap, int level)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3019 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3020 sata_hba_inst_t *sata_hba_inst =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3021 (sata_hba_inst_t *)(ap->a_hba_tran->tran_hba_private);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3022 sata_device_t sata_device;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3023 int val;
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 SATADBG2(SATA_DBG_SCSI_IF, sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3026 "sata_scsi_reset: level %d target: 0x%x\n",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3027 level, ap->a_target);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3028
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3029 /* Validate address */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3030 val = sata_validate_scsi_address(sata_hba_inst, ap, &sata_device);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3031 if (val == -1)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3032 /* Invalid address */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3033 return (0);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3034
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3035 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3036 sata_device.satadev_addr.cport)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3037 if (sata_get_device_info(sata_hba_inst, &sata_device) == NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3038 /* invalid address */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3039 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3040 sata_device.satadev_addr.cport)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3041 return (0);
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 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3044 sata_device.satadev_addr.cport)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3045 if (level == RESET_ALL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3046 /* port reset - cport only */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3047 sata_device.satadev_addr.qual = SATA_ADDR_CPORT;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3048 if ((*SATA_RESET_DPORT_FUNC(sata_hba_inst))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3049 (SATA_DIP(sata_hba_inst), &sata_device) == SATA_SUCCESS)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3050 return (1);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3051 else
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3052 return (0);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3053
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3054 } else if (val == 0 &&
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3055 (level == RESET_TARGET || level == RESET_LUN)) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3056 /* reset device (device attached) */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3057 if ((*SATA_RESET_DPORT_FUNC(sata_hba_inst))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3058 (SATA_DIP(sata_hba_inst), &sata_device) == SATA_SUCCESS)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3059 return (1);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3060 else
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 return (0);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3064 }
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
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3067 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3068 * Implementation of scsi tran_getcap (get transport/device capabilities).
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3069 * Supported capabilities:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3070 * auto-rqsense (always supported)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3071 * tagged-qing (supported if HBA supports it)
2553
624f674f2ad8 6430966 SATA NCQ support is needed in SATA framework and hba drivers
ls24207
parents: 2539
diff changeset
3072 * untagged-qing (could be supported if disk supports it, but because
624f674f2ad8 6430966 SATA NCQ support is needed in SATA framework and hba drivers
ls24207
parents: 2539
diff changeset
3073 * caching behavior allowing untagged queuing actually
624f674f2ad8 6430966 SATA NCQ support is needed in SATA framework and hba drivers
ls24207
parents: 2539
diff changeset
3074 * results in reduced performance. sd tries to throttle
624f674f2ad8 6430966 SATA NCQ support is needed in SATA framework and hba drivers
ls24207
parents: 2539
diff changeset
3075 * back to only 3 outstanding commands, which may
624f674f2ad8 6430966 SATA NCQ support is needed in SATA framework and hba drivers
ls24207
parents: 2539
diff changeset
3076 * work for real SCSI disks, but with read ahead
624f674f2ad8 6430966 SATA NCQ support is needed in SATA framework and hba drivers
ls24207
parents: 2539
diff changeset
3077 * caching, having more than 1 outstanding command
624f674f2ad8 6430966 SATA NCQ support is needed in SATA framework and hba drivers
ls24207
parents: 2539
diff changeset
3078 * results in cache thrashing.)
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3079 * dma_max
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3080 * interconnect-type (INTERCONNECT_SATA)
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 * Request for other capabilities is rejected as unsupported.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3083 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3084 * Returns supported capability value, or -1 if capability is unsuppported or
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3085 * the address is invalid (no device).
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3086 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3087
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3088 static int
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3089 sata_scsi_getcap(struct scsi_address *ap, char *cap, int whom)
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
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3092 sata_hba_inst_t *sata_hba_inst =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3093 (sata_hba_inst_t *)(ap->a_hba_tran->tran_hba_private);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3094 sata_device_t sata_device;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3095 sata_drive_info_t *sdinfo;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3096 ddi_dma_attr_t adj_dma_attr;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3097 int rval;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3098
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3099 SATADBG2(SATA_DBG_SCSI_IF, sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3100 "sata_scsi_getcap: target: 0x%x, cap: %s\n",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3101 ap->a_target, cap);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3102
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 * We want to process the capabilities on per port granularity.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3105 * So, we are specifically restricting ourselves to whom != 0
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3106 * to exclude the controller wide handling.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3107 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3108 if (cap == NULL || whom == 0)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3109 return (-1);
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 if (sata_validate_scsi_address(sata_hba_inst, ap, &sata_device) != 0) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3112 /* Invalid address */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3113 return (-1);
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 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3116 sata_device.satadev_addr.cport)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3117 if ((sdinfo = sata_get_device_info(sata_hba_inst, &sata_device)) ==
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3118 NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3119 /* invalid address */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3120 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3121 sata_device.satadev_addr.cport)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3122 return (0);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3123 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3124
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3125 switch (scsi_hba_lookup_capstr(cap)) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3126 case SCSI_CAP_ARQ:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3127 rval = 1; /* ARQ supported, turned on */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3128 break;
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 case SCSI_CAP_SECTOR_SIZE:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3131 if (sdinfo->satadrv_type == SATA_DTYPE_ATADISK)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3132 rval = SATA_DISK_SECTOR_SIZE; /* fixed size */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3133 else if (sdinfo->satadrv_type == SATA_DTYPE_ATAPICD)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3134 rval = SATA_ATAPI_SECTOR_SIZE;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3135 else rval = -1;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3136 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3137
2553
624f674f2ad8 6430966 SATA NCQ support is needed in SATA framework and hba drivers
ls24207
parents: 2539
diff changeset
3138 /*
624f674f2ad8 6430966 SATA NCQ support is needed in SATA framework and hba drivers
ls24207
parents: 2539
diff changeset
3139 * untagged queuing cause a performance inversion because of
624f674f2ad8 6430966 SATA NCQ support is needed in SATA framework and hba drivers
ls24207
parents: 2539
diff changeset
3140 * the way sd operates. Because of this reason we do not
624f674f2ad8 6430966 SATA NCQ support is needed in SATA framework and hba drivers
ls24207
parents: 2539
diff changeset
3141 * use it when available.
624f674f2ad8 6430966 SATA NCQ support is needed in SATA framework and hba drivers
ls24207
parents: 2539
diff changeset
3142 */
624f674f2ad8 6430966 SATA NCQ support is needed in SATA framework and hba drivers
ls24207
parents: 2539
diff changeset
3143 #if defined(_UNTAGGED_QING_SUPPORTED)
624f674f2ad8 6430966 SATA NCQ support is needed in SATA framework and hba drivers
ls24207
parents: 2539
diff changeset
3144 case SCSI_CAP_UNTAGGED_QING:
624f674f2ad8 6430966 SATA NCQ support is needed in SATA framework and hba drivers
ls24207
parents: 2539
diff changeset
3145 if (SATA_QDEPTH(sata_hba_inst) > 1)
624f674f2ad8 6430966 SATA NCQ support is needed in SATA framework and hba drivers
ls24207
parents: 2539
diff changeset
3146 rval = 1; /* Untagged queuing supported */
624f674f2ad8 6430966 SATA NCQ support is needed in SATA framework and hba drivers
ls24207
parents: 2539
diff changeset
3147 else
624f674f2ad8 6430966 SATA NCQ support is needed in SATA framework and hba drivers
ls24207
parents: 2539
diff changeset
3148 rval = -1; /* Untagged queuing not supported */
624f674f2ad8 6430966 SATA NCQ support is needed in SATA framework and hba drivers
ls24207
parents: 2539
diff changeset
3149 break;
624f674f2ad8 6430966 SATA NCQ support is needed in SATA framework and hba drivers
ls24207
parents: 2539
diff changeset
3150 #endif
624f674f2ad8 6430966 SATA NCQ support is needed in SATA framework and hba drivers
ls24207
parents: 2539
diff changeset
3151
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3152 case SCSI_CAP_TAGGED_QING:
2553
624f674f2ad8 6430966 SATA NCQ support is needed in SATA framework and hba drivers
ls24207
parents: 2539
diff changeset
3153 /* This can TCQ or NCQ */
624f674f2ad8 6430966 SATA NCQ support is needed in SATA framework and hba drivers
ls24207
parents: 2539
diff changeset
3154 if (sata_func_enable & SATA_ENABLE_QUEUING &&
624f674f2ad8 6430966 SATA NCQ support is needed in SATA framework and hba drivers
ls24207
parents: 2539
diff changeset
3155 ((sdinfo->satadrv_features_support & SATA_DEV_F_TCQ &&
624f674f2ad8 6430966 SATA NCQ support is needed in SATA framework and hba drivers
ls24207
parents: 2539
diff changeset
3156 SATA_FEATURES(sata_hba_inst) & SATA_CTLF_QCMD) ||
624f674f2ad8 6430966 SATA NCQ support is needed in SATA framework and hba drivers
ls24207
parents: 2539
diff changeset
3157 (sata_func_enable & SATA_ENABLE_NCQ &&
624f674f2ad8 6430966 SATA NCQ support is needed in SATA framework and hba drivers
ls24207
parents: 2539
diff changeset
3158 sdinfo->satadrv_features_support & SATA_DEV_F_NCQ &&
624f674f2ad8 6430966 SATA NCQ support is needed in SATA framework and hba drivers
ls24207
parents: 2539
diff changeset
3159 SATA_FEATURES(sata_hba_inst) & SATA_CTLF_NCQ)))
624f674f2ad8 6430966 SATA NCQ support is needed in SATA framework and hba drivers
ls24207
parents: 2539
diff changeset
3160 rval = 1; /* Tagged queuing supported */
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3161 else
2553
624f674f2ad8 6430966 SATA NCQ support is needed in SATA framework and hba drivers
ls24207
parents: 2539
diff changeset
3162 rval = -1; /* Tagged queuing not supported */
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3163 break;
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 case SCSI_CAP_DMA_MAX:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3166 sata_adjust_dma_attr(sdinfo, SATA_DMA_ATTR(sata_hba_inst),
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3167 &adj_dma_attr);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3168 rval = (int)adj_dma_attr.dma_attr_maxxfer;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3169 /* We rely on the fact that dma_attr_maxxfer < 0x80000000 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3170 break;
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 case SCSI_CAP_INTERCONNECT_TYPE:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3173 rval = INTERCONNECT_SATA; /* SATA interconnect type */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3174 break;
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 default:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3177 rval = -1;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3178 break;
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 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3181 sata_device.satadev_addr.cport)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3182 return (rval);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3183 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3184
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3185 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3186 * Implementation of scsi tran_setcap
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 * All supported capabilities are fixed/unchangeable.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3189 * Returns 0 for all supported capabilities and valid device, -1 otherwise.
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 static int
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3192 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
3193 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3194 #ifndef __lock_lint
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3195 _NOTE(ARGUNUSED(value))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3196 #endif
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3197 sata_hba_inst_t *sata_hba_inst =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3198 (sata_hba_inst_t *)(ap->a_hba_tran->tran_hba_private);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3199 sata_device_t sata_device;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3200 int rval;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3201
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3202 SATADBG2(SATA_DBG_SCSI_IF, sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3203 "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
3204
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 * We want to process the capabilities on per port granularity.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3207 * So, we are specifically restricting ourselves to whom != 0
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3208 * to exclude the controller wide handling.
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 (cap == NULL || whom == 0) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3211 return (-1);
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
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3214 if (sata_validate_scsi_address(sata_hba_inst, ap, &sata_device) != 0) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3215 /* Invalid address */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3216 return (-1);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3217 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3218 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3219 sata_device.satadev_addr.cport)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3220 if (sata_get_device_info(sata_hba_inst, &sata_device) == NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3221 /* invalid address */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3222 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3223 sata_device.satadev_addr.cport)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3224 return (0);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3225 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3226 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3227 sata_device.satadev_addr.cport)));
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 switch (scsi_hba_lookup_capstr(cap)) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3230 case SCSI_CAP_ARQ:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3231 case SCSI_CAP_SECTOR_SIZE:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3232 case SCSI_CAP_TAGGED_QING:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3233 case SCSI_CAP_DMA_MAX:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3234 case SCSI_CAP_INTERCONNECT_TYPE:
2553
624f674f2ad8 6430966 SATA NCQ support is needed in SATA framework and hba drivers
ls24207
parents: 2539
diff changeset
3235 #if defined(_UNTAGGED_QING_SUPPORTED)
624f674f2ad8 6430966 SATA NCQ support is needed in SATA framework and hba drivers
ls24207
parents: 2539
diff changeset
3236 case SCSI_CAP_UNTAGGED_QING:
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3237 rval = 0; /* Capability cannot be changed */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3238 break;
2553
624f674f2ad8 6430966 SATA NCQ support is needed in SATA framework and hba drivers
ls24207
parents: 2539
diff changeset
3239 #endif
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3240
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3241 default:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3242 rval = -1;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3243 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3244 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3245 return (rval);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3246 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3247
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3248 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3249 * Implementations of scsi tran_destroy_pkt.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3250 * Free resources allocated by sata_scsi_init_pkt()
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3251 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3252 static void
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3253 sata_scsi_destroy_pkt(struct scsi_address *ap, struct scsi_pkt *pkt)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3254 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3255 sata_pkt_txlate_t *spx;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3256
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3257 ASSERT(pkt != NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3258 spx = (sata_pkt_txlate_t *)pkt->pkt_ha_private;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3259
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3260 if (spx->txlt_buf_dma_handle != NULL) {
2539
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
3261 if (spx->txlt_tmp_buf != NULL) {
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
3262 ASSERT(spx->txlt_tmp_buf_handle != 0);
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
3263 /*
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
3264 * Intermediate DMA buffer was allocated.
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
3265 * Free allocated buffer and associated access handle.
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
3266 */
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
3267 ddi_dma_mem_free(&spx->txlt_tmp_buf_handle);
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
3268 spx->txlt_tmp_buf = NULL;
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
3269 }
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3270 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3271 * Free DMA resources - cookies and handles
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3272 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3273 ASSERT(spx->txlt_dma_cookie_list != NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3274 (void) kmem_free(spx->txlt_dma_cookie_list,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3275 spx->txlt_dma_cookie_list_len * sizeof (ddi_dma_cookie_t));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3276 (void) ddi_dma_unbind_handle(spx->txlt_buf_dma_handle);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3277 (void) ddi_dma_free_handle(&spx->txlt_buf_dma_handle);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3278 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3279 spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp = NULL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3280 sata_pkt_free(spx);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3281
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3282 scsi_hba_pkt_free(ap, pkt);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3283 }
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 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3286 * Implementation of scsi tran_dmafree.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3287 * Free DMA resources allocated by sata_scsi_init_pkt()
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3288 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3289
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3290 static void
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3291 sata_scsi_dmafree(struct scsi_address *ap, struct scsi_pkt *pkt)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3292 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3293 #ifndef __lock_lint
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3294 _NOTE(ARGUNUSED(ap))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3295 #endif
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3296 sata_pkt_txlate_t *spx;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3297
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3298 ASSERT(pkt != NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3299 spx = (sata_pkt_txlate_t *)pkt->pkt_ha_private;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3300
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3301 if (spx->txlt_buf_dma_handle != NULL) {
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 * Free DMA resources - cookies and handles
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3304 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3305 ASSERT(spx->txlt_dma_cookie_list != NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3306 (void) kmem_free(spx->txlt_dma_cookie_list,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3307 spx->txlt_dma_cookie_list_len * sizeof (ddi_dma_cookie_t));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3308 (void) ddi_dma_unbind_handle(spx->txlt_buf_dma_handle);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3309 (void) ddi_dma_free_handle(&spx->txlt_buf_dma_handle);
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 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3312
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3313 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3314 * Implementation of scsi tran_sync_pkt.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3315 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3316 * The assumption below is that pkt is unique - there is no need to check ap
2539
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
3317 *
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
3318 * Synchronize DMA buffer and, if the intermediate buffer is used, copy data
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
3319 * into/from the real buffer.
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3320 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3321 static void
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3322 sata_scsi_sync_pkt(struct scsi_address *ap, struct scsi_pkt *pkt)
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 #ifndef __lock_lint
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3325 _NOTE(ARGUNUSED(ap))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3326 #endif
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3327 int rval;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3328 sata_pkt_txlate_t *spx = (sata_pkt_txlate_t *)pkt->pkt_ha_private;
2539
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
3329 struct buf *bp;
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
3330 int direction;
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
3331
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
3332 ASSERT(spx != NULL);
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3333 if (spx->txlt_buf_dma_handle != NULL) {
2539
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
3334 direction = spx->txlt_sata_pkt->
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
3335 satapkt_cmd.satacmd_flags.sata_data_direction;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3336 if (spx->txlt_sata_pkt != NULL &&
2539
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
3337 direction != SATA_DIR_NODATA_XFER) {
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
3338 if (spx->txlt_tmp_buf != NULL) {
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
3339 /* Intermediate DMA buffer used */
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
3340 bp = spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp;
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
3341
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
3342 if (direction & SATA_DIR_WRITE) {
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
3343 bcopy(bp->b_un.b_addr,
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
3344 spx->txlt_tmp_buf, bp->b_bcount);
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
3345 }
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
3346 }
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
3347 /* Sync the buffer for device or for CPU */
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
3348 rval = ddi_dma_sync(spx->txlt_buf_dma_handle, 0, 0,
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
3349 (direction & SATA_DIR_WRITE) ?
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
3350 DDI_DMA_SYNC_FORDEV : DDI_DMA_SYNC_FORCPU);
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
3351 ASSERT(rval == DDI_SUCCESS);
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
3352 if (spx->txlt_tmp_buf != NULL &&
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
3353 !(direction & SATA_DIR_WRITE)) {
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
3354 /* Intermediate DMA buffer used for read */
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
3355 bcopy(spx->txlt_tmp_buf,
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
3356 bp->b_un.b_addr, bp->b_bcount);
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
3357 }
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
3358
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3359 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3360 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3361 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3362
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
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3365 /* ******************* SATA - SCSI Translation functions **************** */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3366 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3367 * 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
3368 * translation.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3369 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3370
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 * Checks if a device exists and can be access and translates common
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3373 * scsi_pkt data to sata_pkt data.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3374 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3375 * Returns TRAN_ACCEPT if device exists and sata_pkt was set-up.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3376 * Returns other TRAN_XXXXX values when error occured.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3377 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3378 * This function should be called with port mutex held.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3379 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3380 static int
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3381 sata_txlt_generic_pkt_info(sata_pkt_txlate_t *spx)
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 sata_drive_info_t *sdinfo;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3384 sata_device_t sata_device;
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
3385 const struct sata_cmd_flags sata_initial_cmd_flags = {
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
3386 SATA_DIR_NODATA_XFER,
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
3387 /* all other values to 0/FALSE */
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
3388 };
1258
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 /* Validate address */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3391 switch (sata_validate_scsi_address(spx->txlt_sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3392 &spx->txlt_scsi_pkt->pkt_address, &sata_device)) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3393
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3394 case -1:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3395 /* Invalid address or invalid device type */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3396 return (TRAN_BADPKT);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3397 case 1:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3398 /* valid address but no device - it has disappeared ? */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3399 spx->txlt_scsi_pkt->pkt_reason = CMD_DEV_GONE;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3400 return (TRAN_FATAL_ERROR);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3401 default:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3402 /* all OK */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3403 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3404 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3405 sdinfo = sata_get_device_info(spx->txlt_sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3406 &spx->txlt_sata_pkt->satapkt_device);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3407
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3408 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3409 * If device is in reset condition, reject the packet with
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3410 * TRAN_BUSY
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3411 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3412 if (sdinfo->satadrv_event_flags &
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3413 (SATA_EVNT_DEVICE_RESET | SATA_EVNT_INPROC_DEVICE_RESET)) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3414 spx->txlt_scsi_pkt->pkt_reason = CMD_INCOMPLETE;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3415 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3416 "sata_scsi_start: rejecting command because "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3417 "of device reset state\n", NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3418 return (TRAN_BUSY);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3419 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3420
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3421 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3422 * 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
3423 * sata_scsi_pkt_init() because pkt init had to work also with
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3424 * non-existing devices.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3425 * 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
3426 * type is known.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3427 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3428 spx->txlt_sata_pkt->satapkt_device.satadev_type = sdinfo->satadrv_type;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3429
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
3430 spx->txlt_sata_pkt->satapkt_cmd.satacmd_flags = sata_initial_cmd_flags;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3431
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3432 spx->txlt_scsi_pkt->pkt_reason = CMD_CMPLT;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3433
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3434 if ((spx->txlt_scsi_pkt->pkt_flags & FLAG_NOINTR) != 0) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3435 /* Synchronous execution */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3436 spx->txlt_sata_pkt->satapkt_op_mode = SATA_OPMODE_SYNCH |
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3437 SATA_OPMODE_POLLING;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3438 } else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3439 /* Asynchronous execution */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3440 spx->txlt_sata_pkt->satapkt_op_mode = SATA_OPMODE_ASYNCH |
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3441 SATA_OPMODE_INTERRUPTS;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3442 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3443 /* Convert queuing information */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3444 if (spx->txlt_scsi_pkt->pkt_flags & FLAG_STAG)
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
3445 spx->txlt_sata_pkt->satapkt_cmd.satacmd_flags.sata_queue_stag =
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
3446 B_TRUE;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3447 else if (spx->txlt_scsi_pkt->pkt_flags &
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3448 (FLAG_OTAG | FLAG_HTAG | FLAG_HEAD))
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
3449 spx->txlt_sata_pkt->satapkt_cmd.satacmd_flags.sata_queue_otag =
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
3450 B_TRUE;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3451
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3452 /* Always limit pkt time */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3453 if (spx->txlt_scsi_pkt->pkt_time == 0)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3454 spx->txlt_sata_pkt->satapkt_time = sata_default_pkt_time;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3455 else
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3456 /* Pass on scsi_pkt time */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3457 spx->txlt_sata_pkt->satapkt_time =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3458 spx->txlt_scsi_pkt->pkt_time;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3459
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3460 return (TRAN_ACCEPT);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3461 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3462
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3463
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3464 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3465 * Translate ATA(ATAPI) Identify (Packet) Device data to SCSI Inquiry data.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3466 * SATA Identify Device data has to be valid in sata_rive_info.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3467 * Buffer has to accomodate the inquiry length (36 bytes).
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3468 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3469 * This function should be called with a port mutex held.
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 static void
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3472 sata_identdev_to_inquiry(sata_hba_inst_t *sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3473 sata_drive_info_t *sdinfo, uint8_t *buf)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3474 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3475
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3476 struct scsi_inquiry *inq = (struct scsi_inquiry *)buf;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3477 struct sata_id *sid = &sdinfo->satadrv_id;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3478
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
3479 /* Start with a nice clean slate */
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
3480 bzero((void *)inq, sizeof (struct scsi_inquiry));
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
3481
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3482 /* Rely on the dev_type for setting paripheral qualifier */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3483 /* Does DTYPE_RODIRECT apply to CD/DVD R/W devices ? */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3484 inq->inq_dtype = sdinfo->satadrv_type == SATA_DTYPE_ATADISK ?
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3485 DTYPE_DIRECT : DTYPE_RODIRECT;
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 inq->inq_rmb = sid->ai_config & SATA_REM_MEDIA ? 1 : 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3488 inq->inq_qual = 0; /* Device type qualifier (obsolete in SCSI3? */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3489 inq->inq_iso = 0; /* ISO version */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3490 inq->inq_ecma = 0; /* ECMA version */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3491 inq->inq_ansi = 3; /* ANSI version - SCSI 3 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3492 inq->inq_aenc = 0; /* Async event notification cap. */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3493 inq->inq_trmiop = 0; /* Supports TERMINATE I/O PROC msg ??? */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3494 inq->inq_normaca = 0; /* setting NACA bit supported - NO */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3495 inq->inq_rdf = RDF_SCSI2; /* Response data format- SPC-3 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3496 inq->inq_len = 31; /* Additional length */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3497 inq->inq_dualp = 0; /* dual port device - NO */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3498 inq->inq_reladdr = 0; /* Supports relative addressing - NO */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3499 inq->inq_sync = 0; /* Supports synchronous data xfers - NO */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3500 inq->inq_linked = 0; /* Supports linked commands - NO */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3501 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3502 * Queuing support - controller has to
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3503 * support some sort of command queuing.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3504 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3505 if (SATA_QDEPTH(sata_hba_inst) > 1)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3506 inq->inq_cmdque = 1; /* Supports command queueing - YES */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3507 else
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3508 inq->inq_cmdque = 0; /* Supports command queueing - NO */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3509 inq->inq_sftre = 0; /* Supports Soft Reset option - NO ??? */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3510 inq->inq_wbus32 = 0; /* Supports 32 bit wide data xfers - NO */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3511 inq->inq_wbus16 = 0; /* Supports 16 bit wide data xfers - NO */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3512
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3513 #ifdef _LITTLE_ENDIAN
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3514 /* Swap text fields to match SCSI format */
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
3515 bcopy("ATA ", inq->inq_vid, 8); /* Vendor ID */
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
3516 swab(sid->ai_model, inq->inq_pid, 16); /* Product ID */
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
3517 if (strncmp(&sid->ai_fw[4], " ", 4) == 0)
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
3518 swab(sid->ai_fw, inq->inq_revision, 4); /* Revision level */
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
3519 else
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
3520 swab(&sid->ai_fw[4], inq->inq_revision, 4); /* Rev. level */
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3521 #else
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3522 bcopy(sid->ai_model, inq->inq_vid, 8); /* Vendor ID */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3523 bcopy(&sid->ai_model[8], inq->inq_pid, 16); /* Product ID */
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
3524 if (strncmp(&sid->ai_fw[4], " ", 4) == 0)
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
3525 bcopy(sid->ai_fw, inq->inq_revision, 4); /* Revision level */
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
3526 else
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
3527 bcopy(&sid->ai_fw[4], inq->inq_revision, 4); /* Rev. level */
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3528 #endif
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3529 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3530
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3531
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3532 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3533 * Scsi response set up for invalid command (command not supported)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3534 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3535 * Returns TRAN_ACCEPT and appropriate values in scsi_pkt fields.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3536 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3537 static int
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3538 sata_txlt_invalid_command(sata_pkt_txlate_t *spx)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3539 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3540 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3541 struct scsi_extended_sense *sense;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3542
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3543 scsipkt->pkt_reason = CMD_CMPLT;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3544 scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3545 STATE_SENT_CMD | STATE_GOT_STATUS;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3546
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3547 *scsipkt->pkt_scbp = STATUS_CHECK;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3548
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3549 sense = sata_arq_sense(spx);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3550 sense->es_key = KEY_ILLEGAL_REQUEST;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3551 sense->es_add_code = SD_SCSI_INVALID_COMMAND_CODE;
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 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3554 "Scsi_pkt completion reason %x\n", scsipkt->pkt_reason);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3555
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3556 if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0 &&
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3557 scsipkt->pkt_comp != NULL)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3558 /* scsi callback required */
1781
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
3559 if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
3560 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
3561 (void *)spx->txlt_scsi_pkt,
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
3562 TQ_SLEEP) == 0)
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
3563 /* Scheduling the callback failed */
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
3564 return (TRAN_BUSY);
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3565 return (TRAN_ACCEPT);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3566 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3567
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3568 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3569 * Scsi response setup for
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3570 * emulated non-data command that requires no action/return data
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 * Returns TRAN_ACCEPT and appropriate values in scsi_pkt fields.
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 static int
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3575 sata_txlt_nodata_cmd_immediate(sata_pkt_txlate_t *spx)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3576 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3577 int rval;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3578
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3579 mutex_enter(&(SATA_TXLT_CPORT_MUTEX(spx)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3580
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3581 if ((rval = sata_txlt_generic_pkt_info(spx)) != TRAN_ACCEPT) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3582 mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3583 return (rval);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3584 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3585 mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3586
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3587 spx->txlt_scsi_pkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3588 STATE_SENT_CMD | STATE_GOT_STATUS;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3589 spx->txlt_scsi_pkt->pkt_reason = CMD_CMPLT;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3590 *(spx->txlt_scsi_pkt->pkt_scbp) = STATUS_GOOD;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3591
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3592 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3593 "Scsi_pkt completion reason %x\n",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3594 spx->txlt_scsi_pkt->pkt_reason);
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 if ((spx->txlt_scsi_pkt->pkt_flags & FLAG_NOINTR) == 0 &&
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3597 spx->txlt_scsi_pkt->pkt_comp != NULL)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3598 /* scsi callback required */
1781
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
3599 if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
3600 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
3601 (void *)spx->txlt_scsi_pkt,
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
3602 TQ_SLEEP) == 0)
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
3603 /* Scheduling the callback failed */
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
3604 return (TRAN_BUSY);
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3605 return (TRAN_ACCEPT);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3606 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3607
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3608
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3609 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3610 * SATA translate command: Inquiry / Identify Device
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3611 * Use cached Identify Device data for now, rather then issuing actual
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3612 * Device Identify cmd request. If device is detached and re-attached,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3613 * asynchromous event processing should fetch and refresh Identify Device
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3614 * data.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3615 * Two VPD pages are supported now:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3616 * Vital Product Data page
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3617 * Unit Serial Number page
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3618 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3619 * Returns TRAN_ACCEPT and appropriate values in scsi_pkt fields.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3620 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3621
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3622 #define EVPD 1 /* Extended Vital Product Data flag */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3623 #define CMDDT 2 /* Command Support Data - Obsolete */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3624 #define INQUIRY_SUP_VPD_PAGE 0 /* Supported VDP Pages Page COde */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3625 #define INQUIRY_USN_PAGE 0x80 /* Unit Serial Number Page Code */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3626 #define INQUIRY_DEV_IDENTIFICATION_PAGE 0x83 /* Not needed yet */
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 static int
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3629 sata_txlt_inquiry(sata_pkt_txlate_t *spx)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3630 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3631 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3632 struct buf *bp = spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3633 sata_drive_info_t *sdinfo;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3634 struct scsi_extended_sense *sense;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3635 int count;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3636 uint8_t *p;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3637 int i, j;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3638 uint8_t page_buf[0xff]; /* Max length */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3639 int rval;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3640
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3641 mutex_enter(&(SATA_TXLT_CPORT_MUTEX(spx)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3642
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3643 if ((rval = sata_txlt_generic_pkt_info(spx)) != TRAN_ACCEPT) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3644 mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3645 return (rval);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3646 }
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 sdinfo = sata_get_device_info(spx->txlt_sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3649 &spx->txlt_sata_pkt->satapkt_device);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3650
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3651 ASSERT(sdinfo != NULL);
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 /* Reject not supported request */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3658 if (scsipkt->pkt_cdbp[1] & CMDDT) { /* No support for this bit */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3659 *scsipkt->pkt_scbp = STATUS_CHECK;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3660 sense = sata_arq_sense(spx);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3661 sense->es_key = KEY_ILLEGAL_REQUEST;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3662 sense->es_add_code = SD_SCSI_INVALID_FIELD_IN_CDB;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3663 goto done;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3664 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3665
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3666 /* Valid Inquiry request */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3667 *scsipkt->pkt_scbp = STATUS_GOOD;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3668
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3669 if (bp != NULL && bp->b_un.b_addr && bp->b_bcount) {
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 if (!(scsipkt->pkt_cdbp[1] & EVPD)) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3672 /* Standard Inquiry Data request */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3673 struct scsi_inquiry inq;
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
3674 unsigned int bufsize;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
3675
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3676 sata_identdev_to_inquiry(spx->txlt_sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3677 sdinfo, (uint8_t *)&inq);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3678 /* Copy no more than requested */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3679 count = MIN(bp->b_bcount,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3680 sizeof (struct scsi_inquiry));
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
3681 bufsize = scsipkt->pkt_cdbp[4];
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
3682 bufsize |= scsipkt->pkt_cdbp[3] << 8;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
3683 count = MIN(count, bufsize);
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3684 bcopy(&inq, bp->b_un.b_addr, count);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3685
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3686 scsipkt->pkt_state |= STATE_XFERRED_DATA;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3687 scsipkt->pkt_resid = scsipkt->pkt_cdbp[4] > count ?
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
3688 bufsize - count : 0;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3689 } else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3690 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3691 * peripheral_qualifier = 0;
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 * We are dealing only with HD and will be
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3694 * dealing with CD/DVD devices soon
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 uint8_t peripheral_device_type =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3697 sdinfo->satadrv_type == SATA_DTYPE_ATADISK ?
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3698 DTYPE_DIRECT : DTYPE_RODIRECT;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3699
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3700 switch ((uint_t)scsipkt->pkt_cdbp[2]) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3701 case INQUIRY_SUP_VPD_PAGE:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3702 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3703 * Request for suported Vital Product Data
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3704 * pages - assuming only 2 page codes
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3705 * supported
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 page_buf[0] = peripheral_device_type;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3708 page_buf[1] = INQUIRY_SUP_VPD_PAGE;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3709 page_buf[2] = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3710 page_buf[3] = 2; /* page length */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3711 page_buf[4] = INQUIRY_SUP_VPD_PAGE;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3712 page_buf[5] = INQUIRY_USN_PAGE;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3713 /* Copy no more than requested */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3714 count = MIN(bp->b_bcount, 6);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3715 bcopy(page_buf, bp->b_un.b_addr, count);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3716 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3717 case INQUIRY_USN_PAGE:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3718 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3719 * Request for Unit Serial Number page
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3720 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3721 page_buf[0] = peripheral_device_type;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3722 page_buf[1] = INQUIRY_USN_PAGE;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3723 page_buf[2] = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3724 page_buf[3] = 20; /* remaining page length */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3725 p = (uint8_t *)(sdinfo->satadrv_id.ai_drvser);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3726 #ifdef _LITTLE_ENDIAN
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3727 swab(p, &page_buf[4], 20);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3728 #else
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3729 bcopy(p, &page_buf[4], 20);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3730 #endif
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3731 for (i = 0; i < 20; i++) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3732 if (page_buf[4 + i] == '\0' ||
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3733 page_buf[4 + i] == '\040') {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3734 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3735 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3736 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3737 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3738 * 'i' contains string length.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3739 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3740 * Least significant character of the serial
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3741 * number shall appear as the last byte,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3742 * according to SBC-3 spec.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3743 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3744 p = &page_buf[20 + 4 - 1];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3745 for (j = i; j > 0; j--, p--) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3746 *p = *(p - 20 + i);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3747 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3748 p = &page_buf[4];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3749 for (j = 20 - i; j > 0; j--) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3750 *p++ = '\040';
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3751 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3752 count = MIN(bp->b_bcount, 24);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3753 bcopy(page_buf, bp->b_un.b_addr, count);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3754 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3755
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3756 case INQUIRY_DEV_IDENTIFICATION_PAGE:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3757 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3758 * We may want to implement this page, when
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3759 * identifiers are common for SATA devices
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3760 * But not now.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3761 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3762 /*FALLTHRU*/
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3763
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3764 default:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3765 /* Request for unsupported VPD page */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3766 *scsipkt->pkt_scbp = STATUS_CHECK;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3767 sense = sata_arq_sense(spx);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3768 sense->es_key = KEY_ILLEGAL_REQUEST;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3769 sense->es_add_code =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3770 SD_SCSI_INVALID_FIELD_IN_CDB;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3771 goto done;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3772 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3773 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3774 scsipkt->pkt_state |= STATE_XFERRED_DATA;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3775 scsipkt->pkt_resid = scsipkt->pkt_cdbp[4] > count ?
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3776 scsipkt->pkt_cdbp[4] - count : 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3777 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3778 done:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3779 mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx)));
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 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3782 "Scsi_pkt completion reason %x\n",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3783 scsipkt->pkt_reason);
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 if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0 &&
1781
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
3786 scsipkt->pkt_comp != NULL) {
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3787 /* scsi callback required */
1781
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
3788 if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
3789 (task_func_t *)scsipkt->pkt_comp, (void *) scsipkt,
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
3790 TQ_SLEEP) == 0)
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
3791 /* Scheduling the callback failed */
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
3792 return (TRAN_BUSY);
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
3793 }
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3794 return (TRAN_ACCEPT);
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
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 * SATA translate command: Request Sense
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3799 * emulated command (ATA version so far, no ATAPI)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3800 * 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
3801 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3802 * Returns TRAN_ACCEPT and appropriate values in scsi_pkt fields.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3803 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3804 static int
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3805 sata_txlt_request_sense(sata_pkt_txlate_t *spx)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3806 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3807 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3808 struct scsi_extended_sense sense;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3809 struct buf *bp = spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3810 int rval;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3811
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3812 mutex_enter(&(SATA_TXLT_CPORT_MUTEX(spx)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3813
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3814 if ((rval = sata_txlt_generic_pkt_info(spx)) != TRAN_ACCEPT) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3815 mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3816 return (rval);
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 mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3819
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3820
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3821 scsipkt->pkt_reason = CMD_CMPLT;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3822 scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3823 STATE_SENT_CMD | STATE_GOT_STATUS;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3824 *scsipkt->pkt_scbp = STATUS_GOOD;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3825
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3826 if (bp != NULL && bp->b_un.b_addr && bp->b_bcount) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3827 int count = MIN(bp->b_bcount,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3828 sizeof (struct scsi_extended_sense));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3829 bzero(&sense, sizeof (struct scsi_extended_sense));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3830 sense.es_valid = 0; /* Valid LBA */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3831 sense.es_class = 7; /* Response code 0x70 - current err */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3832 sense.es_key = KEY_NO_SENSE;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3833 sense.es_add_len = 6; /* Additional length */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3834 /* Copy no more than requested */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3835 bcopy(&sense, bp->b_un.b_addr, count);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3836 scsipkt->pkt_state |= STATE_XFERRED_DATA;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3837 scsipkt->pkt_resid = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3838 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3839
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3840 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3841 "Scsi_pkt completion reason %x\n",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3842 scsipkt->pkt_reason);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3843
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3844 if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0 &&
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3845 scsipkt->pkt_comp != NULL)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3846 /* scsi callback required */
1781
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
3847 if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
3848 (task_func_t *)scsipkt->pkt_comp, (void *) scsipkt,
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
3849 TQ_SLEEP) == 0)
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
3850 /* Scheduling the callback failed */
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
3851 return (TRAN_BUSY);
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3852 return (TRAN_ACCEPT);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3853 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3854
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3855 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3856 * SATA translate command: Test Unit Ready
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3857 * 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
3858 * May be translated into Check Power Mode command in the future
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 * Returns TRAN_ACCEPT and appropriate values in scsi_pkt fields.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3861 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3862 static int
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3863 sata_txlt_test_unit_ready(sata_pkt_txlate_t *spx)
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 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3866 struct scsi_extended_sense *sense;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3867 int power_state;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3868 int rval;
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 mutex_enter(&(SATA_TXLT_CPORT_MUTEX(spx)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3871
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3872 if ((rval = sata_txlt_generic_pkt_info(spx)) != TRAN_ACCEPT) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3873 mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3874 return (rval);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3875 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3876 mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3877
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3878 /* At this moment, emulate it rather than execute anything */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3879 power_state = SATA_PWRMODE_ACTIVE;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3880
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3881 scsipkt->pkt_reason = CMD_CMPLT;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3882 scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3883 STATE_SENT_CMD | STATE_GOT_STATUS;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3884
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3885 switch (power_state) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3886 case SATA_PWRMODE_ACTIVE:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3887 case SATA_PWRMODE_IDLE:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3888 *scsipkt->pkt_scbp = STATUS_GOOD;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3889 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3890 default:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3891 /* PWR mode standby */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3892 *scsipkt->pkt_scbp = STATUS_CHECK;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3893 sense = sata_arq_sense(spx);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3894 sense->es_key = KEY_NOT_READY;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3895 sense->es_add_code = SD_SCSI_LU_NOT_READY;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3896 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3897 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3898
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3899 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3900 "Scsi_pkt completion reason %x\n", scsipkt->pkt_reason);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3901
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3902 if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0 &&
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3903 scsipkt->pkt_comp != NULL)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3904 /* scsi callback required */
1781
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
3905 if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
3906 (task_func_t *)scsipkt->pkt_comp, (void *) scsipkt,
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
3907 TQ_SLEEP) == 0)
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
3908 /* Scheduling the callback failed */
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
3909 return (TRAN_BUSY);
1258
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 return (TRAN_ACCEPT);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3912 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3913
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3914
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3915 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3916 * SATA translate command: Start Stop Unit
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3917 * Translation depends on a command:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3918 * Start Unit translated into Idle Immediate
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3919 * Stop Unit translated into Standby Immediate
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3920 * Unload Media / NOT SUPPORTED YET
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3921 * Load Media / NOT SUPPROTED YET
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3922 * Power condition bits are ignored, so is Immediate bit
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3923 * Requesting synchronous execution.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3924 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3925 * Returns TRAN_ACCEPT or code returned by sata_hba_start() and
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3926 * appropriate values in scsi_pkt fields.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3927 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3928 static int
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3929 sata_txlt_start_stop_unit(sata_pkt_txlate_t *spx)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3930 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3931 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3932 sata_cmd_t *scmd = &spx->txlt_sata_pkt->satapkt_cmd;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3933 struct scsi_extended_sense *sense;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3934 sata_hba_inst_t *shi = SATA_TXLT_HBA_INST(spx);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3935 int cport = SATA_TXLT_CPORT(spx);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3936 int rval;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3937 int synch;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3938
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3939 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3940 "sata_txlt_start_stop_unit: %d\n", scsipkt->pkt_scbp[4] & 1);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3941
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3942 mutex_enter(&SATA_CPORT_MUTEX(shi, cport));
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 if ((rval = sata_txlt_generic_pkt_info(spx)) != TRAN_ACCEPT) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3945 mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3946 return (rval);
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
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3949 if (scsipkt->pkt_cdbp[4] & 2) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3950 /* Load/Unload Media - invalid request */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3951 *scsipkt->pkt_scbp = STATUS_CHECK;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3952 sense = sata_arq_sense(spx);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3953 sense->es_key = KEY_ILLEGAL_REQUEST;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3954 sense->es_add_code = SD_SCSI_INVALID_FIELD_IN_CDB;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3955 mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3956
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3957 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3958 "Scsi_pkt completion reason %x\n", scsipkt->pkt_reason);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3959
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3960 if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0 &&
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3961 scsipkt->pkt_comp != NULL)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3962 /* scsi callback required */
1781
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
3963 if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
3964 (task_func_t *)scsipkt->pkt_comp, (void *) scsipkt,
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
3965 TQ_SLEEP) == 0)
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
3966 /* Scheduling the callback failed */
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
3967 return (TRAN_BUSY);
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3968
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3969 return (TRAN_ACCEPT);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3970 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3971 scmd->satacmd_addr_type = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3972 scmd->satacmd_sec_count_lsb = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3973 scmd->satacmd_lba_low_lsb = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3974 scmd->satacmd_lba_mid_lsb = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3975 scmd->satacmd_lba_high_lsb = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3976 scmd->satacmd_features_reg = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3977 scmd->satacmd_device_reg = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3978 scmd->satacmd_status_reg = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3979 if (scsipkt->pkt_cdbp[4] & 1) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3980 /* Start Unit */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3981 scmd->satacmd_cmd_reg = SATAC_IDLE_IM;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3982 } else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3983 /* Stop Unit */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3984 scmd->satacmd_cmd_reg = SATAC_STANDBY_IM;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3985 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3986
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3987 if (!(spx->txlt_sata_pkt->satapkt_op_mode & SATA_OPMODE_SYNCH)) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3988 /* Need to set-up a callback function */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3989 spx->txlt_sata_pkt->satapkt_comp =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3990 sata_txlt_nodata_cmd_completion;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3991 synch = FALSE;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3992 } else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3993 spx->txlt_sata_pkt->satapkt_op_mode = SATA_OPMODE_SYNCH;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3994 synch = TRUE;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3995 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3996
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3997 /* Transfer command to HBA */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3998 if (sata_hba_start(spx, &rval) != 0) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
3999 /* Pkt not accepted for execution */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4000 mutex_exit(&SATA_CPORT_MUTEX(shi, cport));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4001 return (rval);
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
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4004 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4005 * If execution is non-synchronous,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4006 * a callback function will handle potential errors, translate
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4007 * the response and will do a callback to a target driver.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4008 * If it was synchronous, check execution status using the same
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4009 * framework callback.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4010 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4011 mutex_exit(&SATA_CPORT_MUTEX(shi, cport));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4012 if (synch) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4013 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4014 "synchronous execution status %x\n",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4015 spx->txlt_sata_pkt->satapkt_reason);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4016
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4017 sata_txlt_nodata_cmd_completion(spx->txlt_sata_pkt);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4018 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4019 return (TRAN_ACCEPT);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4020
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4021 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4022
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4023
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4024 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4025 * SATA translate command: Read Capacity.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4026 * Emulated command for SATA disks.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4027 * Capacity is retrieved from cached Idenifty Device data.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4028 * Identify Device data shows effective disk capacity, not the native
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4029 * capacity, which may be limitted by Set Max Address command.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4030 * This is ATA version (non-ATAPI).
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4031 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4032 * Returns TRAN_ACCEPT and appropriate values in scsi_pkt fields.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4033 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4034 static int
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4035 sata_txlt_read_capacity(sata_pkt_txlate_t *spx)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4036 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4037 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4038 struct buf *bp = spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4039 sata_drive_info_t *sdinfo;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4040 uint64_t val;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4041 uchar_t *rbuf;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4042 int rval;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4043
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4044 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4045 "sata_txlt_read_capacity: ", NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4046
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4047 mutex_enter(&(SATA_TXLT_CPORT_MUTEX(spx)));
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 if ((rval = sata_txlt_generic_pkt_info(spx)) != TRAN_ACCEPT) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4050 mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4051 return (rval);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4052 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4053
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4054 scsipkt->pkt_reason = CMD_CMPLT;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4055 scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4056 STATE_SENT_CMD | STATE_GOT_STATUS;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4057 *scsipkt->pkt_scbp = STATUS_GOOD;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4058 if (bp != NULL && bp->b_un.b_addr && bp->b_bcount) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4059 sdinfo = sata_get_device_info(
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4060 spx->txlt_sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4061 &spx->txlt_sata_pkt->satapkt_device);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4062 /* Last logical block address */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4063 val = sdinfo->satadrv_capacity - 1;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4064 rbuf = (uchar_t *)bp->b_un.b_addr;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4065 /* Need to swap endians to match scsi format */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4066 rbuf[0] = (val >> 24) & 0xff;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4067 rbuf[1] = (val >> 16) & 0xff;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4068 rbuf[2] = (val >> 8) & 0xff;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4069 rbuf[3] = val & 0xff;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4070 /* block size - always 512 bytes, for now */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4071 rbuf[4] = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4072 rbuf[5] = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4073 rbuf[6] = 0x02;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4074 rbuf[7] = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4075 scsipkt->pkt_state |= STATE_XFERRED_DATA;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4076 scsipkt->pkt_resid = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4077
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4078 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst, "%d\n",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4079 sdinfo->satadrv_capacity -1);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4080 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4081 mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4082 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4083 * If a callback was requested, do it now.
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 */
1781
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
4091 if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
4092 (task_func_t *)scsipkt->pkt_comp, (void *) scsipkt,
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
4093 TQ_SLEEP) == 0)
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
4094 /* Scheduling the callback failed */
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
4095 return (TRAN_BUSY);
1258
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 return (TRAN_ACCEPT);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4098 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4099
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4100 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4101 * SATA translate command: Mode Sense.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4102 * Translated into appropriate SATA command or emulated.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4103 * Saved Values Page Control (03) are not supported.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4104 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4105 * NOTE: only caching mode sense page is currently implemented.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4106 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4107 * Returns TRAN_ACCEPT and appropriate values in scsi_pkt fields.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4108 */
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 static int
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4111 sata_txlt_mode_sense(sata_pkt_txlate_t *spx)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4112 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4113 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4114 struct buf *bp = spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4115 sata_drive_info_t *sdinfo;
1675
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
4116 sata_id_t *sata_id;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4117 struct scsi_extended_sense *sense;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4118 int len, bdlen, count, alc_len;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4119 int pc; /* Page Control code */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4120 uint8_t *buf; /* mode sense buffer */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4121 int rval;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4122
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4123 SATADBG2(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4124 "sata_txlt_mode_sense, pc %x page code 0x%02x\n",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4125 spx->txlt_scsi_pkt->pkt_cdbp[2] >> 6,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4126 spx->txlt_scsi_pkt->pkt_cdbp[2] & 0x3f);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4127
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4128 buf = kmem_zalloc(1024, KM_SLEEP);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4129
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4130 mutex_enter(&(SATA_TXLT_CPORT_MUTEX(spx)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4131
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4132 if ((rval = sata_txlt_generic_pkt_info(spx)) != TRAN_ACCEPT) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4133 mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4134 kmem_free(buf, 1024);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4135 return (rval);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4136 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4137
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4138 scsipkt->pkt_reason = CMD_CMPLT;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4139 scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4140 STATE_SENT_CMD | STATE_GOT_STATUS;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4141
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4142 pc = scsipkt->pkt_cdbp[2] >> 6;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4143
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4144 if (bp != NULL && bp->b_un.b_addr && bp->b_bcount) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4145 len = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4146 bdlen = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4147 if (!(scsipkt->pkt_cdbp[1] & 8)) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4148 if (scsipkt->pkt_cdbp[0] == SCMD_MODE_SENSE_G1 &&
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4149 (scsipkt->pkt_cdbp[0] & 0x10))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4150 bdlen = 16;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4151 else
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4152 bdlen = 8;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4153 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4154 /* Build mode parameter header */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4155 if (spx->txlt_scsi_pkt->pkt_cdbp[0] == SCMD_MODE_SENSE) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4156 /* 4-byte mode parameter header */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4157 buf[len++] = 0; /* mode data length */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4158 buf[len++] = 0; /* medium type */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4159 buf[len++] = 0; /* dev-specific param */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4160 buf[len++] = bdlen; /* Block Descriptor length */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4161 } else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4162 /* 8-byte mode parameter header */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4163 buf[len++] = 0; /* mode data length */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4164 buf[len++] = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4165 buf[len++] = 0; /* medium type */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4166 buf[len++] = 0; /* dev-specific param */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4167 if (bdlen == 16)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4168 buf[len++] = 1; /* long lba descriptor */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4169 else
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4170 buf[len++] = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4171 buf[len++] = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4172 buf[len++] = 0; /* Block Descriptor length */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4173 buf[len++] = bdlen;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4174 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4175
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4176 sdinfo = sata_get_device_info(
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4177 spx->txlt_sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4178 &spx->txlt_sata_pkt->satapkt_device);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4179
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4180 /* Build block descriptor only if not disabled (DBD) */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4181 if ((scsipkt->pkt_cdbp[1] & 0x08) == 0) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4182 /* Block descriptor - direct-access device format */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4183 if (bdlen == 8) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4184 /* build regular block descriptor */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4185 buf[len++] =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4186 (sdinfo->satadrv_capacity >> 24) & 0xff;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4187 buf[len++] =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4188 (sdinfo->satadrv_capacity >> 16) & 0xff;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4189 buf[len++] =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4190 (sdinfo->satadrv_capacity >> 8) & 0xff;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4191 buf[len++] = sdinfo->satadrv_capacity & 0xff;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4192 buf[len++] = 0; /* density code */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4193 buf[len++] = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4194 if (sdinfo->satadrv_type ==
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4195 SATA_DTYPE_ATADISK)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4196 buf[len++] = 2;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4197 else
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4198 /* ATAPI */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4199 buf[len++] = 8;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4200 buf[len++] = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4201 } else if (bdlen == 16) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4202 /* Long LBA Accepted */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4203 /* build long lba block descriptor */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4204 #ifndef __lock_lint
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4205 buf[len++] =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4206 (sdinfo->satadrv_capacity >> 56) & 0xff;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4207 buf[len++] =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4208 (sdinfo->satadrv_capacity >> 48) & 0xff;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4209 buf[len++] =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4210 (sdinfo->satadrv_capacity >> 40) & 0xff;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4211 buf[len++] =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4212 (sdinfo->satadrv_capacity >> 32) & 0xff;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4213 #endif
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4214 buf[len++] =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4215 (sdinfo->satadrv_capacity >> 24) & 0xff;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4216 buf[len++] =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4217 (sdinfo->satadrv_capacity >> 16) & 0xff;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4218 buf[len++] =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4219 (sdinfo->satadrv_capacity >> 8) & 0xff;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4220 buf[len++] = sdinfo->satadrv_capacity & 0xff;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4221 buf[len++] = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4222 buf[len++] = 0; /* density code */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4223 buf[len++] = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4224 buf[len++] = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4225 if (sdinfo->satadrv_type ==
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4226 SATA_DTYPE_ATADISK)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4227 buf[len++] = 2;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4228 else
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4229 /* ATAPI */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4230 buf[len++] = 8;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4231 buf[len++] = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4232 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4233 }
1675
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
4234
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
4235 sata_id = &sdinfo->satadrv_id;
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
4236
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4237 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4238 * Add requested pages.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4239 * Page 3 and 4 are obsolete and we are not supporting them.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4240 * We deal now with:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4241 * caching (read/write cache control).
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4242 * We should eventually deal with following mode pages:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4243 * error recovery (0x01),
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4244 * power condition (0x1a),
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4245 * exception control page (enables SMART) (0x1c),
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4246 * enclosure management (ses),
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4247 * protocol-specific port mode (port control).
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 switch (scsipkt->pkt_cdbp[2] & 0x3f) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4250 case MODEPAGE_RW_ERRRECOV:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4251 /* DAD_MODE_ERR_RECOV */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4252 /* R/W recovery */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4253 len += sata_build_msense_page_1(sdinfo, pc, buf+len);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4254 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4255 case MODEPAGE_CACHING:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4256 /* DAD_MODE_CACHE */
1675
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
4257 /* Reject not supported request for saved parameters */
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
4258 if (pc == 3) {
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
4259 *scsipkt->pkt_scbp = STATUS_CHECK;
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
4260 sense = sata_arq_sense(spx);
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
4261 sense->es_key = KEY_ILLEGAL_REQUEST;
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
4262 sense->es_add_code =
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
4263 SD_SCSI_SAVING_PARAMS_NOT_SUP;
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
4264 goto done;
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
4265 }
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
4266
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4267 /* caching */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4268 len += sata_build_msense_page_8(sdinfo, pc, buf+len);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4269 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4270 case MODEPAGE_INFO_EXCPT:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4271 /* exception cntrl */
1675
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
4272 if (sata_id->ai_cmdset82 & SATA_SMART_SUPPORTED) {
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
4273 len += sata_build_msense_page_1c(sdinfo, pc,
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
4274 buf+len);
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
4275 }
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
4276 else
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
4277 goto err;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4278 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4279 case MODEPAGE_POWER_COND:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4280 /* DAD_MODE_POWER_COND */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4281 /* power condition */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4282 len += sata_build_msense_page_1a(sdinfo, pc, buf+len);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4283 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4284 case MODEPAGE_ALLPAGES:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4285 /* all pages */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4286 len += sata_build_msense_page_1(sdinfo, pc, buf+len);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4287 len += sata_build_msense_page_8(sdinfo, pc, buf+len);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4288 len += sata_build_msense_page_1a(sdinfo, pc, buf+len);
1675
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
4289 if (sata_id->ai_cmdset82 & SATA_SMART_SUPPORTED) {
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
4290 len += sata_build_msense_page_1c(sdinfo, pc,
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
4291 buf+len);
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
4292 }
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4293 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4294 default:
1675
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
4295 err:
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4296 /* Invalid request */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4297 *scsipkt->pkt_scbp = STATUS_CHECK;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4298 sense = sata_arq_sense(spx);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4299 sense->es_key = KEY_ILLEGAL_REQUEST;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4300 sense->es_add_code = SD_SCSI_INVALID_FIELD_IN_CDB;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4301 goto done;
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
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4304 /* fix total mode data length */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4305 if (spx->txlt_scsi_pkt->pkt_cdbp[0] == SCMD_MODE_SENSE) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4306 /* 4-byte mode parameter header */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4307 buf[0] = len - 1; /* mode data length */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4308 } else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4309 buf[0] = (len -2) >> 8;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4310 buf[1] = (len -2) & 0xff;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4311 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4312
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4313
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4314 /* Check allocation length */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4315 if (scsipkt->pkt_cdbp[0] == SCMD_MODE_SENSE) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4316 alc_len = scsipkt->pkt_cdbp[4];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4317 } else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4318 alc_len = scsipkt->pkt_cdbp[7];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4319 alc_len = (len << 8) | scsipkt->pkt_cdbp[8];
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 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4322 * We do not check for possible parameters truncation
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4323 * (alc_len < len) assuming that the target driver works
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4324 * correctly. Just avoiding overrun.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4325 * Copy no more than requested and possible, buffer-wise.
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 count = MIN(alc_len, len);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4328 count = MIN(bp->b_bcount, count);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4329 bcopy(buf, bp->b_un.b_addr, count);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4330
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4331 scsipkt->pkt_state |= STATE_XFERRED_DATA;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4332 scsipkt->pkt_resid = alc_len > count ? alc_len - count : 0;
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 *scsipkt->pkt_scbp = STATUS_GOOD;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4335 done:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4336 mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4337 (void) kmem_free(buf, 1024);
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 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4340 "Scsi_pkt completion reason %x\n", scsipkt->pkt_reason);
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 if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0 &&
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4343 scsipkt->pkt_comp != NULL)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4344 /* scsi callback required */
1781
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
4345 if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
4346 (task_func_t *)scsipkt->pkt_comp, (void *) scsipkt,
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
4347 TQ_SLEEP) == 0)
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
4348 /* Scheduling the callback failed */
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
4349 return (TRAN_BUSY);
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4350
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4351 return (TRAN_ACCEPT);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4352 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4353
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4354
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 * SATA translate command: Mode Select.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4357 * Translated into appropriate SATA command or emulated.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4358 * Saving parameters is not supported.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4359 * Changing device capacity is not supported (although theoretically
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4360 * possible by executing SET FEATURES/SET MAX ADDRESS)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4361 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4362 * Assumption is that the target driver is working correctly.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4363 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4364 * More than one SATA command may be executed to perform operations specified
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4365 * by mode select pages. The first error terminates further execution.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4366 * Operations performed successully are not backed-up in such case.
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 * NOTE: only caching mode select page is implemented.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4369 * 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
4370 * an unexpected device reset.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4371 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4372 * Returns TRAN_ACCEPT and appropriate values in scsi_pkt fields.
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
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4375 static int
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4376 sata_txlt_mode_select(sata_pkt_txlate_t *spx)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4377 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4378 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4379 struct buf *bp = spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4380 struct scsi_extended_sense *sense;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4381 int len, pagelen, count, pllen;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4382 uint8_t *buf; /* mode select buffer */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4383 int rval, stat;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4384 uint_t nointr_flag;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4385 int dmod = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4386
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4387 SATADBG2(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4388 "sata_txlt_mode_select, pc %x page code 0x%02x\n",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4389 spx->txlt_scsi_pkt->pkt_cdbp[2] >> 6,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4390 spx->txlt_scsi_pkt->pkt_cdbp[2] & 0x3f);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4391
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4392 mutex_enter(&(SATA_TXLT_CPORT_MUTEX(spx)));
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 if ((rval = sata_txlt_generic_pkt_info(spx)) != TRAN_ACCEPT) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4395 mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4396 return (rval);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4397 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4398
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4399 rval = TRAN_ACCEPT;
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 scsipkt->pkt_reason = CMD_CMPLT;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4402 scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4403 STATE_SENT_CMD | STATE_GOT_STATUS;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4404
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4405 /* Reject not supported request */
1675
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
4406 if (! (scsipkt->pkt_cdbp[1] & 0x10)) { /* No support for PF bit = 0 */
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4407 *scsipkt->pkt_scbp = STATUS_CHECK;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4408 sense = sata_arq_sense(spx);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4409 sense->es_key = KEY_ILLEGAL_REQUEST;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4410 sense->es_add_code = SD_SCSI_INVALID_FIELD_IN_CDB;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4411 goto done;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4412 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4413
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4414 if (scsipkt->pkt_cdbp[0] == SCMD_MODE_SELECT) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4415 pllen = scsipkt->pkt_cdbp[4];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4416 } else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4417 pllen = scsipkt->pkt_cdbp[7];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4418 pllen = (pllen << 8) | scsipkt->pkt_cdbp[7];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4419 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4420
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4421 *scsipkt->pkt_scbp = STATUS_GOOD; /* Presumed outcome */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4422
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4423 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
4424 buf = (uint8_t *)bp->b_un.b_addr;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4425 count = MIN(bp->b_bcount, pllen);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4426 scsipkt->pkt_state |= STATE_XFERRED_DATA;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4427 scsipkt->pkt_resid = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4428 pllen = count;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4429
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4430 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4431 * Check the header to skip the block descriptor(s) - we
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4432 * do not support setting device capacity.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4433 * Existing macros do not recognize long LBA dscriptor,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4434 * hence manual calculation.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4435 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4436 if (scsipkt->pkt_cdbp[0] == SCMD_MODE_SELECT) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4437 /* 6-bytes CMD, 4 bytes header */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4438 if (count <= 4)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4439 goto done; /* header only */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4440 len = buf[3] + 4;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4441 } else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4442 /* 10-bytes CMD, 8 bytes header */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4443 if (count <= 8)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4444 goto done; /* header only */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4445 len = buf[6];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4446 len = (len << 8) + buf[7] + 8;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4447 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4448 if (len >= count)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4449 goto done; /* header + descriptor(s) only */
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 pllen -= len; /* remaining data length */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4452
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 * We may be executing SATA command and want to execute it
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4455 * in SYNCH mode, regardless of scsi_pkt setting.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4456 * Save scsi_pkt setting and indicate SYNCH mode
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4457 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4458 nointr_flag = scsipkt->pkt_flags & FLAG_NOINTR;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4459 if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0 &&
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4460 scsipkt->pkt_comp != NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4461 scsipkt->pkt_flags |= FLAG_NOINTR;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4462 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4463 spx->txlt_sata_pkt->satapkt_op_mode = SATA_OPMODE_SYNCH;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4464
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4465 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4466 * len is now the offset to a first mode select page
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4467 * Process all pages
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4468 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4469 while (pllen > 0) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4470 switch ((int)buf[len]) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4471 case MODEPAGE_CACHING:
1675
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
4472 /* No support for SP (saving) */
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
4473 if (scsipkt->pkt_cdbp[1] & 0x01) {
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
4474 *scsipkt->pkt_scbp = STATUS_CHECK;
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
4475 sense = sata_arq_sense(spx);
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
4476 sense->es_key = KEY_ILLEGAL_REQUEST;
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
4477 sense->es_add_code =
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
4478 SD_SCSI_INVALID_FIELD_IN_CDB;
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
4479 goto done;
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
4480 }
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4481 stat = sata_mode_select_page_8(spx,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4482 (struct mode_cache_scsi3 *)&buf[len],
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4483 pllen, &pagelen, &rval, &dmod);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4484 /*
1675
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
4485 * The pagelen value indicates the number of
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4486 * parameter bytes already processed.
1675
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
4487 * The rval is the return value from
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
4488 * sata_tran_start().
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
4489 * The stat indicates the overall status of
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
4490 * the operation(s).
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
4491 */
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
4492 if (stat != SATA_SUCCESS)
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
4493 /*
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
4494 * Page processing did not succeed -
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
4495 * all error info is already set-up,
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
4496 * just return
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
4497 */
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
4498 pllen = 0; /* this breaks the loop */
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
4499 else {
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
4500 len += pagelen;
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
4501 pllen -= pagelen;
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
4502 }
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
4503 break;
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
4504
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
4505 case MODEPAGE_INFO_EXCPT:
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
4506 stat = sata_mode_select_page_1c(spx,
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
4507 (struct mode_info_excpt_page *)&buf[len],
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
4508 pllen, &pagelen, &rval, &dmod);
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
4509 /*
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
4510 * The pagelen value indicates the number of
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
4511 * parameter bytes already processed.
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
4512 * The rval is the return value from
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4513 * sata_tran_start().
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4514 * The stat indicates the overall status of
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4515 * the operation(s).
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 if (stat != SATA_SUCCESS)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4518 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4519 * Page processing did not succeed -
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4520 * all error info is already set-up,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4521 * just return
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 pllen = 0; /* this breaks the loop */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4524 else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4525 len += pagelen;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4526 pllen -= pagelen;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4527 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4528 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4529
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4530 default:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4531 *scsipkt->pkt_scbp = STATUS_CHECK;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4532 sense = sata_arq_sense(spx);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4533 sense->es_key = KEY_ILLEGAL_REQUEST;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4534 sense->es_add_code =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4535 SD_SCSI_INVALID_FIELD_IN_PARAMETER_LIST;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4536 goto done;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4537 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4538 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4539 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4540 done:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4541 mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4542 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4543 * If device parameters were modified, fetch and store the new
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4544 * Identify Device data. Since port mutex could have been released
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4545 * for accessing HBA driver, we need to re-check device existence.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4546 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4547 if (dmod != 0) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4548 sata_drive_info_t new_sdinfo, *sdinfo;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4549 int rv;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4550
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4551 new_sdinfo.satadrv_addr =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4552 spx->txlt_sata_pkt->satapkt_device.satadev_addr;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4553 rv = sata_fetch_device_identify_data(spx->txlt_sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4554 &new_sdinfo);
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 mutex_enter(&(SATA_TXLT_CPORT_MUTEX(spx)));
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 * Since port mutex could have been released when
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4559 * accessing HBA driver, we need to re-check that the
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4560 * framework still holds the device info structure.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4561 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4562 sdinfo = sata_get_device_info(spx->txlt_sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4563 &spx->txlt_sata_pkt->satapkt_device);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4564 if (sdinfo != NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4565 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4566 * Device still has info structure in the
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4567 * sata framework. Copy newly fetched info
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4568 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4569 if (rv == 0) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4570 sdinfo->satadrv_id = new_sdinfo.satadrv_id;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4571 sata_save_drive_settings(sdinfo);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4572 } else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4573 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4574 * Could not fetch new data - invalidate
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4575 * sata_drive_info. That makes device
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4576 * unusable.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4577 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4578 sdinfo->satadrv_type = SATA_DTYPE_UNKNOWN;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4579 sdinfo->satadrv_state = SATA_STATE_UNKNOWN;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4580 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4581 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4582 if (rv != 0 || sdinfo == NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4583 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4584 * This changes the overall mode select completion
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4585 * reason to a failed one !!!!!
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4586 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4587 *scsipkt->pkt_scbp = STATUS_CHECK;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4588 sense = sata_arq_sense(spx);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4589 scsipkt->pkt_reason = CMD_INCOMPLETE;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4590 rval = TRAN_ACCEPT;
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 mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4593 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4594 /* Restore the scsi pkt flags */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4595 scsipkt->pkt_flags &= ~FLAG_NOINTR;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4596 scsipkt->pkt_flags |= nointr_flag;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4597
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4598 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4599 "Scsi_pkt completion reason %x\n", scsipkt->pkt_reason);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4600
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4601 if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0 &&
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4602 scsipkt->pkt_comp != NULL)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4603 /* scsi callback required */
1781
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
4604 if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
4605 (task_func_t *)scsipkt->pkt_comp, (void *) scsipkt,
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
4606 TQ_SLEEP) == 0)
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
4607 /* Scheduling the callback failed */
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
4608 return (TRAN_BUSY);
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4609
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4610 return (rval);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4611 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4612
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4613
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4614
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4615 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4616 * Translate command: Log Sense
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4617 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4618 static int
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4619 sata_txlt_log_sense(sata_pkt_txlate_t *spx)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4620 {
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
4621 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
4622 struct buf *bp = spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
4623 sata_drive_info_t *sdinfo;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
4624 struct scsi_extended_sense *sense;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
4625 int len, count, alc_len;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
4626 int pc; /* Page Control code */
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
4627 int page_code; /* Page code */
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
4628 uint8_t *buf; /* log sense buffer */
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
4629 int rval;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
4630 #define MAX_LOG_SENSE_PAGE_SIZE 512
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
4631
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4632 SATADBG2(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
4633 "sata_txlt_log_sense, pc 0x%x, page code 0x%x\n",
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4634 spx->txlt_scsi_pkt->pkt_cdbp[2] >> 6,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4635 spx->txlt_scsi_pkt->pkt_cdbp[2] & 0x3f);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4636
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
4637 buf = kmem_zalloc(MAX_LOG_SENSE_PAGE_SIZE, KM_SLEEP);
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
4638
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
4639 mutex_enter(&(SATA_TXLT_CPORT_MUTEX(spx)));
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
4640
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
4641 if ((rval = sata_txlt_generic_pkt_info(spx)) != TRAN_ACCEPT) {
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
4642 mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx)));
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
4643 kmem_free(buf, MAX_LOG_SENSE_PAGE_SIZE);
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
4644 return (rval);
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
4645 }
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
4646
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
4647 scsipkt->pkt_reason = CMD_CMPLT;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
4648 scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
4649 STATE_SENT_CMD | STATE_GOT_STATUS;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
4650
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
4651 pc = scsipkt->pkt_cdbp[2] >> 6;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
4652 page_code = scsipkt->pkt_cdbp[2] & 0x3f;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
4653
2553
624f674f2ad8 6430966 SATA NCQ support is needed in SATA framework and hba drivers
ls24207
parents: 2539
diff changeset
4654 /* Reject not supported request for all but cumulative values */
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
4655 switch (pc) {
2553
624f674f2ad8 6430966 SATA NCQ support is needed in SATA framework and hba drivers
ls24207
parents: 2539
diff changeset
4656 case PC_CUMULATIVE_VALUES:
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
4657 break;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
4658 default:
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
4659 *scsipkt->pkt_scbp = STATUS_CHECK;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
4660 sense = sata_arq_sense(spx);
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
4661 sense->es_key = KEY_ILLEGAL_REQUEST;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
4662 sense->es_add_code = SD_SCSI_INVALID_FIELD_IN_CDB;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
4663 goto done;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
4664 }
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
4665
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
4666 switch (page_code) {
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
4667 case PAGE_CODE_GET_SUPPORTED_LOG_PAGES:
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
4668 case PAGE_CODE_SELF_TEST_RESULTS:
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
4669 case PAGE_CODE_INFORMATION_EXCEPTIONS:
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
4670 case PAGE_CODE_SMART_READ_DATA:
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
4671 break;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
4672 default:
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
4673 *scsipkt->pkt_scbp = STATUS_CHECK;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
4674 sense = sata_arq_sense(spx);
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
4675 sense->es_key = KEY_ILLEGAL_REQUEST;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
4676 sense->es_add_code = SD_SCSI_INVALID_FIELD_IN_CDB;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
4677 goto done;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
4678 }
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
4679
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
4680 if (bp != NULL && bp->b_un.b_addr && bp->b_bcount) {
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
4681 sata_id_t *sata_id;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
4682 len = 0;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
4683
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
4684 /* Build log parameter header */
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
4685 buf[len++] = page_code; /* page code as in the CDB */
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
4686 buf[len++] = 0; /* reserved */
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
4687 buf[len++] = 0; /* Zero out page length for now (MSB) */
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
4688 buf[len++] = 0; /* (LSB) */
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
4689
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
4690 sdinfo = sata_get_device_info(
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
4691 spx->txlt_sata_hba_inst,
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
4692 &spx->txlt_sata_pkt->satapkt_device);
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
4693
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
4694
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
4695 /*
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
4696 * Add requested pages.
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
4697 */
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
4698 switch (page_code) {
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
4699 case PAGE_CODE_GET_SUPPORTED_LOG_PAGES:
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
4700 len = sata_build_lsense_page_0(sdinfo, buf + len);
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
4701 break;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
4702 case PAGE_CODE_SELF_TEST_RESULTS:
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
4703 sata_id = &sdinfo->satadrv_id;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
4704 if ((! (sata_id->ai_cmdset84 &
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
4705 SATA_SMART_SELF_TEST_SUPPORTED)) ||
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
4706 (! (sata_id->ai_features87 &
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
4707 SATA_SMART_SELF_TEST_SUPPORTED))) {
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
4708 *scsipkt->pkt_scbp = STATUS_CHECK;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
4709 sense = sata_arq_sense(spx);
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
4710 sense->es_key = KEY_ILLEGAL_REQUEST;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
4711 sense->es_add_code =
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
4712 SD_SCSI_INVALID_FIELD_IN_CDB;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
4713
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
4714 goto done;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
4715 }
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
4716 len = sata_build_lsense_page_10(sdinfo, buf + len,
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
4717 spx->txlt_sata_hba_inst);
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
4718 break;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
4719 case PAGE_CODE_INFORMATION_EXCEPTIONS:
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
4720 sata_id = &sdinfo->satadrv_id;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
4721 if (! (sata_id->ai_cmdset82 & SATA_SMART_SUPPORTED)) {
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
4722 *scsipkt->pkt_scbp = STATUS_CHECK;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
4723 sense = sata_arq_sense(spx);
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
4724 sense->es_key = KEY_ILLEGAL_REQUEST;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
4725 sense->es_add_code =
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
4726 SD_SCSI_INVALID_FIELD_IN_CDB;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
4727
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
4728 goto done;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
4729 }
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
4730 if (! (sata_id->ai_features85 & SATA_SMART_ENABLED)) {
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
4731 *scsipkt->pkt_scbp = STATUS_CHECK;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
4732 sense = sata_arq_sense(spx);
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
4733 sense->es_key = KEY_ABORTED_COMMAND;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
4734 sense->es_add_code =
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
4735 SCSI_ASC_ATA_DEV_FEAT_NOT_ENABLED;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
4736 sense->es_qual_code =
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
4737 SCSI_ASCQ_ATA_DEV_FEAT_NOT_ENABLED;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
4738
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
4739 goto done;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
4740 }
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
4741
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
4742 len = sata_build_lsense_page_2f(sdinfo, buf + len,
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
4743 spx->txlt_sata_hba_inst);
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
4744 break;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
4745 case PAGE_CODE_SMART_READ_DATA:
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
4746 sata_id = &sdinfo->satadrv_id;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
4747 if (! (sata_id->ai_cmdset82 & SATA_SMART_SUPPORTED)) {
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
4748 *scsipkt->pkt_scbp = STATUS_CHECK;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
4749 sense = sata_arq_sense(spx);
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
4750 sense->es_key = KEY_ILLEGAL_REQUEST;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
4751 sense->es_add_code =
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
4752 SD_SCSI_INVALID_FIELD_IN_CDB;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
4753
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
4754 goto done;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
4755 }
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
4756 if (! (sata_id->ai_features85 & SATA_SMART_ENABLED)) {
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
4757 *scsipkt->pkt_scbp = STATUS_CHECK;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
4758 sense = sata_arq_sense(spx);
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
4759 sense->es_key = KEY_ABORTED_COMMAND;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
4760 sense->es_add_code =
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
4761 SCSI_ASC_ATA_DEV_FEAT_NOT_ENABLED;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
4762 sense->es_qual_code =
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
4763 SCSI_ASCQ_ATA_DEV_FEAT_NOT_ENABLED;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
4764
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
4765 goto done;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
4766 }
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
4767
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
4768 /* This page doesn't include a page header */
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
4769 len = sata_build_lsense_page_30(sdinfo, buf,
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
4770 spx->txlt_sata_hba_inst);
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
4771 goto no_header;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
4772 default:
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
4773 /* Invalid request */
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
4774 *scsipkt->pkt_scbp = STATUS_CHECK;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
4775 sense = sata_arq_sense(spx);
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
4776 sense->es_key = KEY_ILLEGAL_REQUEST;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
4777 sense->es_add_code = SD_SCSI_INVALID_FIELD_IN_CDB;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
4778 goto done;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
4779 }
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
4780
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
4781 /* set parameter log sense data length */
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
4782 buf[2] = len >> 8; /* log sense length (MSB) */
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
4783 buf[3] = len & 0xff; /* log sense length (LSB) */
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
4784
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
4785 len += SCSI_LOG_PAGE_HDR_LEN;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
4786 ASSERT(len <= MAX_LOG_SENSE_PAGE_SIZE);
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
4787
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
4788 no_header:
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
4789 /* Check allocation length */
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
4790 alc_len = scsipkt->pkt_cdbp[7];
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
4791 alc_len = (len << 8) | scsipkt->pkt_cdbp[8];
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
4792
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
4793 /*
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
4794 * We do not check for possible parameters truncation
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
4795 * (alc_len < len) assuming that the target driver works
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
4796 * correctly. Just avoiding overrun.
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
4797 * Copy no more than requested and possible, buffer-wise.
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
4798 */
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
4799 count = MIN(alc_len, len);
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
4800 count = MIN(bp->b_bcount, count);
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
4801 bcopy(buf, bp->b_un.b_addr, count);
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
4802
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
4803 scsipkt->pkt_state |= STATE_XFERRED_DATA;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
4804 scsipkt->pkt_resid = alc_len > count ? alc_len - count : 0;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
4805 }
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
4806 *scsipkt->pkt_scbp = STATUS_GOOD;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
4807 done:
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
4808 mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx)));
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
4809 (void) kmem_free(buf, MAX_LOG_SENSE_PAGE_SIZE);
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
4810
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
4811 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
4812 "Scsi_pkt completion reason %x\n", scsipkt->pkt_reason);
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
4813
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
4814 if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0 &&
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
4815 scsipkt->pkt_comp != NULL)
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
4816 /* scsi callback required */
1781
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
4817 if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
4818 (task_func_t *)scsipkt->pkt_comp, (void *) scsipkt,
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
4819 TQ_SLEEP) == 0)
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
4820 /* Scheduling the callback failed */
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
4821 return (TRAN_BUSY);
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
4822
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
4823 return (TRAN_ACCEPT);
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4824 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4825
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4826 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4827 * Translate command: Log Select
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4828 * Not implemented at this time - returns invalid command response.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4829 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4830 static int
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4831 sata_txlt_log_select(sata_pkt_txlate_t *spx)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4832 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4833 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4834 "sata_txlt_log_select\n", NULL);
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 return (sata_txlt_invalid_command(spx));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4837 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4838
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4839
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4840 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4841 * Translate command: Read (various types).
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4842 * Translated into appropriate type of ATA READ command
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4843 * (NO ATAPI implementation yet).
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4844 * Both the device capabilities and requested operation mode are
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4845 * considered.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4846 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4847 * Following scsi cdb fields are ignored:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4848 * rdprotect, dpo, fua, fua_nv, group_number.
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 SATA_ENABLE_QUEUING flag is set (in the global SATA HBA framework
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4851 * enable variable sata_func_enable), the capability of the controller and
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4852 * capability of a device are checked and if both support queueing, read
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4853 * 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
4854 * command rather than plain READ_XXX command.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4855 * 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
4856 * both the controller and device suport such functionality, the read
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4857 * request will be translated to READ_FPDMA_QUEUED command.
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 * Returns TRAN_ACCEPT or code returned by sata_hba_start() and
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4860 * appropriate values in scsi_pkt fields.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4861 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4862 static int
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4863 sata_txlt_read(sata_pkt_txlate_t *spx)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4864 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4865 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4866 sata_cmd_t *scmd = &spx->txlt_sata_pkt->satapkt_cmd;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4867 sata_drive_info_t *sdinfo;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4868 sata_hba_inst_t *shi = SATA_TXLT_HBA_INST(spx);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4869 int cport = SATA_TXLT_CPORT(spx);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4870 uint16_t sec_count;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4871 uint64_t lba;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4872 int rval;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4873 int synch;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4874
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4875 mutex_enter(&(SATA_TXLT_CPORT_MUTEX(spx)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4876
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4877 if ((rval = sata_txlt_generic_pkt_info(spx)) != TRAN_ACCEPT) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4878 mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4879 return (rval);
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
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4882 sdinfo = sata_get_device_info(spx->txlt_sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4883 &spx->txlt_sata_pkt->satapkt_device);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4884
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
4885 scmd->satacmd_flags.sata_data_direction = SATA_DIR_READ;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4886 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4887 * Build cmd block depending on the device capability and
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4888 * requested operation mode.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4889 * Do not bother with non-dma mode.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4890 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4891 switch ((uint_t)scsipkt->pkt_cdbp[0]) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4892 case SCMD_READ:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4893 /* 6-byte scsi read cmd : 0x08 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4894 lba = (scsipkt->pkt_cdbp[1] & 0x1f);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4895 lba = (lba << 8) | scsipkt->pkt_cdbp[2];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4896 lba = (lba << 8) | scsipkt->pkt_cdbp[3];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4897 sec_count = scsipkt->pkt_cdbp[4];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4898 /* sec_count 0 will be interpreted as 256 by a device */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4899 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4900 case SCMD_READ_G1:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4901 /* 10-bytes scsi read command : 0x28 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4902 lba = scsipkt->pkt_cdbp[2];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4903 lba = (lba << 8) | scsipkt->pkt_cdbp[3];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4904 lba = (lba << 8) | scsipkt->pkt_cdbp[4];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4905 lba = (lba << 8) | scsipkt->pkt_cdbp[5];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4906 sec_count = scsipkt->pkt_cdbp[7];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4907 sec_count = (sec_count << 8) | scsipkt->pkt_cdbp[8];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4908 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4909 case SCMD_READ_G5:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4910 /* 12-bytes scsi read command : 0xA8 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4911 lba = scsipkt->pkt_cdbp[2];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4912 lba = (lba << 8) | scsipkt->pkt_cdbp[3];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4913 lba = (lba << 8) | scsipkt->pkt_cdbp[4];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4914 lba = (lba << 8) | scsipkt->pkt_cdbp[5];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4915 sec_count = scsipkt->pkt_cdbp[6];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4916 sec_count = (sec_count << 8) | scsipkt->pkt_cdbp[7];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4917 sec_count = (sec_count << 8) | scsipkt->pkt_cdbp[8];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4918 sec_count = (sec_count << 8) | scsipkt->pkt_cdbp[9];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4919 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4920 case SCMD_READ_G4:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4921 /* 16-bytes scsi read command : 0x88 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4922 lba = scsipkt->pkt_cdbp[2];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4923 lba = (lba << 8) | scsipkt->pkt_cdbp[3];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4924 lba = (lba << 8) | scsipkt->pkt_cdbp[4];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4925 lba = (lba << 8) | scsipkt->pkt_cdbp[5];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4926 lba = (lba << 8) | scsipkt->pkt_cdbp[6];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4927 lba = (lba << 8) | scsipkt->pkt_cdbp[7];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4928 lba = (lba << 8) | scsipkt->pkt_cdbp[8];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4929 lba = (lba << 8) | scsipkt->pkt_cdbp[9];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4930 sec_count = scsipkt->pkt_cdbp[10];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4931 sec_count = (sec_count << 8) | scsipkt->pkt_cdbp[11];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4932 sec_count = (sec_count << 8) | scsipkt->pkt_cdbp[12];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4933 sec_count = (sec_count << 8) | scsipkt->pkt_cdbp[13];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4934 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4935 default:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4936 /* Unsupported command */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4937 mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4938 return (sata_txlt_invalid_command(spx));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4939 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4940
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4941 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4942 * Check if specified address exceeds device capacity
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4943 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4944 if ((lba >= sdinfo->satadrv_capacity) ||
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4945 ((lba + sec_count) >= sdinfo->satadrv_capacity)) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4946 /* LBA out of range */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4947 mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4948 return (sata_txlt_lba_out_of_range(spx));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4949 }
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 scmd->satacmd_addr_type = ATA_ADDR_LBA;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4952 scmd->satacmd_device_reg = SATA_ADH_LBA;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4953 scmd->satacmd_cmd_reg = SATAC_READ_DMA;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4954 if (sdinfo->satadrv_features_support & SATA_DEV_F_LBA48) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4955 scmd->satacmd_addr_type = ATA_ADDR_LBA48;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4956 scmd->satacmd_cmd_reg = SATAC_READ_DMA_EXT;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4957 scmd->satacmd_sec_count_msb = sec_count >> 8;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4958 #ifndef __lock_lint
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4959 scmd->satacmd_lba_low_msb = (lba >> 24) & 0xff;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4960 scmd->satacmd_lba_mid_msb = (lba >> 32) & 0xff;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4961 scmd->satacmd_lba_high_msb = lba >> 40;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4962 #endif
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4963 } else if (sdinfo->satadrv_features_support & SATA_DEV_F_LBA28) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4964 scmd->satacmd_addr_type = ATA_ADDR_LBA28;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4965 scmd->satacmd_device_reg = SATA_ADH_LBA | ((lba >> 24) & 0xf);
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 scmd->satacmd_sec_count_lsb = sec_count & 0xff;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4968 scmd->satacmd_lba_low_lsb = lba & 0xff;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4969 scmd->satacmd_lba_mid_lsb = (lba >> 8) & 0xff;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4970 scmd->satacmd_lba_high_lsb = (lba >> 16) & 0xff;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4971 scmd->satacmd_features_reg = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4972 scmd->satacmd_status_reg = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4973 scmd->satacmd_error_reg = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4974
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4975 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4976 * Check if queueing commands should be used and switch
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
4977 * to appropriate command if possible
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 if (sata_func_enable & SATA_ENABLE_QUEUING) {
1940
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
4980 boolean_t using_queuing;
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
4981
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
4982 /* Queuing supported by controller and device? */
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
4983 if ((sata_func_enable & SATA_ENABLE_NCQ) &&
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
4984 (sdinfo->satadrv_features_support &
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
4985 SATA_DEV_F_NCQ) &&
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
4986 (SATA_FEATURES(spx->txlt_sata_hba_inst) &
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
4987 SATA_CTLF_NCQ)) {
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
4988 using_queuing = B_TRUE;
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
4989
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
4990 /* NCQ supported - use FPDMA READ */
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
4991 scmd->satacmd_cmd_reg =
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
4992 SATAC_READ_FPDMA_QUEUED;
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
4993 scmd->satacmd_features_reg_ext =
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
4994 scmd->satacmd_sec_count_msb;
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
4995 scmd->satacmd_sec_count_msb = 0;
2553
624f674f2ad8 6430966 SATA NCQ support is needed in SATA framework and hba drivers
ls24207
parents: 2539
diff changeset
4996 scmd->satacmd_rle_sata_cmd = &sata_rle_cmd;
1940
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
4997 } else if ((sdinfo->satadrv_features_support &
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
4998 SATA_DEV_F_TCQ) &&
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
4999 (SATA_FEATURES(spx->txlt_sata_hba_inst) &
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
5000 SATA_CTLF_QCMD)) {
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
5001 using_queuing = B_TRUE;
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
5002
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
5003 /* Legacy queueing */
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
5004 if (sdinfo->satadrv_features_support &
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
5005 SATA_DEV_F_LBA48) {
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5006 scmd->satacmd_cmd_reg =
1940
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
5007 SATAC_READ_DMA_QUEUED_EXT;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5008 scmd->satacmd_features_reg_ext =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5009 scmd->satacmd_sec_count_msb;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5010 scmd->satacmd_sec_count_msb = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5011 } else {
1940
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
5012 scmd->satacmd_cmd_reg =
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
5013 SATAC_READ_DMA_QUEUED;
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
5014 }
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
5015 } else /* Queuing not supported */
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
5016 using_queuing = B_FALSE;
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
5017
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
5018 /*
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
5019 * If queuing, the sector count goes in the features register
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
5020 * and the secount count will contain the tag.
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
5021 */
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
5022 if (using_queuing) {
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5023 scmd->satacmd_features_reg =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5024 scmd->satacmd_sec_count_lsb;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5025 scmd->satacmd_sec_count_lsb = 0;
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
5026 scmd->satacmd_flags.sata_queued = B_TRUE;
1258
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 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5029
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5030 SATADBG3(SATA_DBG_HBA_IF, spx->txlt_sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5031 "sata_txlt_read cmd 0x%2x, lba %llx, sec count %x\n",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5032 scmd->satacmd_cmd_reg, lba, sec_count);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5033
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5034 if (!(spx->txlt_sata_pkt->satapkt_op_mode & SATA_OPMODE_SYNCH)) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5035 /* Need callback function */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5036 spx->txlt_sata_pkt->satapkt_comp = sata_txlt_rw_completion;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5037 synch = FALSE;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5038 } else
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5039 synch = TRUE;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5040
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5041 /* Transfer command to HBA */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5042 if (sata_hba_start(spx, &rval) != 0) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5043 /* Pkt not accepted for execution */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5044 mutex_exit(&SATA_CPORT_MUTEX(shi, cport));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5045 return (rval);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5046 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5047 mutex_exit(&SATA_CPORT_MUTEX(shi, cport));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5048 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5049 * If execution is non-synchronous,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5050 * a callback function will handle potential errors, translate
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5051 * the response and will do a callback to a target driver.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5052 * If it was synchronous, check execution status using the same
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5053 * framework callback.
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 if (synch) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5056 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5057 "synchronous execution status %x\n",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5058 spx->txlt_sata_pkt->satapkt_reason);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5059 sata_txlt_rw_completion(spx->txlt_sata_pkt);
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 return (TRAN_ACCEPT);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5062 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5063
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5064
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5065 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5066 * SATA translate command: Write (various types)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5067 * Translated into appropriate type of ATA WRITE command
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5068 * (NO ATAPI implementation yet).
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5069 * Both the device capabilities and requested operation mode are
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5070 * considered.
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 * Following scsi cdb fields are ignored:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5073 * rwprotect, dpo, fua, fua_nv, group_number.
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 * Returns TRAN_ACCEPT or code returned by sata_hba_start() and
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5076 * appropriate values in scsi_pkt fields.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5077 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5078 static int
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5079 sata_txlt_write(sata_pkt_txlate_t *spx)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5080 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5081 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5082 sata_cmd_t *scmd = &spx->txlt_sata_pkt->satapkt_cmd;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5083 sata_drive_info_t *sdinfo;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5084 sata_hba_inst_t *shi = SATA_TXLT_HBA_INST(spx);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5085 int cport = SATA_TXLT_CPORT(spx);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5086 uint16_t sec_count;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5087 uint64_t lba;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5088 int rval;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5089 int synch;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5090
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5091 mutex_enter(&(SATA_TXLT_CPORT_MUTEX(spx)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5092
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5093 if ((rval = sata_txlt_generic_pkt_info(spx)) != TRAN_ACCEPT) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5094 mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5095 return (rval);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5096 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5097
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5098 sdinfo = sata_get_device_info(spx->txlt_sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5099 &spx->txlt_sata_pkt->satapkt_device);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5100
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
5101 scmd->satacmd_flags.sata_data_direction = SATA_DIR_WRITE;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5102 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5103 * Build cmd block depending on the device capability and
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5104 * requested operation mode.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5105 * Do not bother with non-dma mode.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5106 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5107 switch ((uint_t)scsipkt->pkt_cdbp[0]) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5108 case SCMD_WRITE:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5109 /* 6-byte scsi read cmd : 0x0A */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5110 lba = (scsipkt->pkt_cdbp[1] & 0x1f);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5111 lba = (lba << 8) | scsipkt->pkt_cdbp[2];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5112 lba = (lba << 8) | scsipkt->pkt_cdbp[3];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5113 sec_count = scsipkt->pkt_cdbp[4];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5114 /* sec_count 0 will be interpreted as 256 by a device */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5115 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5116 case SCMD_WRITE_G1:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5117 /* 10-bytes scsi write command : 0x2A */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5118 lba = scsipkt->pkt_cdbp[2];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5119 lba = (lba << 8) | scsipkt->pkt_cdbp[3];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5120 lba = (lba << 8) | scsipkt->pkt_cdbp[4];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5121 lba = (lba << 8) | scsipkt->pkt_cdbp[5];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5122 sec_count = scsipkt->pkt_cdbp[7];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5123 sec_count = (sec_count << 8) | scsipkt->pkt_cdbp[8];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5124 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5125 case SCMD_WRITE_G5:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5126 /* 12-bytes scsi read command : 0xAA */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5127 lba = scsipkt->pkt_cdbp[2];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5128 lba = (lba << 8) | scsipkt->pkt_cdbp[3];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5129 lba = (lba << 8) | scsipkt->pkt_cdbp[4];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5130 lba = (lba << 8) | scsipkt->pkt_cdbp[5];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5131 sec_count = scsipkt->pkt_cdbp[6];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5132 sec_count = (sec_count << 8) | scsipkt->pkt_cdbp[7];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5133 sec_count = (sec_count << 8) | scsipkt->pkt_cdbp[8];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5134 sec_count = (sec_count << 8) | scsipkt->pkt_cdbp[9];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5135 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5136 case SCMD_WRITE_G4:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5137 /* 16-bytes scsi write command : 0x8A */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5138 lba = scsipkt->pkt_cdbp[2];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5139 lba = (lba << 8) | scsipkt->pkt_cdbp[3];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5140 lba = (lba << 8) | scsipkt->pkt_cdbp[4];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5141 lba = (lba << 8) | scsipkt->pkt_cdbp[5];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5142 lba = (lba << 8) | scsipkt->pkt_cdbp[6];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5143 lba = (lba << 8) | scsipkt->pkt_cdbp[7];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5144 lba = (lba << 8) | scsipkt->pkt_cdbp[8];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5145 lba = (lba << 8) | scsipkt->pkt_cdbp[9];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5146 sec_count = scsipkt->pkt_cdbp[10];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5147 sec_count = (sec_count << 8) | scsipkt->pkt_cdbp[11];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5148 sec_count = (sec_count << 8) | scsipkt->pkt_cdbp[12];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5149 sec_count = (sec_count << 8) | scsipkt->pkt_cdbp[13];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5150 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5151 default:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5152 /* Unsupported command */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5153 mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5154 return (sata_txlt_invalid_command(spx));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5155 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5156
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5157 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5158 * Check if specified address and length exceeds device capacity
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5159 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5160 if ((lba >= sdinfo->satadrv_capacity) ||
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5161 ((lba + sec_count) >= sdinfo->satadrv_capacity)) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5162 /* LBA out of range */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5163 mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5164 return (sata_txlt_lba_out_of_range(spx));
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
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5167 scmd->satacmd_addr_type = ATA_ADDR_LBA;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5168 scmd->satacmd_device_reg = SATA_ADH_LBA;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5169 scmd->satacmd_cmd_reg = SATAC_WRITE_DMA;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5170 if (sdinfo->satadrv_features_support & SATA_DEV_F_LBA48) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5171 scmd->satacmd_addr_type = ATA_ADDR_LBA48;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5172 scmd->satacmd_cmd_reg = SATAC_WRITE_DMA_EXT;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5173 scmd->satacmd_sec_count_msb = sec_count >> 8;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5174 scmd->satacmd_lba_low_msb = (lba >> 24) & 0xff;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5175 #ifndef __lock_lint
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5176 scmd->satacmd_lba_mid_msb = (lba >> 32) & 0xff;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5177 scmd->satacmd_lba_high_msb = lba >> 40;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5178 #endif
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5179 } else if (sdinfo->satadrv_features_support & SATA_DEV_F_LBA28) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5180 scmd->satacmd_addr_type = ATA_ADDR_LBA28;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5181 scmd->satacmd_device_reg = SATA_ADH_LBA | ((lba >> 24) & 0xf);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5182 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5183 scmd->satacmd_sec_count_lsb = sec_count & 0xff;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5184 scmd->satacmd_lba_low_lsb = lba & 0xff;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5185 scmd->satacmd_lba_mid_lsb = (lba >> 8) & 0xff;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5186 scmd->satacmd_lba_high_lsb = (lba >> 16) & 0xff;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5187 scmd->satacmd_features_reg = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5188 scmd->satacmd_status_reg = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5189 scmd->satacmd_error_reg = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5190
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 * Check if queueing commands should be used and switch
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5193 * to appropriate command if possible
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5194 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5195 if (sata_func_enable & SATA_ENABLE_QUEUING) {
1940
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
5196 boolean_t using_queuing;
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
5197
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
5198 /* Queuing supported by controller and device? */
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
5199 if ((sata_func_enable & SATA_ENABLE_NCQ) &&
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
5200 (sdinfo->satadrv_features_support &
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
5201 SATA_DEV_F_NCQ) &&
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
5202 (SATA_FEATURES(spx->txlt_sata_hba_inst) &
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
5203 SATA_CTLF_NCQ)) {
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
5204 using_queuing = B_TRUE;
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
5205
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
5206 /* NCQ supported - use FPDMA WRITE */
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
5207 scmd->satacmd_cmd_reg =
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
5208 SATAC_WRITE_FPDMA_QUEUED;
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
5209 scmd->satacmd_features_reg_ext =
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
5210 scmd->satacmd_sec_count_msb;
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
5211 scmd->satacmd_sec_count_msb = 0;
2553
624f674f2ad8 6430966 SATA NCQ support is needed in SATA framework and hba drivers
ls24207
parents: 2539
diff changeset
5212 scmd->satacmd_rle_sata_cmd = &sata_rle_cmd;
1940
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
5213 } else if ((sdinfo->satadrv_features_support &
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
5214 SATA_DEV_F_TCQ) &&
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
5215 (SATA_FEATURES(spx->txlt_sata_hba_inst) &
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
5216 SATA_CTLF_QCMD)) {
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
5217 using_queuing = B_TRUE;
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
5218
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
5219 /* Legacy queueing */
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
5220 if (sdinfo->satadrv_features_support &
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
5221 SATA_DEV_F_LBA48) {
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5222 scmd->satacmd_cmd_reg =
1940
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
5223 SATAC_WRITE_DMA_QUEUED_EXT;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5224 scmd->satacmd_features_reg_ext =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5225 scmd->satacmd_sec_count_msb;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5226 scmd->satacmd_sec_count_msb = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5227 } else {
1940
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
5228 scmd->satacmd_cmd_reg =
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
5229 SATAC_WRITE_DMA_QUEUED;
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
5230 }
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
5231 } else /* Queuing not supported */
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
5232 using_queuing = B_FALSE;
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
5233
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
5234 if (using_queuing) {
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5235 scmd->satacmd_features_reg =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5236 scmd->satacmd_sec_count_lsb;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5237 scmd->satacmd_sec_count_lsb = 0;
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
5238 scmd->satacmd_flags.sata_queued = B_TRUE;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5239 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5240 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5241
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5242 SATADBG3(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5243 "sata_txlt_write cmd 0x%2x, lba %llx, sec count %x\n",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5244 scmd->satacmd_cmd_reg, lba, sec_count);
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 if (!(spx->txlt_sata_pkt->satapkt_op_mode & SATA_OPMODE_SYNCH)) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5247 /* Need callback function */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5248 spx->txlt_sata_pkt->satapkt_comp = sata_txlt_rw_completion;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5249 synch = FALSE;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5250 } else
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5251 synch = TRUE;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5252
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5253 /* Transfer command to HBA */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5254 if (sata_hba_start(spx, &rval) != 0) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5255 /* Pkt not accepted for execution */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5256 mutex_exit(&SATA_CPORT_MUTEX(shi, cport));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5257 return (rval);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5258 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5259 mutex_exit(&SATA_CPORT_MUTEX(shi, cport));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5260
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5261 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5262 * If execution is non-synchronous,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5263 * a callback function will handle potential errors, translate
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5264 * the response and will do a callback to a target driver.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5265 * If it was synchronous, check execution status using the same
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5266 * framework callback.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5267 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5268 if (synch) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5269 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5270 "synchronous execution status %x\n",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5271 spx->txlt_sata_pkt->satapkt_reason);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5272 sata_txlt_rw_completion(spx->txlt_sata_pkt);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5273 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5274 return (TRAN_ACCEPT);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5275 }
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 * NOTE: NOT FUNCTIONAL IMPLEMENTATION. THIS IS A PLACEHOLDER for the function
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5280 * that will be fixed in phase 2 of the development.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5281 * Currently ATAPI is not supported. ATAPI devices are threated as not-valid
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5282 * devices.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5283 * 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
5284 * to calling it.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5285 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5286 static int
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5287 sata_txlt_atapi(sata_pkt_txlate_t *spx)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5288 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5289 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5290 sata_cmd_t *scmd = &spx->txlt_sata_pkt->satapkt_cmd;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5291 struct buf *bp = spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5292 sata_hba_inst_t *shi = SATA_TXLT_HBA_INST(spx);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5293 int cport = SATA_TXLT_CPORT(spx);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5294 int rval;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5295 int synch;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5296 union scsi_cdb *cdbp = (union scsi_cdb *)scsipkt->pkt_cdbp;
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 mutex_enter(&(SATA_TXLT_CPORT_MUTEX(spx)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5299
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5300 if ((rval = sata_txlt_generic_pkt_info(spx)) != TRAN_ACCEPT) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5301 mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5302 return (rval);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5303 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5304
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5305 /*
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
5306 * scmd->satacmd_flags.sata_data_direction default -
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
5307 * SATA_DIR_NODATA_XFER - is set by
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5308 * sata_txlt_generic_pkt_info().
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5309 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5310 if (scmd->satacmd_bp) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5311 if (scmd->satacmd_bp->b_flags & B_READ) {
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
5312 scmd->satacmd_flags.sata_data_direction = SATA_DIR_READ;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5313 } else {
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
5314 scmd->satacmd_flags.sata_data_direction =
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
5315 SATA_DIR_WRITE;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5316 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5317 }
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 scmd->satacmd_acdb_len = scsi_cdb_size[GETGROUP(cdbp)];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5320 scmd->satacmd_cmd_reg = SATAC_PACKET;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5321 bcopy(cdbp, scmd->satacmd_acdb, 16);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5322
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 * For non-read/write commands we need to
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5325 * map buffer
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5326 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5327 switch ((uint_t)scsipkt->pkt_cdbp[0]) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5328 case SCMD_READ:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5329 case SCMD_READ_G1:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5330 case SCMD_READ_G5:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5331 case SCMD_READ_G4:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5332 case SCMD_WRITE:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5333 case SCMD_WRITE_G1:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5334 case SCMD_WRITE_G5:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5335 case SCMD_WRITE_G4:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5336 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5337 default:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5338 if (bp->b_flags & (B_PHYS | B_PAGEIO))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5339 bp_mapin(bp);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5340 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5341 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5342
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5343 if (!(spx->txlt_sata_pkt->satapkt_op_mode & SATA_OPMODE_SYNCH)) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5344 /* Need callback function */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5345 spx->txlt_sata_pkt->satapkt_comp = sata_txlt_atapi_completion;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5346 synch = FALSE;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5347 } else
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5348 synch = TRUE;
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 /* Transfer command to HBA */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5351 if (sata_hba_start(spx, &rval) != 0) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5352 /* Pkt not accepted for execution */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5353 mutex_exit(&SATA_CPORT_MUTEX(shi, cport));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5354 return (rval);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5355 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5356 mutex_exit(&SATA_CPORT_MUTEX(shi, cport));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5357 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5358 * If execution is non-synchronous,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5359 * a callback function will handle potential errors, translate
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5360 * the response and will do a callback to a target driver.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5361 * If it was synchronous, check execution status using the same
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5362 * framework callback.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5363 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5364 if (synch) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5365 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5366 "synchronous execution status %x\n",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5367 spx->txlt_sata_pkt->satapkt_reason);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5368 sata_txlt_atapi_completion(spx->txlt_sata_pkt);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5369 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5370 return (TRAN_ACCEPT);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5371 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5372
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5373 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5374 * Translate command: Synchronize Cache.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5375 * Translates into Flush Cache command.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5376 * (NO ATAPI implementation yet).
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5377 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5378 * 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
5379 * devices)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5380 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5381 * Returns TRAN_ACCEPT or code returned by sata_hba_start() and
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5382 * appropriate values in scsi_pkt fields.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5383 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5384 static int
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5385 sata_txlt_synchronize_cache(sata_pkt_txlate_t *spx)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5386 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5387 sata_cmd_t *scmd = &spx->txlt_sata_pkt->satapkt_cmd;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5388 sata_hba_inst_t *shi = SATA_TXLT_HBA_INST(spx);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5389 int cport = SATA_TXLT_CPORT(spx);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5390 int rval;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5391 int synch;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5392
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5393 mutex_enter(&(SATA_TXLT_CPORT_MUTEX(spx)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5394
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5395 if ((rval = sata_txlt_generic_pkt_info(spx)) != TRAN_ACCEPT) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5396 mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5397 return (rval);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5398 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5399
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5400 scmd->satacmd_addr_type = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5401 scmd->satacmd_cmd_reg = SATAC_FLUSH_CACHE;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5402 scmd->satacmd_device_reg = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5403 scmd->satacmd_sec_count_lsb = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5404 scmd->satacmd_lba_low_lsb = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5405 scmd->satacmd_lba_mid_lsb = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5406 scmd->satacmd_lba_high_lsb = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5407 scmd->satacmd_features_reg = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5408 scmd->satacmd_status_reg = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5409 scmd->satacmd_error_reg = 0;
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 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5412 "sata_txlt_synchronize_cache\n", NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5413
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5414 if (!(spx->txlt_sata_pkt->satapkt_op_mode & SATA_OPMODE_SYNCH)) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5415 /* Need to set-up a callback function */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5416 spx->txlt_sata_pkt->satapkt_comp =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5417 sata_txlt_nodata_cmd_completion;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5418 synch = FALSE;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5419 } else
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5420 synch = TRUE;
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 /* Transfer command to HBA */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5423 if (sata_hba_start(spx, &rval) != 0) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5424 /* Pkt not accepted for execution */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5425 mutex_exit(&SATA_CPORT_MUTEX(shi, cport));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5426 return (rval);
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 mutex_exit(&SATA_CPORT_MUTEX(shi, cport));
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 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5431 * If execution non-synchronous, it had to be completed
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5432 * a callback function will handle potential errors, translate
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5433 * the response and will do a callback to a target driver.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5434 * If it was synchronous, check status, using the same
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5435 * framework callback.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5436 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5437 if (synch) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5438 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5439 "synchronous execution status %x\n",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5440 spx->txlt_sata_pkt->satapkt_reason);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5441 sata_txlt_nodata_cmd_completion(spx->txlt_sata_pkt);
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 return (TRAN_ACCEPT);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5444 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5445
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5446 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5447 * Send pkt to SATA HBA driver
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5448 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5449 * 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
5450 * i.e. scsi_pkt is not NULL.
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 * 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
5453 * the mutex when it calls HBA driver sata_tran_start function and
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5454 * re-acquires it afterwards.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5455 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5456 * If return value is 0, pkt was accepted, -1 otherwise
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5457 * rval is set to appropriate sata_scsi_start return value.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5458 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5459 * 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
5460 * have called the sata_pkt callback function for this packet.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5461 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5462 * 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
5463 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5464 * Note 2: No port multiplier support for now.
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 static int
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5467 sata_hba_start(sata_pkt_txlate_t *spx, int *rval)
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 int stat;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5470 sata_hba_inst_t *sata_hba_inst = spx->txlt_sata_hba_inst;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5471 sata_drive_info_t *sdinfo;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5472 sata_device_t sata_device;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5473 uint8_t cmd;
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
5474 struct sata_cmd_flags cmd_flags;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5475
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5476 ASSERT(spx->txlt_sata_pkt != NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5477 ASSERT(mutex_owned(&SATA_CPORT_MUTEX(spx->txlt_sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5478 spx->txlt_sata_pkt->satapkt_device.satadev_addr.cport)));
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 sdinfo = sata_get_device_info(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5481 &spx->txlt_sata_pkt->satapkt_device);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5482 ASSERT(sdinfo != NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5483
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5484 /* Clear device reset state? */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5485 if (sdinfo->satadrv_event_flags & SATA_EVNT_CLEAR_DEVICE_RESET) {
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
5486 spx->txlt_sata_pkt->satapkt_cmd.satacmd_flags.
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
5487 sata_clear_dev_reset = B_TRUE;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5488 sdinfo->satadrv_event_flags &= ~SATA_EVNT_CLEAR_DEVICE_RESET;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5489 SATADBG1(SATA_DBG_EVENTS, sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5490 "sata_hba_start: clearing device reset state\n", NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5491 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5492 cmd = spx->txlt_sata_pkt->satapkt_cmd.satacmd_cmd_reg;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5493 cmd_flags = spx->txlt_sata_pkt->satapkt_cmd.satacmd_flags;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5494 sata_device = spx->txlt_sata_pkt->satapkt_device; /* local copy */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5495
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5496 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5497 sdinfo->satadrv_addr.cport)));
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 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5500 "Sata cmd 0x%2x\n", cmd);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5501
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5502 stat = (*SATA_START_FUNC(sata_hba_inst))(SATA_DIP(sata_hba_inst),
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5503 spx->txlt_sata_pkt);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5504
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5505 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5506 sdinfo->satadrv_addr.cport)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5507 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5508 * If sata pkt was accepted and executed in asynchronous mode, i.e.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5509 * with the sata callback, the sata_pkt could be already destroyed
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5510 * by the time we check ther return status from the hba_start()
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5511 * function, because sata_scsi_destroy_pkt() could have been already
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5512 * called (perhaps in the interrupt context). So, in such case, there
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5513 * should be no references to it. In other cases, sata_pkt still
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5514 * exists.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5515 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5516 switch (stat) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5517 case SATA_TRAN_ACCEPTED:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5518 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5519 * pkt accepted for execution.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5520 * If it was executed synchronously, it is already completed
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5521 * and pkt completion_reason indicates completion status.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5522 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5523 *rval = TRAN_ACCEPT;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5524 return (0);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5525
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5526 case SATA_TRAN_QUEUE_FULL:
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 * Controller detected queue full condition.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5529 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5530 SATADBG1(SATA_DBG_HBA_IF, sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5531 "sata_hba_start: queue full\n", NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5532
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5533 spx->txlt_scsi_pkt->pkt_reason = CMD_INCOMPLETE;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5534 *spx->txlt_scsi_pkt->pkt_scbp = STATUS_QFULL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5535
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5536 *rval = TRAN_BUSY;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5537 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5538
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5539 case SATA_TRAN_PORT_ERROR:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5540 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5541 * Communication/link with device or general port error
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5542 * detected before pkt execution begun.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5543 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5544 if (spx->txlt_sata_pkt->satapkt_device.satadev_addr.qual ==
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5545 SATA_ADDR_CPORT)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5546 sata_log(sata_hba_inst, CE_CONT,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5547 "port %d error",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5548 sata_device.satadev_addr.cport);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5549 else
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5550 sata_log(sata_hba_inst, CE_CONT,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5551 "port %d pmport %d error\n",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5552 sata_device.satadev_addr.cport,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5553 sata_device.satadev_addr.pmport);
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 * Update the port/device structure.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5557 * sata_pkt should be still valid. Since port error is
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5558 * returned, sata_device content should reflect port
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5559 * state - it means, that sata address have been changed,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5560 * because original packet's sata address refered to a device
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5561 * attached to some port.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5562 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5563 sata_update_port_info(sata_hba_inst, &sata_device);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5564 spx->txlt_scsi_pkt->pkt_reason = CMD_TRAN_ERR;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5565 *rval = TRAN_FATAL_ERROR;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5566 break;
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 case SATA_TRAN_CMD_UNSUPPORTED:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5569 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5570 * Command rejected by HBA as unsupported. It was HBA driver
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5571 * that rejected the command, command was not sent to
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5572 * an attached device.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5573 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5574 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5575 sdinfo->satadrv_addr.cport)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5576 (void) sata_txlt_invalid_command(spx);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5577 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5578 sdinfo->satadrv_addr.cport)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5579
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5580 if (sdinfo->satadrv_state & SATA_DSTATE_RESET)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5581 SATADBG1(SATA_DBG_EVENTS, sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5582 "sat_hba_start: cmd 0x%2x rejected "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5583 "with SATA_TRAN_CMD_UNSUPPORTED status\n", cmd);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5584
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5585 *rval = TRAN_ACCEPT;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5586 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5587
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5588 case SATA_TRAN_BUSY:
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 * Command rejected by HBA because other operation prevents
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5591 * accepting the packet, or device is in RESET condition.
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 if (sdinfo != NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5594 sdinfo->satadrv_state =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5595 spx->txlt_sata_pkt->satapkt_device.satadev_state;
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 if (sdinfo->satadrv_state & SATA_DSTATE_RESET) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5598 SATADBG1(SATA_DBG_EVENTS, sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5599 "sata_hba_start: cmd 0x%2x rejected "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5600 "because of device reset condition\n",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5601 cmd);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5602 } else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5603 SATADBG1(SATA_DBG_EVENTS, sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5604 "sata_hba_start: cmd 0x%2x rejected "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5605 "with SATA_TRAN_BUSY status\n",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5606 cmd);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5607 }
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 spx->txlt_scsi_pkt->pkt_reason = CMD_INCOMPLETE;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5610 *rval = TRAN_BUSY;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5611 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5612
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5613 default:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5614 /* Unrecognized HBA response */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5615 SATA_LOG_D((sata_hba_inst, CE_WARN,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5616 "sata_hba_start: unrecognized HBA response "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5617 "to cmd : 0x%2x resp 0x%x", cmd, rval));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5618 spx->txlt_scsi_pkt->pkt_reason = CMD_TRAN_ERR;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5619 *rval = TRAN_FATAL_ERROR;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5620 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5621 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5622
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5623 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5624 * If we got here, the packet was rejected.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5625 * Check if we need to remember reset state clearing request
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5626 */
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
5627 if (cmd_flags.sata_clear_dev_reset) {
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5628 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5629 * Check if device is still configured - it may have
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5630 * disapeared from the configuration
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 sdinfo = sata_get_device_info(sata_hba_inst, &sata_device);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5633 if (sdinfo != NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5634 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5635 * Restore the flag that requests clearing of
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5636 * the device reset state,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5637 * so the next sata packet may carry it to HBA.
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 sdinfo->satadrv_event_flags |=
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5640 SATA_EVNT_CLEAR_DEVICE_RESET;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5641 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5642 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5643 return (-1);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5644 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5645
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 * Scsi response setup for invalid LBA
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 * Returns TRAN_ACCEPT and appropriate values in scsi_pkt fields.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5650 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5651 static int
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5652 sata_txlt_lba_out_of_range(sata_pkt_txlate_t *spx)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5653 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5654 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5655 struct scsi_extended_sense *sense;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5656
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5657 scsipkt->pkt_reason = CMD_CMPLT;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5658 scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5659 STATE_SENT_CMD | STATE_GOT_STATUS;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5660 *scsipkt->pkt_scbp = STATUS_CHECK;
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 *scsipkt->pkt_scbp = STATUS_CHECK;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5663 sense = sata_arq_sense(spx);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5664 sense->es_key = KEY_ILLEGAL_REQUEST;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5665 sense->es_add_code = SD_SCSI_LBA_OUT_OF_RANGE;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5666
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5667 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5668 "Scsi_pkt completion reason %x\n", scsipkt->pkt_reason);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5669
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5670 if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0 &&
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5671 scsipkt->pkt_comp != NULL)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5672 /* scsi callback required */
1781
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
5673 if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
5674 (task_func_t *)scsipkt->pkt_comp, (void *) scsipkt,
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
5675 TQ_SLEEP) == 0)
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
5676 /* Scheduling the callback failed */
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
5677 return (TRAN_BUSY);
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5678 return (TRAN_ACCEPT);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5679 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5680
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5681
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5682 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5683 * Analyze device status and error registers and translate them into
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5684 * appropriate scsi sense codes.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5685 * NOTE: non-packet commands only for now
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5686 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5687 static void
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5688 sata_decode_device_error(sata_pkt_txlate_t *spx,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5689 struct scsi_extended_sense *sense)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5690 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5691 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
5692
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5693 ASSERT(sense != NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5694 ASSERT(spx->txlt_sata_pkt->satapkt_cmd.satacmd_status_reg &
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5695 SATA_STATUS_ERR);
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
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5698 if (err_reg & SATA_ERROR_ICRC) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5699 sense->es_key = KEY_ABORTED_COMMAND;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5700 sense->es_add_code = 0x08; /* Communication failure */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5701 return;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5702 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5703
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5704 if (err_reg & SATA_ERROR_UNC) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5705 sense->es_key = KEY_MEDIUM_ERROR;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5706 /* Information bytes (LBA) need to be set by a caller */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5707 return;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5708 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5709
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5710 /* ADD HERE: MC error bit handling for ATAPI CD/DVD */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5711 if (err_reg & (SATA_ERROR_MCR | SATA_ERROR_NM)) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5712 sense->es_key = KEY_UNIT_ATTENTION;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5713 sense->es_add_code = 0x3a; /* No media present */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5714 return;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5715 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5716
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5717 if (err_reg & SATA_ERROR_IDNF) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5718 if (err_reg & SATA_ERROR_ABORT) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5719 sense->es_key = KEY_ABORTED_COMMAND;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5720 } else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5721 sense->es_key = KEY_ILLEGAL_REQUEST;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5722 sense->es_add_code = 0x21; /* LBA out of range */
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 return;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5725 }
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 if (err_reg & SATA_ERROR_ABORT) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5728 ASSERT(spx->txlt_sata_pkt != NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5729 sense->es_key = KEY_ABORTED_COMMAND;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5730 return;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5731 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5732 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5733
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5734 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5735 * Extract error LBA from sata_pkt.satapkt_cmd register fields
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5736 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5737 static void
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5738 sata_extract_error_lba(sata_pkt_txlate_t *spx, uint64_t *lba)
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 sata_cmd_t *sata_cmd = &spx->txlt_sata_pkt->satapkt_cmd;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5741
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5742 *lba = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5743 if (sata_cmd->satacmd_addr_type == ATA_ADDR_LBA48) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5744 *lba = sata_cmd->satacmd_lba_high_msb;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5745 *lba = (*lba << 8) | sata_cmd->satacmd_lba_mid_msb;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5746 *lba = (*lba << 8) | sata_cmd->satacmd_lba_low_msb;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5747 } else if (sata_cmd->satacmd_addr_type == ATA_ADDR_LBA28) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5748 *lba = sata_cmd->satacmd_device_reg & 0xf;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5749 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5750 *lba = (*lba << 8) | sata_cmd->satacmd_lba_high_lsb;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5751 *lba = (*lba << 8) | sata_cmd->satacmd_lba_mid_lsb;
2553
624f674f2ad8 6430966 SATA NCQ support is needed in SATA framework and hba drivers
ls24207
parents: 2539
diff changeset
5752 *lba = (*lba << 8) | sata_cmd->satacmd_lba_low_lsb;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5753 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5754
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5755 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5756 * This is fixed sense format - if LBA exceeds the info field size,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5757 * no valid info will be returned (valid bit in extended sense will
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5758 * be set to 0).
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 static struct scsi_extended_sense *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5761 sata_arq_sense(sata_pkt_txlate_t *spx)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5762 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5763 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5764 struct scsi_arq_status *arqs;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5765 struct scsi_extended_sense *sense;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5766
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5767 /* Fill ARQ sense data */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5768 scsipkt->pkt_state |= STATE_ARQ_DONE;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5769 arqs = (struct scsi_arq_status *)scsipkt->pkt_scbp;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5770 *(uchar_t *)&arqs->sts_status = STATUS_CHECK;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5771 *(uchar_t *)&arqs->sts_rqpkt_status = STATUS_GOOD;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5772 arqs->sts_rqpkt_reason = CMD_CMPLT;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5773 arqs->sts_rqpkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5774 STATE_XFERRED_DATA | STATE_SENT_CMD | STATE_GOT_STATUS;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5775 arqs->sts_rqpkt_resid = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5776 sense = &arqs->sts_sensedata;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5777 bzero(sense, sizeof (struct scsi_extended_sense));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5778 sense->es_valid = 1; /* Valid sense */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5779 sense->es_class = 7; /* Response code 0x70 - current err */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5780 sense->es_key = KEY_NO_SENSE;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5781 sense->es_info_1 = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5782 sense->es_info_2 = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5783 sense->es_info_3 = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5784 sense->es_info_4 = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5785 sense->es_add_len = 6; /* Additional length */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5786 sense->es_cmd_info[0] = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5787 sense->es_cmd_info[1] = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5788 sense->es_cmd_info[2] = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5789 sense->es_cmd_info[3] = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5790 sense->es_add_code = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5791 sense->es_qual_code = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5792 return (sense);
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
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5795
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5796 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5797 * Translate completion status of SATA read/write commands into scsi response.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5798 * pkt completion_reason is checked to determine the completion status.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5799 * Do scsi callback if necessary.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5800 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5801 * Note: this function may be called also for synchronously executed
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5802 * commands.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5803 * This function may be used only if scsi_pkt is non-NULL.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5804 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5805 static void
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5806 sata_txlt_rw_completion(sata_pkt_t *sata_pkt)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5807 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5808 sata_pkt_txlate_t *spx =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5809 (sata_pkt_txlate_t *)sata_pkt->satapkt_framework_private;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5810 sata_cmd_t *scmd = &sata_pkt->satapkt_cmd;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5811 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5812 struct scsi_extended_sense *sense;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5813 uint64_t lba;
2539
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
5814 struct buf *bp;
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
5815 int rval;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5816 if (sata_pkt->satapkt_reason == SATA_PKT_COMPLETED) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5817 /* Normal completion */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5818 scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5819 STATE_SENT_CMD | STATE_XFERRED_DATA | STATE_GOT_STATUS;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5820 scsipkt->pkt_reason = CMD_CMPLT;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5821 *scsipkt->pkt_scbp = STATUS_GOOD;
2539
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
5822 if (spx->txlt_tmp_buf != NULL) {
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
5823 /* Temporary buffer was used */
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
5824 bp = spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp;
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
5825 if (bp->b_flags & B_READ) {
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
5826 rval = ddi_dma_sync(
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
5827 spx->txlt_buf_dma_handle, 0, 0,
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
5828 DDI_DMA_SYNC_FORCPU);
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
5829 ASSERT(rval == DDI_SUCCESS);
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
5830 bcopy(spx->txlt_tmp_buf, bp->b_un.b_addr,
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
5831 bp->b_bcount);
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
5832 }
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
5833 }
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5834 } else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5835 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5836 * Something went wrong - analyze return
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5837 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5838 scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5839 STATE_SENT_CMD | STATE_GOT_STATUS;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5840 scsipkt->pkt_reason = CMD_INCOMPLETE;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5841 *scsipkt->pkt_scbp = STATUS_CHECK;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5842 sense = sata_arq_sense(spx);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5843 ASSERT(sense != NULL);
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 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5846 * SATA_PKT_DEV_ERROR is the only case where we may be able to
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
5847 * extract from device registers the failing LBA.
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5848 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5849 if (sata_pkt->satapkt_reason == SATA_PKT_DEV_ERROR) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5850 if ((scmd->satacmd_addr_type == ATA_ADDR_LBA48) &&
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5851 (scmd->satacmd_lba_mid_msb != 0 ||
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5852 scmd->satacmd_lba_high_msb != 0)) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5853 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5854 * We have problem reporting this cmd LBA
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5855 * in fixed sense data format, because of
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5856 * the size of the scsi LBA fields.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5857 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5858 sense->es_valid = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5859 } else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5860 sata_extract_error_lba(spx, &lba);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5861 sense->es_info_1 = (lba & 0xFF000000) >> 24;
2553
624f674f2ad8 6430966 SATA NCQ support is needed in SATA framework and hba drivers
ls24207
parents: 2539
diff changeset
5862 sense->es_info_2 = (lba & 0xFF0000) >> 16;
624f674f2ad8 6430966 SATA NCQ support is needed in SATA framework and hba drivers
ls24207
parents: 2539
diff changeset
5863 sense->es_info_3 = (lba & 0xFF00) >> 8;
624f674f2ad8 6430966 SATA NCQ support is needed in SATA framework and hba drivers
ls24207
parents: 2539
diff changeset
5864 sense->es_info_4 = lba & 0xFF;
1258
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 } else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5867 /* Invalid extended sense info */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5868 sense->es_valid = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5869 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5870
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5871 switch (sata_pkt->satapkt_reason) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5872 case SATA_PKT_PORT_ERROR:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5873 /* We may want to handle DEV GONE state as well */
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 * We have no device data. Assume no data transfered.
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 sense->es_key = KEY_HARDWARE_ERROR;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5878 break;
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 case SATA_PKT_DEV_ERROR:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5881 if (sata_pkt->satapkt_cmd.satacmd_status_reg &
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5882 SATA_STATUS_ERR) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5883 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5884 * determine dev error reason from error
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5885 * reg content
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 sata_decode_device_error(spx, sense);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5888 if (sense->es_key == KEY_MEDIUM_ERROR) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5889 switch (scmd->satacmd_cmd_reg) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5890 case SATAC_READ_DMA:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5891 case SATAC_READ_DMA_EXT:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5892 case SATAC_READ_DMA_QUEUED:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5893 case SATAC_READ_DMA_QUEUED_EXT:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5894 case SATAC_READ_FPDMA_QUEUED:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5895 /* Unrecovered read error */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5896 sense->es_add_code =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5897 SD_SCSI_UNREC_READ_ERROR;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5898 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5899 case SATAC_WRITE_DMA:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5900 case SATAC_WRITE_DMA_EXT:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5901 case SATAC_WRITE_DMA_QUEUED:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5902 case SATAC_WRITE_DMA_QUEUED_EXT:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5903 case SATAC_WRITE_FPDMA_QUEUED:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5904 /* Write error */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5905 sense->es_add_code =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5906 SD_SCSI_WRITE_ERROR;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5907 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5908 default:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5909 /* Internal error */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5910 SATA_LOG_D((
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5911 spx->txlt_sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5912 CE_WARN,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5913 "sata_txlt_rw_completion :"
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5914 "internal error - invalid "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5915 "command 0x%2x",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5916 scmd->satacmd_cmd_reg));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5917 break;
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 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5920 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5921 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5922 /* No extended sense key - no info available */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5923 scsipkt->pkt_reason = CMD_INCOMPLETE;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5924 break;
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 case SATA_PKT_TIMEOUT:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5927 /* scsipkt->pkt_reason = CMD_TIMEOUT; */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5928 scsipkt->pkt_reason = CMD_INCOMPLETE;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5929 /* No extended sense key ? */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5930 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5931
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5932 case SATA_PKT_ABORTED:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5933 scsipkt->pkt_reason = CMD_ABORTED;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5934 /* No extended sense key ? */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5935 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5936
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5937 case SATA_PKT_RESET:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5938 scsipkt->pkt_reason = CMD_RESET;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5939 break;
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 default:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5942 SATA_LOG_D((spx->txlt_sata_hba_inst, CE_WARN,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5943 "sata_txlt_rw_completion: "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5944 "invalid packet completion reason"));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5945 scsipkt->pkt_reason = CMD_TRAN_ERR;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5946 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5947 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5948 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5949 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5950 "Scsi_pkt completion reason %x\n", scsipkt->pkt_reason);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5951
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5952 if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0 &&
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5953 scsipkt->pkt_comp != NULL)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5954 /* scsi callback required */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5955 (*scsipkt->pkt_comp)(scsipkt);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5956
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5957 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5958
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5959 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5960 * NON FUNCTIONAL IMPLEMENTATION. THIS IS A PLACE HOLDER.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5961 * ATAPI devices are not supported currently (are not be attached recognized
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5962 * as valid devices).
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5963 * Will be fixed in phase 2 of the development.
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 static void
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5966 sata_txlt_atapi_completion(sata_pkt_t *sata_pkt)
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 sata_pkt_txlate_t *spx =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5969 (sata_pkt_txlate_t *)sata_pkt->satapkt_framework_private;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5970 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5971 struct scsi_arq_status *arqs;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5972
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5973 if (sata_pkt->satapkt_reason == SATA_PKT_COMPLETED) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5974 /* Normal completion */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5975 scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5976 STATE_SENT_CMD | STATE_XFERRED_DATA | STATE_GOT_STATUS;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5977 scsipkt->pkt_reason = CMD_CMPLT;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5978 *scsipkt->pkt_scbp = STATUS_GOOD;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5979 scsipkt->pkt_resid = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5980 } else {
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 * Something went wrong - analyze return
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5983 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5984 scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5985 STATE_SENT_CMD | STATE_GOT_STATUS | STATE_ARQ_DONE;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5986 scsipkt->pkt_reason = CMD_CMPLT;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5987
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5988 arqs = (struct scsi_arq_status *)scsipkt->pkt_scbp;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5989 *(uchar_t *)&arqs->sts_status = STATUS_CHECK;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5990 *(uchar_t *)&arqs->sts_rqpkt_status = STATUS_GOOD;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5991 arqs->sts_rqpkt_reason = CMD_CMPLT;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5992 arqs->sts_rqpkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5993 STATE_XFERRED_DATA | STATE_SENT_CMD | STATE_GOT_STATUS;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5994 arqs->sts_rqpkt_resid = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5995
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5996 bcopy(sata_pkt->satapkt_cmd.satacmd_rqsense,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5997 &arqs->sts_sensedata, SATA_ATAPI_RQSENSE_LEN);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5998 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
5999 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6000 "Scsi_pkt completion reason %x\n", scsipkt->pkt_reason);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6001
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6002 if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0 &&
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6003 scsipkt->pkt_comp != NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6004 /* scsi callback required */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6005 (*scsipkt->pkt_comp)(scsipkt);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6006 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6007 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6008
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6009
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6010 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6011 * Translate completion status of non-data commands (i.e. commands returning
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6012 * no data).
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6013 * pkt completion_reason is checked to determine the completion status.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6014 * Do scsi callback if necessary (FLAG_NOINTR == 0)
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 * Note: this function may be called also for synchronously executed
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6017 * commands.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6018 * This function may be used only if scsi_pkt is non-NULL.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6019 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6020
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6021 static void
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6022 sata_txlt_nodata_cmd_completion(sata_pkt_t *sata_pkt)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6023 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6024 sata_pkt_txlate_t *spx =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6025 (sata_pkt_txlate_t *)sata_pkt->satapkt_framework_private;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6026 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6027 struct scsi_extended_sense *sense;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6028
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6029 scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6030 STATE_SENT_CMD | STATE_GOT_STATUS;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6031 if (sata_pkt->satapkt_reason == SATA_PKT_COMPLETED) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6032 /* Normal completion */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6033 scsipkt->pkt_reason = CMD_CMPLT;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6034 *scsipkt->pkt_scbp = STATUS_GOOD;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6035 } else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6036 /* Something went wrong */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6037 scsipkt->pkt_reason = CMD_INCOMPLETE;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6038 *scsipkt->pkt_scbp = STATUS_CHECK;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6039 sense = sata_arq_sense(spx);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6040 switch (sata_pkt->satapkt_reason) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6041 case SATA_PKT_PORT_ERROR:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6042 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6043 * We have no device data. Assume no data transfered.
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 sense->es_key = KEY_HARDWARE_ERROR;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6046 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6047
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6048 case SATA_PKT_DEV_ERROR:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6049 if (sata_pkt->satapkt_cmd.satacmd_status_reg &
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6050 SATA_STATUS_ERR) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6051 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6052 * determine dev error reason from error
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6053 * reg content
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6054 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6055 sata_decode_device_error(spx, sense);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6056 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6057 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6058 /* No extended sense key - no info available */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6059 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6060
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6061 case SATA_PKT_TIMEOUT:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6062 /* scsipkt->pkt_reason = CMD_TIMEOUT; */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6063 scsipkt->pkt_reason = CMD_INCOMPLETE;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6064 /* No extended sense key ? */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6065 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6066
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6067 case SATA_PKT_ABORTED:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6068 scsipkt->pkt_reason = CMD_ABORTED;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6069 /* No extended sense key ? */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6070 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6071
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6072 case SATA_PKT_RESET:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6073 /* pkt aborted by an explicit reset from a host */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6074 scsipkt->pkt_reason = CMD_RESET;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6075 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6076
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6077 default:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6078 SATA_LOG_D((spx->txlt_sata_hba_inst, CE_WARN,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6079 "sata_txlt_nodata_cmd_completion: "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6080 "invalid packet completion reason %d",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6081 sata_pkt->satapkt_reason));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6082 scsipkt->pkt_reason = CMD_TRAN_ERR;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6083 break;
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
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6086 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6087 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6088 "Scsi_pkt completion reason %x\n", scsipkt->pkt_reason);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6089
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6090 if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0 &&
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6091 scsipkt->pkt_comp != NULL)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6092 /* scsi callback required */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6093 (*scsipkt->pkt_comp)(scsipkt);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6094 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6095
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6096
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6097 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6098 * Build Mode sense R/W recovery page
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6099 * NOT IMPLEMENTED
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6100 */
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 static int
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6103 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
6104 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6105 #ifndef __lock_lint
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6106 _NOTE(ARGUNUSED(sdinfo))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6107 _NOTE(ARGUNUSED(pcntrl))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6108 _NOTE(ARGUNUSED(buf))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6109 #endif
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6110 return (0);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6111 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6112
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6113 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6114 * Build Mode sense caching page - scsi-3 implementation.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6115 * Page length distinguishes previous format from scsi-3 format.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6116 * buf must have space for 0x12 bytes.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6117 * Only DRA (disable read ahead ) and WCE (write cache enable) are changeable.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6118 *
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 static int
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6121 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
6122 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6123 struct mode_cache_scsi3 *page = (struct mode_cache_scsi3 *)buf;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6124 sata_id_t *sata_id = &sdinfo->satadrv_id;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6125
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6126 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6127 * 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
6128 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6129 bzero(buf, PAGELENGTH_DAD_MODE_CACHE_SCSI3);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6130
1675
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
6131 /* Saved paramters not supported */
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
6132 if (pcntrl == 3)
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
6133 return (0);
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6134 if (pcntrl == 0 || pcntrl == 2) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6135 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6136 * For now treat current and default parameters as same
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6137 * That may have to change, if target driver will complain
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 page->mode_page.code = MODEPAGE_CACHING; /* PS = 0 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6140 page->mode_page.length = PAGELENGTH_DAD_MODE_CACHE_SCSI3;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6141
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6142 if ((sata_id->ai_cmdset82 & SATA_LOOK_AHEAD) &&
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6143 !(sata_id->ai_features85 & SATA_LOOK_AHEAD)) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6144 page->dra = 1; /* Read Ahead disabled */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6145 page->rcd = 1; /* Read Cache disabled */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6146 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6147 if ((sata_id->ai_cmdset82 & SATA_WRITE_CACHE) &&
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6148 (sata_id->ai_features85 & SATA_WRITE_CACHE))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6149 page->wce = 1; /* Write Cache enabled */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6150 } else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6151 /* Changeable parameters */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6152 page->mode_page.code = MODEPAGE_CACHING;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6153 page->mode_page.length = PAGELENGTH_DAD_MODE_CACHE_SCSI3;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6154 if (sata_id->ai_cmdset82 & SATA_LOOK_AHEAD) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6155 page->dra = 1;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6156 page->rcd = 1;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6157 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6158 if (sata_id->ai_cmdset82 & SATA_WRITE_CACHE)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6159 page->wce = 1;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6160 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6161 return (PAGELENGTH_DAD_MODE_CACHE_SCSI3 +
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6162 sizeof (struct mode_page));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6163 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6164
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6165 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6166 * Build Mode sense exception cntrl page
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6167 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6168 static int
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6169 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
6170 {
1675
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
6171 struct mode_info_excpt_page *page = (struct mode_info_excpt_page *)buf;
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
6172 sata_id_t *sata_id = &sdinfo->satadrv_id;
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
6173
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
6174 /*
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
6175 * Most of the fields are set to 0, being not supported and/or disabled
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
6176 */
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
6177 bzero(buf, PAGELENGTH_INFO_EXCPT);
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
6178
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
6179 page->mode_page.code = MODEPAGE_INFO_EXCPT;
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
6180 page->mode_page.length = PAGELENGTH_INFO_EXCPT;
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
6181
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
6182 /* Indicate that this is page is saveable */
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
6183 page->mode_page.ps = 1;
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
6184
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
6185 /*
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
6186 * We will return the same data for default, current and saved page.
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
6187 * The only changeable bit is dexcpt and that bit is required
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
6188 * by the ATA specification to be preserved across power cycles.
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
6189 */
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
6190 if (pcntrl != 1) {
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
6191 page->dexcpt = !(sata_id->ai_features85 & SATA_SMART_SUPPORTED);
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
6192 page->mrie = MRIE_ONLY_ON_REQUEST;
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
6193 }
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
6194 else
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
6195 page->dexcpt = 1; /* Only changeable parameter */
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
6196
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
6197 return (PAGELENGTH_INFO_EXCPT + sizeof (struct mode_info_excpt_page));
1258
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
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6200
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 * Build Mode sense power condition page
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6203 * NOT IMPLEMENTED.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6204 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6205 static int
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6206 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
6207 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6208 #ifndef __lock_lint
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6209 _NOTE(ARGUNUSED(sdinfo))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6210 _NOTE(ARGUNUSED(pcntrl))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6211 _NOTE(ARGUNUSED(buf))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6212 #endif
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6213 return (0);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6214 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6215
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6216
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6217 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6218 * Process mode select caching page 8 (scsi3 format only).
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6219 * 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
6220 * 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
6221 * supported, quietly ignore them.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6222 * This function fails only if the SET FEATURE command sent to
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6223 * the device fails. The page format is not varified, assuming that the
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6224 * target driver operates correctly - if parameters length is too short,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6225 * we just drop the page.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6226 * 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
6227 * setting have to be changed.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6228 * SET FEATURE command is executed synchronously, i.e. we wait here until
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6229 * it is completed, regardless of the scsi pkt directives.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6230 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6231 * 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
6232 * changing DRA will change RCD.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6233 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6234 * More than one SATA command may be executed to perform operations specified
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6235 * by mode select pages. The first error terminates further execution.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6236 * Operations performed successully are not backed-up in such case.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6237 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6238 * Return SATA_SUCCESS if operation succeeded, SATA_FAILURE otherwise.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6239 * 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
6240 * 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
6241 * Upon return, if operation required sending command to the device, the rval
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6242 * 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
6243 * did not require device access, rval should be set to TRAN_ACCEPT.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6244 * The pagelen should be set to the length of the page.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6245 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6246 * This function has to be called with a port mutex held.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6247 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6248 * Returns SATA_SUCCESS if operation was successful, SATA_FAILURE otherwise.
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 int
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6251 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
6252 int parmlen, int *pagelen, int *rval, int *dmod)
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 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6255 sata_drive_info_t *sdinfo;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6256 sata_cmd_t *scmd = &spx->txlt_sata_pkt->satapkt_cmd;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6257 sata_id_t *sata_id;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6258 struct scsi_extended_sense *sense;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6259 int wce, dra; /* Current settings */
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 sdinfo = sata_get_device_info(spx->txlt_sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6262 &spx->txlt_sata_pkt->satapkt_device);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6263 sata_id = &sdinfo->satadrv_id;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6264 *dmod = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6265
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6266 /* Verify parameters length. If too short, drop it */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6267 if (PAGELENGTH_DAD_MODE_CACHE_SCSI3 +
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6268 sizeof (struct mode_page) < parmlen) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6269 *scsipkt->pkt_scbp = STATUS_CHECK;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6270 sense = sata_arq_sense(spx);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6271 sense->es_key = KEY_ILLEGAL_REQUEST;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6272 sense->es_add_code = SD_SCSI_INVALID_FIELD_IN_PARAMETER_LIST;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6273 *pagelen = parmlen;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6274 *rval = TRAN_ACCEPT;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6275 return (SATA_FAILURE);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6276 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6277
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6278 *pagelen = PAGELENGTH_DAD_MODE_CACHE_SCSI3 + sizeof (struct mode_page);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6279
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6280 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6281 * We can manipulate only write cache and read ahead
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6282 * (read cache) setting.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6283 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6284 if (!(sata_id->ai_cmdset82 & SATA_LOOK_AHEAD) &&
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6285 !(sata_id->ai_cmdset82 & SATA_WRITE_CACHE)) {
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 * None of the features is supported - ignore
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6288 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6289 *rval = TRAN_ACCEPT;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6290 return (SATA_SUCCESS);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6291 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6292
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6293 /* Current setting of Read Ahead (and Read Cache) */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6294 if (sata_id->ai_features85 & SATA_LOOK_AHEAD)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6295 dra = 0; /* 0 == not disabled */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6296 else
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6297 dra = 1;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6298 /* Current setting of Write Cache */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6299 if (sata_id->ai_features85 & SATA_WRITE_CACHE)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6300 wce = 1;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6301 else
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6302 wce = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6303
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6304 if (page->dra == dra && page->wce == wce && page->rcd == dra) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6305 /* nothing to do */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6306 *rval = TRAN_ACCEPT;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6307 return (SATA_SUCCESS);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6308 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6309 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6310 * Need to flip some setting
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6311 * Set-up Internal SET FEATURES command(s)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6312 */
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6313 scmd->satacmd_flags.sata_data_direction = SATA_DIR_NODATA_XFER;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6314 scmd->satacmd_addr_type = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6315 scmd->satacmd_device_reg = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6316 scmd->satacmd_status_reg = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6317 scmd->satacmd_error_reg = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6318 scmd->satacmd_cmd_reg = SATAC_SET_FEATURES;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6319 if (page->dra != dra || page->rcd != dra) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6320 /* Need to flip read ahead setting */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6321 if (dra == 0)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6322 /* Disable read ahead / read cache */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6323 scmd->satacmd_features_reg =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6324 SATAC_SF_DISABLE_READ_AHEAD;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6325 else
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6326 /* Enable read ahead / read cache */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6327 scmd->satacmd_features_reg =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6328 SATAC_SF_ENABLE_READ_AHEAD;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6329
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6330 /* Transfer command to HBA */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6331 if (sata_hba_start(spx, rval) != 0)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6332 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6333 * Pkt not accepted for execution.
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 return (SATA_FAILURE);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6336
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6337 *dmod = 1;
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 /* Now process return */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6340 if (spx->txlt_sata_pkt->satapkt_reason !=
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6341 SATA_PKT_COMPLETED) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6342 goto failure; /* Terminate */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6343 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6344 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6345
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6346 /* 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
6347 if (page->wce != wce) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6348 /* Need to flip Write Cache setting */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6349 if (page->wce == 1)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6350 /* Enable write cache */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6351 scmd->satacmd_features_reg =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6352 SATAC_SF_ENABLE_WRITE_CACHE;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6353 else
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6354 /* Disable write cache */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6355 scmd->satacmd_features_reg =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6356 SATAC_SF_DISABLE_WRITE_CACHE;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6357
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6358 /* Transfer command to HBA */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6359 if (sata_hba_start(spx, rval) != 0)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6360 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6361 * Pkt not accepted for execution.
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 return (SATA_FAILURE);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6364
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6365 *dmod = 1;
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 /* Now process return */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6368 if (spx->txlt_sata_pkt->satapkt_reason !=
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6369 SATA_PKT_COMPLETED) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6370 goto failure;
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 return (SATA_SUCCESS);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6374
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6375 failure:
1675
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
6376 sata_xlate_errors(spx);
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
6377
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
6378 return (SATA_FAILURE);
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
6379 }
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
6380
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
6381 /*
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
6382 * Process mode select informational exceptions control page 0x1c
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
6383 *
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
6384 * The only changeable bit is dexcpt (disable exceptions).
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
6385 * MRIE (method of reporting informational exceptions) must be
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
6386 * "only on request".
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
6387 *
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
6388 * Return SATA_SUCCESS if operation succeeded, SATA_FAILURE otherwise.
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
6389 * If operation resulted in changing device setup, dmod flag should be set to
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
6390 * one (1). If parameters were not changed, dmod flag should be set to 0.
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
6391 * Upon return, if operation required sending command to the device, the rval
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
6392 * should be set to the value returned by sata_hba_start. If operation
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
6393 * did not require device access, rval should be set to TRAN_ACCEPT.
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
6394 * The pagelen should be set to the length of the page.
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
6395 *
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
6396 * This function has to be called with a port mutex held.
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
6397 *
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
6398 * Returns SATA_SUCCESS if operation was successful, SATA_FAILURE otherwise.
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
6399 */
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
6400 static int
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
6401 sata_mode_select_page_1c(
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
6402 sata_pkt_txlate_t *spx,
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
6403 struct mode_info_excpt_page *page,
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
6404 int parmlen,
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
6405 int *pagelen,
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
6406 int *rval,
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
6407 int *dmod)
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
6408 {
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
6409 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
6410 sata_cmd_t *scmd = &spx->txlt_sata_pkt->satapkt_cmd;
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
6411 sata_drive_info_t *sdinfo;
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
6412 sata_id_t *sata_id;
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
6413 struct scsi_extended_sense *sense;
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
6414
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
6415 sdinfo = sata_get_device_info(spx->txlt_sata_hba_inst,
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
6416 &spx->txlt_sata_pkt->satapkt_device);
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
6417 sata_id = &sdinfo->satadrv_id;
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
6418
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
6419 *dmod = 0;
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
6420
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
6421 /* Verify parameters length. If too short, drop it */
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
6422 if (((PAGELENGTH_INFO_EXCPT + sizeof (struct mode_page)) < parmlen) ||
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
6423 page->perf || page->test || (page->mrie != MRIE_ONLY_ON_REQUEST)) {
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
6424 *scsipkt->pkt_scbp = STATUS_CHECK;
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
6425 sense = sata_arq_sense(spx);
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
6426 sense->es_key = KEY_ILLEGAL_REQUEST;
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
6427 sense->es_add_code = SD_SCSI_INVALID_FIELD_IN_PARAMETER_LIST;
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
6428 *pagelen = parmlen;
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
6429 *rval = TRAN_ACCEPT;
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
6430 return (SATA_FAILURE);
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
6431 }
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
6432
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
6433 *pagelen = PAGELENGTH_INFO_EXCPT + sizeof (struct mode_page);
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
6434
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
6435 if (! (sata_id->ai_cmdset82 & SATA_SMART_SUPPORTED)) {
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
6436 *scsipkt->pkt_scbp = STATUS_CHECK;
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
6437 sense = sata_arq_sense(spx);
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
6438 sense->es_key = KEY_ILLEGAL_REQUEST;
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
6439 sense->es_add_code = SD_SCSI_INVALID_FIELD_IN_CDB;
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
6440 *pagelen = parmlen;
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
6441 *rval = TRAN_ACCEPT;
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
6442 return (SATA_FAILURE);
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
6443 }
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
6444
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
6445 /* If already in the state requested, we are done */
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
6446 if (page->dexcpt == ! (sata_id->ai_features85 & SATA_SMART_ENABLED)) {
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
6447 /* nothing to do */
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
6448 *rval = TRAN_ACCEPT;
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
6449 return (SATA_SUCCESS);
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
6450 }
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
6451
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
6452 scmd->satacmd_flags.sata_data_direction = SATA_DIR_NODATA_XFER;
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
6453
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
6454 /* Build SMART_ENABLE or SMART_DISABLE command */
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
6455 scmd->satacmd_addr_type = 0; /* N/A */
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
6456 scmd->satacmd_lba_mid_lsb = SMART_MAGIC_VAL_1;
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
6457 scmd->satacmd_lba_high_lsb = SMART_MAGIC_VAL_2;
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
6458 scmd->satacmd_features_reg = page->dexcpt ?
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
6459 SATA_SMART_DISABLE_OPS : SATA_SMART_ENABLE_OPS;
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
6460 scmd->satacmd_device_reg = 0; /* Always device 0 */
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
6461 scmd->satacmd_cmd_reg = SATAC_SMART;
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
6462
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
6463 /* Transfer command to HBA */
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
6464 if (sata_hba_start(spx, rval) != 0)
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
6465 /*
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
6466 * Pkt not accepted for execution.
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
6467 */
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
6468 return (SATA_FAILURE);
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
6469
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
6470 *dmod = 1; /* At least may have been modified */
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
6471
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
6472 /* Now process return */
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
6473 if (spx->txlt_sata_pkt->satapkt_reason == SATA_PKT_COMPLETED)
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
6474 return (SATA_SUCCESS);
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
6475
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
6476 /* Packet did not complete successfully */
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
6477 sata_xlate_errors(spx);
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
6478
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6479 return (SATA_FAILURE);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6480 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
6481
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6482 /*
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6483 * sata_build_lsense_page0() is used to create the
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6484 * SCSI LOG SENSE page 0 (supported log pages)
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6485 *
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6486 * Currently supported pages are 0, 0x10, 0x2f and 0x30
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6487 * (supported log pages, self-test results, informational exceptions
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6488 * and Sun vendor specific ATA SMART data).
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6489 *
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6490 * Takes a sata_drive_info t * and the address of a buffer
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6491 * in which to create the page information.
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6492 *
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6493 * Returns the number of bytes valid in the buffer.
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6494 */
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6495 static int
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6496 sata_build_lsense_page_0(sata_drive_info_t *sdinfo, uint8_t *buf)
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6497 {
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6498 struct log_parameter *lpp = (struct log_parameter *)buf;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6499 uint8_t *page_ptr = (uint8_t *)lpp->param_values;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6500 int num_pages_supported = 1; /* Always have GET_SUPPORTED_LOG_PAGES */
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6501 sata_id_t *sata_id = &sdinfo->satadrv_id;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6502
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6503 lpp->param_code[0] = 0;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6504 lpp->param_code[1] = 0;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6505 lpp->param_ctrl_flags = LOG_CTRL_LP | LOG_CTRL_LBIN;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6506 *page_ptr++ = PAGE_CODE_GET_SUPPORTED_LOG_PAGES;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6507
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6508 if (sata_id->ai_cmdset82 & SATA_SMART_SUPPORTED) {
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6509 if (sata_id->ai_cmdset84 & SATA_SMART_SELF_TEST_SUPPORTED) {
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6510 *page_ptr++ = PAGE_CODE_SELF_TEST_RESULTS;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6511 ++num_pages_supported;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6512 }
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6513 *page_ptr++ = PAGE_CODE_INFORMATION_EXCEPTIONS;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6514 ++num_pages_supported;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6515 *page_ptr++ = PAGE_CODE_SMART_READ_DATA;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6516 ++num_pages_supported;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6517 }
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6518
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6519 lpp->param_len = num_pages_supported;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6520
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6521 return ((&lpp->param_values[0] - (uint8_t *)lpp) +
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6522 num_pages_supported);
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6523 }
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6524
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6525 /*
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6526 * sata_build_lsense_page_10() is used to create the
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6527 * SCSI LOG SENSE page 0x10 (self-test results)
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6528 *
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6529 * Takes a sata_drive_info t * and the address of a buffer
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6530 * in which to create the page information as well as a sata_hba_inst_t *.
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6531 *
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6532 * Returns the number of bytes valid in the buffer.
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6533 */
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6534 static int
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6535 sata_build_lsense_page_10(
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6536 sata_drive_info_t *sdinfo,
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6537 uint8_t *buf,
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6538 sata_hba_inst_t *sata_hba_inst)
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6539 {
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6540 struct log_parameter *lpp = (struct log_parameter *)buf;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6541 int rval;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6542
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6543 if (sdinfo->satadrv_features_support & SATA_DEV_F_LBA48) {
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6544 struct smart_ext_selftest_log *ext_selftest_log;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6545
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6546 ext_selftest_log = kmem_zalloc(
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6547 sizeof (struct smart_ext_selftest_log), KM_SLEEP);
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6548
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6549 rval = sata_ext_smart_selftest_read_log(sata_hba_inst, sdinfo,
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6550 ext_selftest_log, 0);
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6551 if (rval == 0) {
1940
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
6552 int index, start_index;
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6553 struct smart_ext_selftest_log_entry *entry;
1940
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
6554 static const struct smart_ext_selftest_log_entry empty =
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
6555 {0};
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6556 uint16_t block_num;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6557 int count;
1940
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
6558 boolean_t only_one_block = B_FALSE;
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6559
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6560 index = ext_selftest_log->
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6561 smart_ext_selftest_log_index[0];
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6562 index |= ext_selftest_log->
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6563 smart_ext_selftest_log_index[1] << 8;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6564 if (index == 0)
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6565 goto out;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6566
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6567 --index; /* Correct for 0 origin */
1940
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
6568 start_index = index; /* remember where we started */
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6569 block_num = index / ENTRIES_PER_EXT_SELFTEST_LOG_BLK;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6570 if (block_num != 0) {
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6571 rval = sata_ext_smart_selftest_read_log(
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6572 sata_hba_inst, sdinfo, ext_selftest_log,
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6573 block_num);
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6574 if (rval != 0)
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6575 goto out;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6576 }
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6577 index %= ENTRIES_PER_EXT_SELFTEST_LOG_BLK;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6578 entry =
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6579 &ext_selftest_log->
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6580 smart_ext_selftest_log_entries[index];
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6581
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6582 for (count = 1;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6583 count <= SCSI_ENTRIES_IN_LOG_SENSE_SELFTEST_RESULTS;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6584 ++count) {
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6585 uint8_t status;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6586 uint8_t code;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6587 uint8_t sense_key;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6588 uint8_t add_sense_code;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6589 uint8_t add_sense_code_qual;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6590
1940
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
6591 /* If this is an unused entry, we are done */
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
6592 if (bcmp(entry, &empty, sizeof (empty)) == 0) {
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
6593 /* Broken firmware on some disks */
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
6594 if (index + 1 ==
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
6595 ENTRIES_PER_EXT_SELFTEST_LOG_BLK) {
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
6596 --entry;
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
6597 --index;
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
6598 if (bcmp(entry, &empty,
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
6599 sizeof (empty)) == 0)
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
6600 goto out;
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
6601 } else
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
6602 goto out;
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
6603 }
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
6604
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
6605 if (only_one_block &&
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
6606 start_index == index)
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
6607 goto out;
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
6608
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6609 lpp->param_code[0] = 0;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6610 lpp->param_code[1] = count;
1940
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
6611 lpp->param_ctrl_flags =
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
6612 LOG_CTRL_LP | LOG_CTRL_LBIN;
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6613 lpp->param_len =
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6614 SCSI_LOG_SENSE_SELFTEST_PARAM_LEN;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6615
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6616 status = entry->smart_ext_selftest_log_status;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6617 status >>= 4;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6618 switch (status) {
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6619 case 0:
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6620 default:
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6621 sense_key = KEY_NO_SENSE;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6622 add_sense_code = SD_SCSI_NO_ADD_SENSE;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6623 add_sense_code_qual = 0;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6624 break;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6625 case 1:
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6626 sense_key = KEY_ABORTED_COMMAND;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6627 add_sense_code =
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6628 DIAGNOSTIC_FAILURE_ON_COMPONENT;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6629 add_sense_code_qual = SCSI_COMPONENT_81;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6630 break;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6631 case 2:
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6632 sense_key = KEY_ABORTED_COMMAND;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6633 add_sense_code =
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6634 DIAGNOSTIC_FAILURE_ON_COMPONENT;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6635 add_sense_code_qual = SCSI_COMPONENT_82;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6636 break;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6637 case 3:
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6638 sense_key = KEY_ABORTED_COMMAND;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6639 add_sense_code =
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6640 DIAGNOSTIC_FAILURE_ON_COMPONENT;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6641 add_sense_code_qual = SCSI_COMPONENT_83;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6642 break;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6643 case 4:
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6644 sense_key = KEY_HARDWARE_ERROR;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6645 add_sense_code =
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6646 DIAGNOSTIC_FAILURE_ON_COMPONENT;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6647 add_sense_code_qual = SCSI_COMPONENT_84;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6648 break;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6649 case 5:
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6650 sense_key = KEY_HARDWARE_ERROR;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6651 add_sense_code =
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6652 DIAGNOSTIC_FAILURE_ON_COMPONENT;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6653 add_sense_code_qual = SCSI_COMPONENT_85;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6654 break;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6655 case 6:
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6656 sense_key = KEY_HARDWARE_ERROR;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6657 add_sense_code =
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6658 DIAGNOSTIC_FAILURE_ON_COMPONENT;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6659 add_sense_code_qual = SCSI_COMPONENT_86;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6660 break;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6661 case 7:
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6662 sense_key = KEY_MEDIUM_ERROR;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6663 add_sense_code =
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6664 DIAGNOSTIC_FAILURE_ON_COMPONENT;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6665 add_sense_code_qual = SCSI_COMPONENT_87;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6666 break;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6667 case 8:
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6668 sense_key = KEY_HARDWARE_ERROR;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6669 add_sense_code =
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6670 DIAGNOSTIC_FAILURE_ON_COMPONENT;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6671 add_sense_code_qual = SCSI_COMPONENT_88;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6672 break;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6673 }
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6674 code = 0; /* unspecified */
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6675 status |= (code << 4);
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6676 lpp->param_values[0] = status;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6677 lpp->param_values[1] = 0; /* unspecified */
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6678 lpp->param_values[2] = entry->
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6679 smart_ext_selftest_log_timestamp[1];
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6680 lpp->param_values[3] = entry->
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6681 smart_ext_selftest_log_timestamp[0];
1940
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
6682 if (status != 0) {
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
6683 lpp->param_values[4] = 0;
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
6684 lpp->param_values[5] = 0;
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
6685 lpp->param_values[6] = entry->
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
6686 smart_ext_selftest_log_failing_lba
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
6687 [5];
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
6688 lpp->param_values[7] = entry->
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
6689 smart_ext_selftest_log_failing_lba
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
6690 [4];
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
6691 lpp->param_values[8] = entry->
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
6692 smart_ext_selftest_log_failing_lba
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
6693 [3];
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
6694 lpp->param_values[9] = entry->
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
6695 smart_ext_selftest_log_failing_lba
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
6696 [2];
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
6697 lpp->param_values[10] = entry->
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
6698 smart_ext_selftest_log_failing_lba
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
6699 [1];
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
6700 lpp->param_values[11] = entry->
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
6701 smart_ext_selftest_log_failing_lba
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
6702 [0];
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
6703 } else { /* No bad block address */
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
6704 lpp->param_values[4] = 0xff;
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
6705 lpp->param_values[5] = 0xff;
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
6706 lpp->param_values[6] = 0xff;
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
6707 lpp->param_values[7] = 0xff;
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
6708 lpp->param_values[8] = 0xff;
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
6709 lpp->param_values[9] = 0xff;
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
6710 lpp->param_values[10] = 0xff;
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
6711 lpp->param_values[11] = 0xff;
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
6712 }
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
6713
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6714 lpp->param_values[12] = sense_key;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6715 lpp->param_values[13] = add_sense_code;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6716 lpp->param_values[14] = add_sense_code_qual;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6717 lpp->param_values[15] = 0; /* undefined */
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6718
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6719 lpp = (struct log_parameter *)
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6720 (((uint8_t *)lpp) +
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6721 SCSI_LOG_PARAM_HDR_LEN +
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6722 SCSI_LOG_SENSE_SELFTEST_PARAM_LEN);
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6723
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6724 --index; /* Back up to previous entry */
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6725 if (index < 0) {
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6726 if (block_num > 0) {
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6727 --block_num;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6728 } else {
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6729 struct read_log_ext_directory
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6730 logdir;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6731
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6732 rval =
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6733 sata_read_log_ext_directory(
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6734 sata_hba_inst, sdinfo,
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6735 &logdir);
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6736 if (rval == -1)
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6737 goto out;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6738 if ((logdir.read_log_ext_vers
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6739 [0] == 0) &&
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6740 (logdir.read_log_ext_vers
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6741 [1] == 0))
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6742 goto out;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6743 block_num =
1940
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
6744 logdir.read_log_ext_nblks
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6745 [EXT_SMART_SELFTEST_LOG_PAGE
1940
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
6746 - 1][0];
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6747 block_num |= logdir.
1940
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
6748 read_log_ext_nblks
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6749 [EXT_SMART_SELFTEST_LOG_PAGE
1940
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
6750 - 1][1] << 8;
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6751 --block_num;
1940
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
6752 only_one_block =
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
6753 (block_num == 0);
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6754 }
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6755 rval = sata_ext_smart_selftest_read_log(
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6756 sata_hba_inst, sdinfo,
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6757 ext_selftest_log, block_num);
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6758 if (rval != 0)
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6759 goto out;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6760
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6761 index =
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6762 ENTRIES_PER_EXT_SELFTEST_LOG_BLK -
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6763 1;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6764 }
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6765 index %= ENTRIES_PER_EXT_SELFTEST_LOG_BLK;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6766 entry = &ext_selftest_log->
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6767 smart_ext_selftest_log_entries[index];
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6768 }
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6769 }
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6770 out:
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6771 kmem_free(ext_selftest_log,
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6772 sizeof (struct smart_ext_selftest_log));
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6773 } else {
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6774 struct smart_selftest_log *selftest_log;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6775
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6776 selftest_log = kmem_zalloc(sizeof (struct smart_selftest_log),
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6777 KM_SLEEP);
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6778
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6779 rval = sata_smart_selftest_log(sata_hba_inst, sdinfo,
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6780 selftest_log);
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6781
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6782 if (rval == 0) {
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6783 int index;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6784 int count;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6785 struct smart_selftest_log_entry *entry;
1940
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
6786 static const struct smart_selftest_log_entry empty =
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
6787 { 0 };
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6788
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6789 index = selftest_log->smart_selftest_log_index;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6790 if (index == 0)
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6791 goto done;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6792 --index; /* Correct for 0 origin */
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6793 entry = &selftest_log->
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6794 smart_selftest_log_entries[index];
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6795 for (count = 1;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6796 count <= SCSI_ENTRIES_IN_LOG_SENSE_SELFTEST_RESULTS;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6797 ++count) {
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6798 uint8_t status;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6799 uint8_t code;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6800 uint8_t sense_key;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6801 uint8_t add_sense_code;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6802 uint8_t add_sense_code_qual;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6803
1940
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
6804 if (bcmp(entry, &empty, sizeof (empty)) == 0)
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
6805 goto done;
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
6806
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6807 lpp->param_code[0] = 0;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6808 lpp->param_code[1] = count;
1940
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
6809 lpp->param_ctrl_flags =
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
6810 LOG_CTRL_LP | LOG_CTRL_LBIN;
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6811 lpp->param_len =
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6812 SCSI_LOG_SENSE_SELFTEST_PARAM_LEN;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6813
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6814 status = entry->smart_selftest_log_status;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6815 status >>= 4;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6816 switch (status) {
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6817 case 0:
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6818 default:
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6819 sense_key = KEY_NO_SENSE;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6820 add_sense_code = SD_SCSI_NO_ADD_SENSE;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6821 break;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6822 case 1:
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6823 sense_key = KEY_ABORTED_COMMAND;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6824 add_sense_code =
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6825 DIAGNOSTIC_FAILURE_ON_COMPONENT;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6826 add_sense_code_qual = SCSI_COMPONENT_81;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6827 break;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6828 case 2:
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6829 sense_key = KEY_ABORTED_COMMAND;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6830 add_sense_code =
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6831 DIAGNOSTIC_FAILURE_ON_COMPONENT;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6832 add_sense_code_qual = SCSI_COMPONENT_82;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6833 break;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6834 case 3:
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6835 sense_key = KEY_ABORTED_COMMAND;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6836 add_sense_code =
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6837 DIAGNOSTIC_FAILURE_ON_COMPONENT;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6838 add_sense_code_qual = SCSI_COMPONENT_83;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6839 break;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6840 case 4:
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6841 sense_key = KEY_HARDWARE_ERROR;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6842 add_sense_code =
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6843 DIAGNOSTIC_FAILURE_ON_COMPONENT;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6844 add_sense_code_qual = SCSI_COMPONENT_84;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6845 break;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6846 case 5:
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6847 sense_key = KEY_HARDWARE_ERROR;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6848 add_sense_code =
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6849 DIAGNOSTIC_FAILURE_ON_COMPONENT;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6850 add_sense_code_qual = SCSI_COMPONENT_85;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6851 break;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6852 case 6:
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6853 sense_key = KEY_HARDWARE_ERROR;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6854 add_sense_code =
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6855 DIAGNOSTIC_FAILURE_ON_COMPONENT;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6856 add_sense_code_qual = SCSI_COMPONENT_86;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6857 break;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6858 case 7:
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6859 sense_key = KEY_MEDIUM_ERROR;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6860 add_sense_code =
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6861 DIAGNOSTIC_FAILURE_ON_COMPONENT;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6862 add_sense_code_qual = SCSI_COMPONENT_87;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6863 break;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6864 case 8:
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6865 sense_key = KEY_HARDWARE_ERROR;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6866 add_sense_code =
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6867 DIAGNOSTIC_FAILURE_ON_COMPONENT;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6868 add_sense_code_qual = SCSI_COMPONENT_88;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6869 break;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6870 }
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6871 code = 0; /* unspecified */
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6872 status |= (code << 4);
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6873 lpp->param_values[0] = status;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6874 lpp->param_values[1] = 0; /* unspecified */
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6875 lpp->param_values[2] = entry->
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6876 smart_selftest_log_timestamp[1];
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6877 lpp->param_values[3] = entry->
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6878 smart_selftest_log_timestamp[0];
1940
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
6879 if (status != 0) {
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
6880 lpp->param_values[4] = 0;
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
6881 lpp->param_values[5] = 0;
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
6882 lpp->param_values[6] = 0;
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
6883 lpp->param_values[7] = 0;
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
6884 lpp->param_values[8] = entry->
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
6885 smart_selftest_log_failing_lba[3];
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
6886 lpp->param_values[9] = entry->
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
6887 smart_selftest_log_failing_lba[2];
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
6888 lpp->param_values[10] = entry->
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
6889 smart_selftest_log_failing_lba[1];
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
6890 lpp->param_values[11] = entry->
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
6891 smart_selftest_log_failing_lba[0];
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
6892 } else { /* No block address */
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
6893 lpp->param_values[4] = 0xff;
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
6894 lpp->param_values[5] = 0xff;
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
6895 lpp->param_values[6] = 0xff;
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
6896 lpp->param_values[7] = 0xff;
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
6897 lpp->param_values[8] = 0xff;
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
6898 lpp->param_values[9] = 0xff;
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
6899 lpp->param_values[10] = 0xff;
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
6900 lpp->param_values[11] = 0xff;
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
6901 }
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6902 lpp->param_values[12] = sense_key;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6903 lpp->param_values[13] = add_sense_code;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6904 lpp->param_values[14] = add_sense_code_qual;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6905 lpp->param_values[15] = 0; /* undefined */
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6906
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6907 lpp = (struct log_parameter *)
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6908 (((uint8_t *)lpp) +
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6909 SCSI_LOG_PARAM_HDR_LEN +
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6910 SCSI_LOG_SENSE_SELFTEST_PARAM_LEN);
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6911 --index; /* back up to previous entry */
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6912 if (index < 0) {
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6913 index =
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6914 NUM_SMART_SELFTEST_LOG_ENTRIES - 1;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6915 }
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6916 entry = &selftest_log->
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6917 smart_selftest_log_entries[index];
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6918 }
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6919 }
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6920 done:
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6921 kmem_free(selftest_log, sizeof (struct smart_selftest_log));
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6922 }
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6923
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6924 return ((SCSI_LOG_PARAM_HDR_LEN + SCSI_LOG_SENSE_SELFTEST_PARAM_LEN) *
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6925 SCSI_ENTRIES_IN_LOG_SENSE_SELFTEST_RESULTS);
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6926 }
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6927
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6928 /*
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6929 * sata_build_lsense_page_2f() is used to create the
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6930 * SCSI LOG SENSE page 0x10 (informational exceptions)
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6931 *
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6932 * Takes a sata_drive_info t * and the address of a buffer
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6933 * in which to create the page information as well as a sata_hba_inst_t *.
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6934 *
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6935 * Returns the number of bytes valid in the buffer.
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6936 */
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6937 static int
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6938 sata_build_lsense_page_2f(
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6939 sata_drive_info_t *sdinfo,
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6940 uint8_t *buf,
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6941 sata_hba_inst_t *sata_hba_inst)
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6942 {
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6943 struct log_parameter *lpp = (struct log_parameter *)buf;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6944 int rval;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6945 uint8_t *smart_data;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6946 uint8_t temp;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6947 sata_id_t *sata_id;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6948 #define SMART_NO_TEMP 0xff
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6949
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6950 lpp->param_code[0] = 0;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6951 lpp->param_code[1] = 0;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6952 lpp->param_ctrl_flags = LOG_CTRL_LP | LOG_CTRL_LBIN;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6953
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6954 /* Now get the SMART status w.r.t. threshold exceeded */
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6955 rval = sata_fetch_smart_return_status(sata_hba_inst, sdinfo);
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6956 switch (rval) {
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6957 case 1:
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6958 lpp->param_values[0] = SCSI_PREDICTED_FAILURE;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6959 lpp->param_values[1] = SCSI_GENERAL_HD_FAILURE;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6960 break;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6961 case 0:
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6962 case -1: /* failed to get data */
1940
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
6963 lpp->param_values[0] = 0; /* No failure predicted */
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6964 lpp->param_values[1] = 0;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6965 break;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6966 #if defined(SATA_DEBUG)
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6967 default:
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6968 cmn_err(CE_PANIC, "sata_build_lsense_page_2f bad return value");
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6969 /* NOTREACHED */
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6970 #endif
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6971 }
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6972
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6973 sata_id = &sdinfo->satadrv_id;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6974 if (! (sata_id->ai_sctsupport & SATA_SCT_CMD_TRANS_SUP))
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6975 temp = SMART_NO_TEMP;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6976 else {
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6977 /* Now get the temperature */
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6978 smart_data = kmem_zalloc(512, KM_SLEEP);
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6979 rval = sata_smart_read_log(sata_hba_inst, sdinfo, smart_data,
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6980 SCT_STATUS_LOG_PAGE, 1);
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6981 if (rval == -1)
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6982 temp = SMART_NO_TEMP;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6983 else {
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6984 temp = smart_data[200];
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6985 if (temp & 0x80) {
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6986 if (temp & 0x7f)
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6987 temp = 0;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6988 else
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6989 temp = SMART_NO_TEMP;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6990 }
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6991 }
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6992 kmem_free(smart_data, 512);
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6993 }
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6994
1940
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
6995 lpp->param_values[2] = temp; /* most recent temperature */
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
6996 lpp->param_values[3] = 0; /* required vendor specific byte */
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6997
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6998 lpp->param_len = SCSI_INFO_EXCEPTIONS_PARAM_LEN;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
6999
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
7000
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
7001 return (SCSI_INFO_EXCEPTIONS_PARAM_LEN + SCSI_LOG_PARAM_HDR_LEN);
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
7002 }
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
7003
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
7004 /*
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
7005 * sata_build_lsense_page_30() is used to create the
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
7006 * SCSI LOG SENSE page 0x30 (Sun's vendor specific page for ATA SMART data).
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
7007 *
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
7008 * Takes a sata_drive_info t * and the address of a buffer
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
7009 * in which to create the page information as well as a sata_hba_inst_t *.
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
7010 *
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
7011 * Returns the number of bytes valid in the buffer.
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
7012 */
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
7013 static int
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
7014 sata_build_lsense_page_30(
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
7015 sata_drive_info_t *sdinfo,
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
7016 uint8_t *buf,
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
7017 sata_hba_inst_t *sata_hba_inst)
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
7018 {
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
7019 struct smart_data *smart_data = (struct smart_data *)buf;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
7020 int rval;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
7021
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
7022 /* Now do the SMART READ DATA */
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
7023 rval = sata_fetch_smart_data(sata_hba_inst, sdinfo, smart_data);
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
7024 if (rval == -1)
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
7025 return (0);
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
7026
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
7027 return (sizeof (struct smart_data));
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
7028 }
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
7029
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7030
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7031
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7032
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 /* ************************** LOCAL FUNCTIONS ************************** */
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 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7037 * Validate sata_tran info
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7038 * SATA_FAILURE returns if structure is inconsistent or structure revision
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7039 * does not match one used by the framework.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7040 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7041 * Returns SATA_SUCCESS if sata_hba_tran has matching revision and contains
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7042 * required function pointers.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7043 * Returns SATA_FAILURE otherwise.
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 static int
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7046 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
7047 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7048 if (sata_tran->sata_tran_hba_rev != SATA_TRAN_HBA_REV) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7049 sata_log(NULL, CE_WARN,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7050 "sata: invalid sata_hba_tran version %d for driver %s",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7051 sata_tran->sata_tran_hba_rev, ddi_driver_name(dip));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7052 return (SATA_FAILURE);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7053 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7054
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7055 if (dip != sata_tran->sata_tran_hba_dip) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7056 SATA_LOG_D((NULL, CE_WARN,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7057 "sata: inconsistent sata_tran_hba_dip "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7058 "%p / %p", sata_tran->sata_tran_hba_dip, dip));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7059 return (SATA_FAILURE);
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
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7062 if (sata_tran->sata_tran_probe_port == NULL ||
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7063 sata_tran->sata_tran_start == NULL ||
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7064 sata_tran->sata_tran_abort == NULL ||
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7065 sata_tran->sata_tran_reset_dport == NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7066 SATA_LOG_D((NULL, CE_WARN, "sata: sata_hba_tran missing "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7067 "required functions"));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7068 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7069 return (SATA_SUCCESS);
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 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7073 * Remove HBA instance from sata_hba_list.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7074 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7075 static void
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7076 sata_remove_hba_instance(dev_info_t *dip)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7077 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7078 sata_hba_inst_t *sata_hba_inst;
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 mutex_enter(&sata_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7081 for (sata_hba_inst = sata_hba_list;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7082 sata_hba_inst != (struct sata_hba_inst *)NULL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7083 sata_hba_inst = sata_hba_inst->satahba_next) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7084 if (sata_hba_inst->satahba_dip == dip)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7085 break;
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
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7088 if (sata_hba_inst == (struct sata_hba_inst *)NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7089 #ifdef SATA_DEBUG
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7090 cmn_err(CE_WARN, "sata_remove_hba_instance: "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7091 "unknown HBA instance\n");
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7092 #endif
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7093 ASSERT(FALSE);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7094 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7095 if (sata_hba_inst == sata_hba_list) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7096 sata_hba_list = sata_hba_inst->satahba_next;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7097 if (sata_hba_list) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7098 sata_hba_list->satahba_prev =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7099 (struct sata_hba_inst *)NULL;
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 if (sata_hba_inst == sata_hba_list_tail) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7102 sata_hba_list_tail = NULL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7103 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7104 } else if (sata_hba_inst == sata_hba_list_tail) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7105 sata_hba_list_tail = sata_hba_inst->satahba_prev;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7106 if (sata_hba_list_tail) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7107 sata_hba_list_tail->satahba_next =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7108 (struct sata_hba_inst *)NULL;
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 } else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7111 sata_hba_inst->satahba_prev->satahba_next =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7112 sata_hba_inst->satahba_next;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7113 sata_hba_inst->satahba_next->satahba_prev =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7114 sata_hba_inst->satahba_prev;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7115 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7116 mutex_exit(&sata_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7117 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7118
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
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7121
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 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7124 * Probe all SATA ports of the specified HBA instance.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7125 * 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
7126 * 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
7127 * 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
7128 * 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
7129 * (if any). Allocates necessary structures for each port.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7130 * Creates attachment point minor node for each non-failed port.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7131 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7132
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7133 static void
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7134 sata_probe_ports(sata_hba_inst_t *sata_hba_inst)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7135 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7136 dev_info_t *dip = SATA_DIP(sata_hba_inst);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7137 int ncport, npmport;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7138 sata_cport_info_t *cportinfo;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7139 sata_drive_info_t *drive;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7140 sata_pmult_info_t *pminfo;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7141 sata_pmport_info_t *pmportinfo;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7142 sata_device_t sata_device;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7143 int rval;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7144 dev_t minor_number;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7145 char name[16];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7146
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 * Probe controller ports first, to find port status and
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7149 * any port multiplier attached.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7150 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7151 for (ncport = 0; ncport < SATA_NUM_CPORTS(sata_hba_inst); ncport++) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7152 /* allocate cport structure */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7153 cportinfo = kmem_zalloc(sizeof (sata_cport_info_t), KM_SLEEP);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7154 ASSERT(cportinfo != NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7155 mutex_init(&cportinfo->cport_mutex, NULL, MUTEX_DRIVER, NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7156
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7157 mutex_enter(&cportinfo->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7158
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7159 cportinfo->cport_addr.cport = ncport;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7160 cportinfo->cport_addr.pmport = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7161 cportinfo->cport_addr.qual = SATA_ADDR_CPORT;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7162 cportinfo->cport_state &= ~SATA_PORT_STATE_CLEAR_MASK;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7163 cportinfo->cport_state |= SATA_STATE_PROBING;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7164 SATA_CPORT_INFO(sata_hba_inst, ncport) = cportinfo;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7165
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7166 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7167 * Regardless if a port is usable or not, create
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7168 * an attachment point
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 mutex_exit(&cportinfo->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7171 minor_number =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7172 SATA_MAKE_AP_MINOR(ddi_get_instance(dip), ncport, 0, 0);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7173 (void) sprintf(name, "%d", ncport);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7174 if (ddi_create_minor_node(dip, name, S_IFCHR,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7175 minor_number, DDI_NT_SATA_ATTACHMENT_POINT, 0) !=
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7176 DDI_SUCCESS) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7177 sata_log(sata_hba_inst, CE_WARN, "sata_hba_attach: "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7178 "cannot create sata attachment point for port %d",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7179 ncport);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7180 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7181
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7182 /* Probe port */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7183 sata_device.satadev_addr.cport = ncport;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7184 sata_device.satadev_addr.pmport = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7185 sata_device.satadev_addr.qual = SATA_ADDR_CPORT;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7186 sata_device.satadev_rev = SATA_DEVICE_REV;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7187
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7188 rval = (*SATA_PROBE_PORT_FUNC(sata_hba_inst))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7189 (dip, &sata_device);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7190
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7191 mutex_enter(&cportinfo->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7192 sata_update_port_scr(&cportinfo->cport_scr, &sata_device);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7193 if (rval != SATA_SUCCESS) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7194 /* Something went wrong? Fail the port */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7195 cportinfo->cport_state = SATA_PSTATE_FAILED;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7196 mutex_exit(&cportinfo->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7197 continue;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7198 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7199 cportinfo->cport_state &= ~SATA_STATE_PROBING;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7200 cportinfo->cport_state |= SATA_STATE_PROBED;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7201 cportinfo->cport_dev_type = sata_device.satadev_type;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7202
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7203 cportinfo->cport_state |= SATA_STATE_READY;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7204 if (cportinfo->cport_dev_type == SATA_DTYPE_NONE) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7205 mutex_exit(&cportinfo->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7206 continue;
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 if (cportinfo->cport_dev_type != SATA_DTYPE_PMULT) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7209 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7210 * There is some device attached.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7211 * Allocate device info structure
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 mutex_exit(&cportinfo->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7214 drive = kmem_zalloc(sizeof (sata_drive_info_t),
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7215 KM_SLEEP);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7216 mutex_enter(&cportinfo->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7217 SATA_CPORTINFO_DRV_INFO(cportinfo) = drive;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7218 drive->satadrv_addr = cportinfo->cport_addr;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7219 drive->satadrv_addr.qual = SATA_ADDR_DCPORT;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7220 drive->satadrv_type = cportinfo->cport_dev_type;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7221 drive->satadrv_state = SATA_STATE_UNKNOWN;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7222 } else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7223 ASSERT(cportinfo->cport_dev_type == SATA_DTYPE_PMULT);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7224 mutex_exit(&cportinfo->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7225 pminfo = kmem_zalloc(sizeof (sata_pmult_info_t),
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7226 KM_SLEEP);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7227 mutex_enter(&cportinfo->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7228 ASSERT(pminfo != NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7229 SATA_CPORTINFO_PMULT_INFO(cportinfo) = pminfo;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7230 pminfo->pmult_addr.cport = cportinfo->cport_addr.cport;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7231 pminfo->pmult_addr.pmport = SATA_PMULT_HOSTPORT;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7232 pminfo->pmult_addr.qual = SATA_ADDR_PMPORT;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7233 pminfo->pmult_num_dev_ports =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7234 sata_device.satadev_add_info;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7235 mutex_init(&pminfo->pmult_mutex, NULL, MUTEX_DRIVER,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7236 NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7237 pminfo->pmult_state = SATA_STATE_PROBING;
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 /* Probe Port Multiplier ports */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7240 for (npmport = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7241 npmport < pminfo->pmult_num_dev_ports;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7242 npmport++) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7243 mutex_exit(&cportinfo->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7244 pmportinfo = kmem_zalloc(
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7245 sizeof (sata_pmport_info_t), KM_SLEEP);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7246 mutex_enter(&cportinfo->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7247 ASSERT(pmportinfo != NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7248 pmportinfo->pmport_addr.cport = ncport;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7249 pmportinfo->pmport_addr.pmport = npmport;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7250 pmportinfo->pmport_addr.qual =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7251 SATA_ADDR_PMPORT;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7252 pminfo->pmult_dev_port[npmport] = pmportinfo;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7253 mutex_init(&pmportinfo->pmport_mutex, NULL,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7254 MUTEX_DRIVER, NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7255
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7256 sata_device.satadev_addr.pmport = npmport;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7257 sata_device.satadev_addr.qual =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7258 SATA_ADDR_PMPORT;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7259
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7260 mutex_exit(&cportinfo->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7261 /* Create an attachment point */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7262 minor_number = SATA_MAKE_AP_MINOR(
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7263 ddi_get_instance(dip), ncport, npmport, 1);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7264 (void) sprintf(name, "%d.%d", ncport, npmport);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7265 if (ddi_create_minor_node(dip, name, S_IFCHR,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7266 minor_number, DDI_NT_SATA_ATTACHMENT_POINT,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7267 0) != DDI_SUCCESS) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7268 sata_log(sata_hba_inst, CE_WARN,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7269 "sata_hba_attach: "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7270 "cannot create sata attachment "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7271 "point for port %d pmult port %d",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7272 ncport, npmport);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7273 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7274 rval = (*SATA_PROBE_PORT_FUNC(sata_hba_inst))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7275 (dip, &sata_device);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7276 mutex_enter(&cportinfo->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7277
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7278 /* sata_update_port_info() */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7279 sata_update_port_scr(&pmportinfo->pmport_scr,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7280 &sata_device);
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 if (rval != SATA_SUCCESS) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7283 pmportinfo->pmport_state =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7284 SATA_PSTATE_FAILED;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7285 continue;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7286 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7287 pmportinfo->pmport_state &=
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7288 ~SATA_STATE_PROBING;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7289 pmportinfo->pmport_state |= SATA_STATE_PROBED;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7290 pmportinfo->pmport_dev_type =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7291 sata_device.satadev_type;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7292
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7293 pmportinfo->pmport_state |= SATA_STATE_READY;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7294 if (pmportinfo->pmport_dev_type ==
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7295 SATA_DTYPE_NONE)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7296 continue;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7297
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7298 /* Port multipliers cannot be chained */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7299 ASSERT(pmportinfo->pmport_dev_type !=
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7300 SATA_DTYPE_PMULT);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7301 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7302 * There is something attached to Port
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7303 * Multiplier device port
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7304 * Allocate device info structure
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 mutex_exit(&cportinfo->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7307 drive = kmem_zalloc(
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7308 sizeof (sata_drive_info_t), KM_SLEEP);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7309 rval = (*SATA_PROBE_PORT_FUNC(sata_hba_inst))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7310 (dip, &sata_device);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7311 mutex_enter(&cportinfo->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7312
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7313 /* sata_update_port_info() */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7314 sata_update_port_scr(&pmportinfo->pmport_scr,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7315 &sata_device);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7316
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7317 pmportinfo->pmport_sata_drive = drive;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7318 drive->satadrv_addr.cport =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7319 pmportinfo->pmport_addr.cport;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7320 drive->satadrv_addr.pmport = npmport;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7321 drive->satadrv_addr.qual = SATA_ADDR_DPMPORT;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7322 drive->satadrv_type = pmportinfo->
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7323 pmport_dev_type;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7324 drive->satadrv_state = SATA_STATE_UNKNOWN;
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 pmportinfo->pmport_state =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7327 SATA_STATE_PROBED | SATA_STATE_READY;
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 mutex_exit(&cportinfo->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7330 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7331 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7332
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7333
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7334
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 * Create SATA device nodes for specified HBA instance (SCSI target
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7337 * device nodes).
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7338 * 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
7339 * 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
7340 * by anyone other then this thread, therefore per-port mutex protection is
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7341 * not needed.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7342 * 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
7343 * 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
7344 * 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
7345 * when there is no device attached.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7346 * 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
7347 * but may be removed if it cannot be put online.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7348 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7349 * This function cannot be called from an interrupt context.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7350 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7351 * ONLY DISK TARGET NODES ARE CREATED NOW
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7352 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7353 static void
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7354 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
7355 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7356 int ncport, npmport;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7357 sata_cport_info_t *cportinfo;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7358 sata_pmult_info_t *pminfo;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7359 sata_pmport_info_t *pmportinfo;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7360 dev_info_t *cdip; /* child dip */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7361 sata_device_t sata_device;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7362 int rval;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7363
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7364 /*
1781
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
7365 * Walk through pre-probed sata ports info in sata_hba_inst structure
1258
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 for (ncport = 0; ncport < SATA_NUM_CPORTS(sata_hba_inst); ncport++) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7368 cportinfo = SATA_CPORT_INFO(sata_hba_inst, ncport);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7369 mutex_enter(&cportinfo->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7370 if (!(cportinfo->cport_state & SATA_STATE_PROBED)) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7371 mutex_exit(&cportinfo->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7372 continue;
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 if (cportinfo->cport_state == SATA_PSTATE_FAILED) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7375 mutex_exit(&cportinfo->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7376 continue;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7377 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7378 if (cportinfo->cport_dev_type == SATA_DTYPE_NONE) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7379 /* No device attached to the controller port */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7380 mutex_exit(&cportinfo->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7381 continue;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7382 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7383 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7384 * Some device is attached to a controller port.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7385 * We rely on controllers distinquishing between no-device,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7386 * attached port multiplier and other kind of attached device.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7387 * We need to get Identify Device data and determine
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7388 * positively the dev type before trying to attach
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7389 * the target driver.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7390 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7391 sata_device.satadev_rev = SATA_DEVICE_REV;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7392 if (cportinfo->cport_dev_type != SATA_DTYPE_PMULT) {
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 * Not port multiplier.
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 sata_device.satadev_addr = cportinfo->cport_addr;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7397 sata_device.satadev_addr.qual = SATA_ADDR_DCPORT;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7398 mutex_exit(&cportinfo->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7399 rval = sata_probe_device(sata_hba_inst, &sata_device);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7400 if (rval != SATA_SUCCESS ||
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7401 sata_device.satadev_type == SATA_DTYPE_UNKNOWN)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7402 continue;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7403
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7404 mutex_enter(&cportinfo->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7405 if ((sata_device.satadev_type &
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7406 SATA_VALID_DEV_TYPE) == 0) {
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 * Could not determine device type or
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7409 * a device is not supported.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7410 * Degrade this device to unknown.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7411 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7412 cportinfo->cport_dev_type = SATA_DTYPE_UNKNOWN;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7413 mutex_exit(&cportinfo->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7414 continue;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7415 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7416 cportinfo->cport_dev_type = sata_device.satadev_type;
1781
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
7417 mutex_exit(&cportinfo->cport_mutex);
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
7418
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
7419 if (sata_initialize_device(sata_hba_inst,
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
7420 SATA_CPORTINFO_DRV_INFO(cportinfo)) != SATA_SUCCESS)
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
7421 /* Retry */
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
7422 (void) sata_initialize_device(sata_hba_inst,
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
7423 SATA_CPORTINFO_DRV_INFO(cportinfo));
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
7424
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
7425 mutex_enter(&cportinfo->cport_mutex);
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7426 sata_show_drive_info(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7427 SATA_CPORTINFO_DRV_INFO(cportinfo));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7428 mutex_exit(&cportinfo->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7429 cdip = sata_create_target_node(pdip, sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7430 &sata_device.satadev_addr);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7431 mutex_enter(&cportinfo->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7432 if (cdip == NULL) {
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 * Attaching target node failed.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7435 * We retain sata_drive_info structure...
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7436 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7437 (SATA_CPORTINFO_DRV_INFO(cportinfo))->
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7438 satadrv_type = SATA_DTYPE_UNKNOWN;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7439 (SATA_CPORTINFO_DRV_INFO(cportinfo))->
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7440 satadrv_state = SATA_STATE_UNKNOWN;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7441 cportinfo->cport_dev_type = SATA_DTYPE_UNKNOWN;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7442 mutex_exit(&cportinfo->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7443 continue;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7444 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7445 (SATA_CPORTINFO_DRV_INFO(cportinfo))->
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7446 satadrv_state = SATA_STATE_READY;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7447 } else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7448 /* This must be Port Multiplier type */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7449 if (cportinfo->cport_dev_type != SATA_DTYPE_PMULT) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7450 SATA_LOG_D((sata_hba_inst, CE_WARN,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7451 "sata_make_device_nodes: "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7452 "unknown dev type %x",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7453 cportinfo->cport_dev_type));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7454 mutex_exit(&cportinfo->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7455 continue;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7456 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7457 pminfo = SATA_CPORTINFO_PMULT_INFO(cportinfo);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7458 for (npmport = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7459 npmport < pminfo->pmult_num_dev_ports;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7460 npmport++) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7461 pmportinfo = pminfo->pmult_dev_port[npmport];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7462 if (pmportinfo->pmport_state &
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7463 SATA_PSTATE_FAILED) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7464 continue;
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 (pmportinfo->pmport_dev_type &
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7467 SATA_DTYPE_NONE)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7468 /* No device attached */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7469 continue;
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 sata_device.satadev_addr =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7472 pmportinfo->pmport_addr;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7473 sata_device.satadev_addr.qual =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7474 SATA_ADDR_DPMPORT;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7475 mutex_exit(&cportinfo->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7476 rval = sata_probe_device(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7477 &sata_device);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7478 if (rval != SATA_SUCCESS ||
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7479 sata_device.satadev_type ==
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7480 SATA_DTYPE_UNKNOWN) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7481 mutex_enter(&cportinfo->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7482 continue;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7483 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7484 mutex_enter(&cportinfo->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7485 if ((sata_device.satadev_type &
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7486 SATA_VALID_DEV_TYPE) == 0) {
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 * Could not determine device type.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7489 * Degrade this device to unknown.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7490 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7491 pmportinfo->pmport_dev_type =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7492 SATA_DTYPE_UNKNOWN;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7493 continue;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7494 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7495 pmportinfo->pmport_dev_type =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7496 sata_device.satadev_type;
1781
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
7497 mutex_exit(&cportinfo->cport_mutex);
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
7498 if (sata_initialize_device(sata_hba_inst,
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
7499 pmportinfo->pmport_sata_drive) !=
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
7500 SATA_SUCCESS)
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
7501 /* Retry */
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
7502 (void) sata_initialize_device(
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
7503 sata_hba_inst,
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
7504 pmportinfo->pmport_sata_drive);
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
7505
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
7506 mutex_enter(&cportinfo->cport_mutex);
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7507 sata_show_drive_info(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7508 pmportinfo->pmport_sata_drive);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7509 mutex_exit(&cportinfo->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7510 cdip = sata_create_target_node(pdip,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7511 sata_hba_inst, &sata_device.satadev_addr);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7512 mutex_enter(&cportinfo->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7513 if (cdip == NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7514 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7515 * Attaching target node failed.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7516 * We retain sata_drive_info
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7517 * structure...
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7518 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7519 pmportinfo->pmport_sata_drive->
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7520 satadrv_type = SATA_DTYPE_UNKNOWN;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7521 pmportinfo->pmport_sata_drive->
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7522 satadrv_state = SATA_STATE_UNKNOWN;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7523 pmportinfo->pmport_dev_type =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7524 SATA_DTYPE_UNKNOWN;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7525 continue;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7526 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7527 pmportinfo->pmport_sata_drive->
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7528 satadrv_state |= SATA_STATE_READY;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7529 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7530 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7531 mutex_exit(&cportinfo->cport_mutex);
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 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7534
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7535
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7536
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7537 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7538 * Create scsi target node for attached device, create node properties and
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7539 * attach the node.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7540 * The node could be removed if the device onlining fails.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7541 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7542 * 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
7543 * returned otherwise.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7544 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7545
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7546 static dev_info_t *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7547 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
7548 sata_address_t *sata_addr)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7549 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7550 dev_info_t *cdip = NULL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7551 int rval;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7552 char *nname = NULL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7553 char **compatible = NULL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7554 int ncompatible;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7555 struct scsi_inquiry inq;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7556 sata_device_t sata_device;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7557 sata_drive_info_t *sdinfo;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7558 int target;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7559 int i;
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 sata_device.satadev_rev = SATA_DEVICE_REV;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7562 sata_device.satadev_addr = *sata_addr;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7563
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7564 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst, sata_addr->cport)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7565
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7566 sdinfo = sata_get_device_info(sata_hba_inst, &sata_device);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7567
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7568 target = SATA_TO_SCSI_TARGET(sata_addr->cport,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7569 sata_addr->pmport, sata_addr->qual);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7570
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7571 if (sdinfo == NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7572 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7573 sata_addr->cport)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7574 SATA_LOG_D((sata_hba_inst, CE_WARN,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7575 "sata_create_target_node: no sdinfo for target %x",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7576 target));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7577 return (NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7578 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7579
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 * create scsi inquiry data, expected by
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7582 * scsi_hba_nodename_compatible_get()
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 sata_identdev_to_inquiry(sata_hba_inst, sdinfo, (uint8_t *)&inq);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7585 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, sata_addr->cport)));
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 /* determine the node name and compatible */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7588 scsi_hba_nodename_compatible_get(&inq, NULL,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7589 inq.inq_dtype, NULL, &nname, &compatible, &ncompatible);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7590
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7591 #ifdef SATA_DEBUG
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7592 if (sata_debug_flags & SATA_DBG_NODES) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7593 if (nname == NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7594 cmn_err(CE_NOTE, "sata_create_target_node: "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7595 "cannot determine nodename for target %d\n",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7596 target);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7597 } else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7598 cmn_err(CE_WARN, "sata_create_target_node: "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7599 "target %d nodename: %s\n", target, nname);
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 if (compatible == NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7602 cmn_err(CE_WARN,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7603 "sata_create_target_node: no compatible name\n");
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7604 } else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7605 for (i = 0; i < ncompatible; i++) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7606 cmn_err(CE_WARN, "sata_create_target_node: "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7607 "compatible name: %s\n", compatible[i]);
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 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7610 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7611 #endif
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 nodename can't be determined, log error and exit */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7614 if (nname == NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7615 SATA_LOG_D((sata_hba_inst, CE_WARN,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7616 "sata_create_target_node: cannot determine nodename "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7617 "for target %d\n", target));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7618 scsi_hba_nodename_compatible_free(nname, compatible);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7619 return (NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7620 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7621 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7622 * Create scsi target node
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7623 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7624 ndi_devi_alloc_sleep(dip, nname, (pnode_t)DEVI_SID_NODEID, &cdip);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7625 rval = ndi_prop_update_string(DDI_DEV_T_NONE, cdip,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7626 "device-type", "scsi");
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7627
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7628 if (rval != DDI_PROP_SUCCESS) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7629 SATA_LOG_D((sata_hba_inst, CE_WARN, "sata_create_target_node: "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7630 "updating device_type prop failed %d", rval));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7631 goto fail;
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
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7634 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7635 * Create target node properties: target & lun
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7636 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7637 rval = ndi_prop_update_int(DDI_DEV_T_NONE, cdip, "target", target);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7638 if (rval != DDI_PROP_SUCCESS) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7639 SATA_LOG_D((sata_hba_inst, CE_WARN, "sata_create_target_node: "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7640 "updating target prop failed %d", rval));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7641 goto fail;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7642 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7643 rval = ndi_prop_update_int(DDI_DEV_T_NONE, cdip, "lun", 0);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7644 if (rval != DDI_PROP_SUCCESS) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7645 SATA_LOG_D((sata_hba_inst, CE_WARN, "sata_create_target_node: "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7646 "updating target prop failed %d", rval));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7647 goto fail;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7648 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7649
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7650 /* decorate the node with compatible */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7651 if (ndi_prop_update_string_array(DDI_DEV_T_NONE, cdip, "compatible",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7652 compatible, ncompatible) != DDI_PROP_SUCCESS) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7653 SATA_LOG_D((sata_hba_inst, CE_WARN,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7654 "sata_create_target_node: FAIL compatible props cdip 0x%p",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7655 (void *)cdip));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7656 goto fail;
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 /*
1781
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
7660 * Set default write cache mode
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
7661 */
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
7662 rval = sata_init_write_cache_mode(sata_hba_inst, sdinfo);
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
7663 if (rval != SATA_SUCCESS) {
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
7664 sata_log(sata_hba_inst, CE_WARN, "sata_create_target_node: "
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
7665 "cannot set deafult write cache mode for "
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
7666 "device at port %d", sata_addr->cport);
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
7667 }
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
7668
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
7669 /*
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7670 * Now, try to attach the driver. If probing of the device fails,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7671 * the target node may be removed
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7672 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7673 rval = ndi_devi_online(cdip, NDI_ONLINE_ATTACH);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7674
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7675 scsi_hba_nodename_compatible_free(nname, compatible);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7676
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7677 if (rval == NDI_SUCCESS)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7678 return (cdip);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7679
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7680 /* target node was removed - are we sure? */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7681 return (NULL);
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 fail:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7684 scsi_hba_nodename_compatible_free(nname, compatible);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7685 ddi_prop_remove_all(cdip);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7686 rval = ndi_devi_free(cdip);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7687 if (rval != NDI_SUCCESS) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7688 SATA_LOG_D((sata_hba_inst, CE_WARN, "sata_create_target_node: "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7689 "node removal failed %d", rval));
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 sata_log(sata_hba_inst, CE_WARN, "sata_create_target_node: "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7692 "cannot create target node for device at port %d",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7693 sata_addr->cport);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7694 return (NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7695 }
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
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7698
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 * Re-probe sata port, check for a device and attach necessary info
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7701 * structures when necessary. Identify Device data is fetched, if possible.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7702 * Assumption: sata address is already validated.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7703 * SATA_SUCCESS is returned if port is re-probed sucessfully, regardless of
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7704 * the presence of a device and its type.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7705 * SATA_FAILURE is returned if one of the operations failed.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7706 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7707 static int
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7708 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
7709 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7710 sata_cport_info_t *cportinfo;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7711 sata_drive_info_t *sdinfo;
1781
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
7712 boolean_t init_device = B_FALSE;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7713 int rval;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7714
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7715 /* We only care about host sata cport for now */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7716 cportinfo = SATA_CPORT_INFO(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7717 sata_device->satadev_addr.cport);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7718 /* probe port */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7719 mutex_enter(&cportinfo->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7720 cportinfo->cport_state &= ~SATA_PORT_STATE_CLEAR_MASK;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7721 cportinfo->cport_state |= SATA_STATE_PROBING;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7722 mutex_exit(&cportinfo->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7723
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7724 rval = (*SATA_PROBE_PORT_FUNC(sata_hba_inst))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7725 (SATA_DIP(sata_hba_inst), sata_device);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7726
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7727 mutex_enter(&cportinfo->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7728 if (rval != SATA_SUCCESS) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7729 cportinfo->cport_state = SATA_PSTATE_FAILED;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7730 mutex_exit(&cportinfo->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7731 SATA_LOG_D((sata_hba_inst, CE_WARN, "sata_hba_ioctl: "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7732 "connect: port probbing failed"));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7733 return (SATA_FAILURE);
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
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7736 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7737 * update sata port state and set device type
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7738 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7739 sata_update_port_info(sata_hba_inst, sata_device);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7740 cportinfo->cport_state |= SATA_STATE_PROBED;
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 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7743 * Sanity check - Port is active? Is the link active?
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7744 * Is there any device attached?
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7745 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7746 if ((cportinfo->cport_state &
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7747 (SATA_PSTATE_SHUTDOWN | SATA_PSTATE_FAILED)) ||
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7748 (cportinfo->cport_scr.sstatus & SATA_PORT_DEVLINK_UP_MASK) !=
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7749 SATA_PORT_DEVLINK_UP) {
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 * Port in non-usable state or no link active/no device.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7752 * Free info structure if necessary (direct attached drive
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7753 * only, for now!
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7754 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7755 sdinfo = SATA_CPORTINFO_DRV_INFO(cportinfo);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7756 SATA_CPORTINFO_DRV_INFO(cportinfo) = NULL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7757 /* Add here differentiation for device attached or not */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7758 cportinfo->cport_dev_type = SATA_DTYPE_NONE;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7759 mutex_exit(&cportinfo->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7760 if (sdinfo != NULL)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7761 kmem_free(sdinfo, sizeof (sata_drive_info_t));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7762 return (SATA_SUCCESS);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7763 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7764
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7765 cportinfo->cport_state |= SATA_STATE_READY;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7766 cportinfo->cport_dev_type = sata_device->satadev_type;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7767 sdinfo = SATA_CPORTINFO_DRV_INFO(cportinfo);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7768
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 * If we are re-probing the port, there may be
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7771 * sata_drive_info structure attached
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7772 * (or sata_pm_info, if PMult is supported).
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 if (sata_device->satadev_type == SATA_DTYPE_NONE) {
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 * There is no device, so remove device info structure,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7777 * if necessary. Direct attached drive only!
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7778 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7779 SATA_CPORTINFO_DRV_INFO(cportinfo) = NULL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7780 cportinfo->cport_dev_type = SATA_DTYPE_NONE;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7781 if (sdinfo != NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7782 kmem_free(sdinfo, sizeof (sata_drive_info_t));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7783 sata_log(sata_hba_inst, CE_WARN,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7784 "SATA device detached "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7785 "from port %d", cportinfo->cport_addr.cport);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7786 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7787 mutex_exit(&cportinfo->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7788 return (SATA_SUCCESS);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7789 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7790
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7791 if (sata_device->satadev_type != SATA_DTYPE_PMULT) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7792 if (sdinfo == NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7793 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7794 * There is some device attached, but there is
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7795 * no sata_drive_info structure - allocate one
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7796 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7797 mutex_exit(&cportinfo->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7798 sdinfo = kmem_zalloc(
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7799 sizeof (sata_drive_info_t), KM_SLEEP);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7800 mutex_enter(&cportinfo->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7801 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7802 * Recheck, if port state did not change when we
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7803 * released mutex.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7804 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7805 if (cportinfo->cport_state & SATA_STATE_READY) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7806 SATA_CPORTINFO_DRV_INFO(cportinfo) = sdinfo;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7807 sdinfo->satadrv_addr = cportinfo->cport_addr;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7808 sdinfo->satadrv_addr.qual = SATA_ADDR_DCPORT;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7809 sdinfo->satadrv_type = SATA_DTYPE_UNKNOWN;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7810 sdinfo->satadrv_state = SATA_STATE_UNKNOWN;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7811 } else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7812 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7813 * Port is not in ready state, we
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7814 * cannot attach a device.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7815 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7816 mutex_exit(&cportinfo->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7817 kmem_free(sdinfo, sizeof (sata_drive_info_t));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7818 return (SATA_SUCCESS);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7819 }
1781
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
7820 /*
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
7821 * Since we are adding device, presumably new one,
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
7822 * indicate that it should be initalized,
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
7823 * as well as some internal framework states).
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
7824 */
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
7825 init_device = B_TRUE;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7826 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7827
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7828 cportinfo->cport_dev_type = SATA_DTYPE_UNKNOWN;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7829 sata_device->satadev_addr.qual = sdinfo->satadrv_addr.qual;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7830 } else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7831 cportinfo->cport_dev_type = SATA_DTYPE_UNKNOWN;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7832 mutex_exit(&cportinfo->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7833 return (SATA_SUCCESS);
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 mutex_exit(&cportinfo->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7836 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7837 * Figure out what kind of device we are really
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7838 * dealing with.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7839 */
1781
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
7840 rval = sata_probe_device(sata_hba_inst, sata_device);
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
7841
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
7842 /* Set initial device features, if necessary */
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
7843 if (rval == SATA_SUCCESS && init_device == B_TRUE) {
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
7844 if (sata_initialize_device(sata_hba_inst, sdinfo) !=
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
7845 SATA_SUCCESS)
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
7846 /* retry */
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
7847 (void) sata_initialize_device(sata_hba_inst, sdinfo);
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
7848 }
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
7849 return (rval);
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
7850 }
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
7851
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
7852 /*
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
7853 * Initialize device
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
7854 * Specified device is initialized to a default state.
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
7855 * At this point only read cache and UDMA modes are set here.
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
7856 * Write cache mode should be set when a disk is configured.
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
7857 *
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
7858 * Only SATA disks are initialized for now.
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
7859 *
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
7860 * Returns SATA_SUCCESS if all device features are set successfully,
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
7861 * SATA_FAILURE otherwise
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
7862 */
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
7863 static int
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
7864 sata_initialize_device(sata_hba_inst_t *sata_hba_inst,
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
7865 sata_drive_info_t *sdinfo)
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
7866 {
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
7867
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
7868 sata_save_drive_settings(sdinfo);
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
7869
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
7870 sdinfo->satadrv_settings |= SATA_DEV_READ_AHEAD;
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
7871
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
7872 return (sata_set_drive_features(sata_hba_inst, sdinfo, 0));
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
7873 }
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
7874
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
7875
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
7876 /*
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
7877 * Initialize write cache mode.
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
7878 *
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
7879 * The default write cache setting is provided by sata_write_cache
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
7880 * static variable:
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
7881 * 1 - enable
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
7882 * 0 - disable
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
7883 * any other value - current drive setting
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
7884 *
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
7885 * In the future, it may be overridden by the
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
7886 * disk-write-cache-enable property setting, if it is defined.
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
7887 * Returns SATA_SUCCESS if all device features are set successfully,
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
7888 * SATA_FAILURE otherwise.
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
7889 */
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
7890 static int
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
7891 sata_init_write_cache_mode(sata_hba_inst_t *sata_hba_inst,
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
7892 sata_drive_info_t *sdinfo)
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
7893 {
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
7894 if (sata_write_cache == 1)
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
7895 sdinfo->satadrv_settings |= SATA_DEV_WRITE_CACHE;
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
7896 else if (sata_write_cache == 0)
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
7897 sdinfo->satadrv_settings &= ~SATA_DEV_WRITE_CACHE;
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
7898 /*
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
7899 * When sata_write_cache value is not 0 or 1,
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
7900 * a current setting of the drive's write cache is used.
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
7901 *
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
7902 * Now set the write cache mode
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
7903 */
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
7904 return (sata_set_drive_features(sata_hba_inst, sdinfo, 0));
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7905 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7906
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 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7909 * Validate sata address.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7910 * Specified cport, pmport and qualifier has to match
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7911 * passed sata_scsi configuration info.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7912 * The presence of an attached device is not verified.
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 * Returns 0 when address is valid, -1 otherwise.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7915 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7916 static int
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7917 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
7918 int pmport, int qual)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7919 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7920 if (qual == SATA_ADDR_DCPORT && pmport != 0)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7921 goto invalid_address;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7922 if (cport >= SATA_NUM_CPORTS(sata_hba_inst))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7923 goto invalid_address;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7924 if ((qual == SATA_ADDR_DPMPORT || qual == SATA_ADDR_PMPORT) &&
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7925 ((SATA_CPORT_DEV_TYPE(sata_hba_inst, cport) != SATA_DTYPE_PMULT) ||
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7926 (SATA_PMULT_INFO(sata_hba_inst, cport) == NULL) ||
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7927 (pmport >= SATA_NUM_PMPORTS(sata_hba_inst, cport))))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7928 goto invalid_address;
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 return (0);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7931
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7932 invalid_address:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7933 return (-1);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7934
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7935 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7936
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7937 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7938 * Validate scsi address
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7939 * SCSI target address is translated into SATA cport/pmport and compared
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7940 * with a controller port/device configuration. LUN has to be 0.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7941 * Returns 0 if a scsi target refers to an attached device,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7942 * returns 1 if address is valid but device is not attached,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7943 * returns -1 if bad address or device is of an unsupported type.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7944 * Upon return sata_device argument is set.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7945 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7946 static int
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7947 sata_validate_scsi_address(sata_hba_inst_t *sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7948 struct scsi_address *ap, sata_device_t *sata_device)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7949 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7950 int cport, pmport, qual, rval;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7951
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7952 rval = -1; /* Invalid address */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7953 if (ap->a_lun != 0)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7954 goto out;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7955
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7956 qual = SCSI_TO_SATA_ADDR_QUAL(ap->a_target);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7957 cport = SCSI_TO_SATA_CPORT(ap->a_target);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7958 pmport = SCSI_TO_SATA_PMPORT(ap->a_target);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7959
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7960 if (qual != SATA_ADDR_DCPORT && qual != SATA_ADDR_DPMPORT)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7961 goto out;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7962
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7963 if (sata_validate_sata_address(sata_hba_inst, cport, pmport, qual) ==
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7964 0) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7965
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7966 sata_cport_info_t *cportinfo;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7967 sata_pmult_info_t *pmultinfo;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7968 sata_drive_info_t *sdinfo = NULL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7969
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7970 rval = 1; /* Valid sata address */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7971
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7972 cportinfo = SATA_CPORT_INFO(sata_hba_inst, cport);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7973 if (qual == SATA_ADDR_DCPORT) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7974 if (cportinfo == NULL ||
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7975 cportinfo->cport_dev_type == SATA_DTYPE_NONE)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7976 goto out;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7977
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7978 if (cportinfo->cport_dev_type == SATA_DTYPE_PMULT ||
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7979 (cportinfo->cport_dev_type &
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7980 SATA_VALID_DEV_TYPE) == 0) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7981 rval = -1;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7982 goto out;
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 sdinfo = SATA_CPORTINFO_DRV_INFO(cportinfo);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7985
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7986 } else if (qual == SATA_ADDR_DPMPORT) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7987 pmultinfo = SATA_CPORTINFO_PMULT_INFO(cportinfo);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7988 if (pmultinfo == NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7989 rval = -1;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7990 goto out;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7991 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7992 if (SATA_PMPORT_INFO(sata_hba_inst, cport, pmport) ==
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7993 NULL ||
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7994 SATA_PMPORT_DEV_TYPE(sata_hba_inst, cport,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7995 pmport) == SATA_DTYPE_NONE)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7996 goto out;
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 sdinfo = SATA_PMPORT_DRV_INFO(sata_hba_inst, cport,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
7999 pmport);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8000 } else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8001 rval = -1;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8002 goto out;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8003 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8004 if ((sdinfo == NULL) ||
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8005 (sdinfo->satadrv_type & SATA_VALID_DEV_TYPE) == 0)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8006 goto out;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8007
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8008 sata_device->satadev_type = sdinfo->satadrv_type;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8009 sata_device->satadev_addr.qual = qual;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8010 sata_device->satadev_addr.cport = cport;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8011 sata_device->satadev_addr.pmport = pmport;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8012 sata_device->satadev_rev = SATA_DEVICE_REV_1;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8013 return (0);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8014 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8015 out:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8016 if (rval == 1) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8017 SATADBG2(SATA_DBG_SCSI_IF, sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8018 "sata_validate_scsi_address: no valid target %x lun %x",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8019 ap->a_target, ap->a_lun);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8020 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8021 return (rval);
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
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8024 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8025 * Find dip corresponding to passed device number
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 * 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
8028 * Returns dip is device is found.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8029 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8030 static dev_info_t *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8031 sata_devt_to_devinfo(dev_t dev)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8032 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8033 dev_info_t *dip;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8034 #ifndef __lock_lint
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8035 struct devnames *dnp;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8036 major_t major = getmajor(dev);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8037 int instance = SATA_MINOR2INSTANCE(getminor(dev));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8038
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8039 if (major >= devcnt)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8040 return (NULL);
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 dnp = &devnamesp[major];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8043 LOCK_DEV_OPS(&(dnp->dn_lock));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8044 dip = dnp->dn_head;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8045 while (dip && (ddi_get_instance(dip) != instance)) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8046 dip = ddi_get_next(dip);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8047 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8048 UNLOCK_DEV_OPS(&(dnp->dn_lock));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8049 #endif
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8050
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8051 return (dip);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8052 }
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 * Probe device.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8057 * This function issues Identify Device command and initialize local
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8058 * sata_drive_info structure if the device can be identified.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8059 * The device type is determined by examining Identify Device
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8060 * command response.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8061 * If the sata_hba_inst has linked drive info structure for this
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8062 * device address, the Identify Device data is stored into sata_drive_info
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8063 * structure linked to the port info structure.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8064 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8065 * 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
8066 * by sata_hba_inst structure.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8067 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8068 * Returns: SATA_SUCCESS if device type was successfully probed and port-linked
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8069 * drive info structure was updated;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8070 * SATA_FAILURE if there is no device, or device was not probed
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8071 * successully.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8072 * 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
8073 * fields are set to unknown.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8074 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8075 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8076
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8077 static int
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8078 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
8079 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8080 sata_drive_info_t *sdinfo;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8081 sata_drive_info_t new_sdinfo; /* local drive info struct */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8082 int retry_cnt;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8083
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8084 ASSERT((SATA_CPORT_STATE(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8085 sata_device->satadev_addr.cport) &
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8086 (SATA_STATE_PROBED | SATA_STATE_READY)) != 0);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8087
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8088 sata_device->satadev_type = SATA_DTYPE_NONE;
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 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8091 sata_device->satadev_addr.cport)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8092
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8093 /* Get pointer to port-linked sata device info structure */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8094 sdinfo = sata_get_device_info(sata_hba_inst, sata_device);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8095 if (sdinfo != NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8096 sdinfo->satadrv_state &=
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8097 ~(SATA_STATE_PROBED | SATA_STATE_READY);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8098 sdinfo->satadrv_state |= SATA_STATE_PROBING;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8099 } else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8100 /* No device to probe */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8101 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8102 sata_device->satadev_addr.cport)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8103 sata_device->satadev_type = SATA_DTYPE_NONE;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8104 sata_device->satadev_state = SATA_STATE_UNKNOWN;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8105 return (SATA_FAILURE);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8106 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8107 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8108 * Need to issue both types of identify device command and
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8109 * determine device type by examining retreived data/status.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8110 * First, ATA Identify Device.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8111 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8112 bzero(&new_sdinfo, sizeof (sata_drive_info_t));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8113 new_sdinfo.satadrv_addr = sata_device->satadev_addr;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8114 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8115 sata_device->satadev_addr.cport)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8116 for (retry_cnt = 0; retry_cnt <= SATA_DEVICE_IDENTIFY_RETRY;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8117 retry_cnt++) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8118 new_sdinfo.satadrv_type = SATA_DTYPE_ATADISK;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8119 if (sata_identify_device(sata_hba_inst, &new_sdinfo) == 0) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8120 /* Got something responding to ATA Identify Device */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8121 sata_device->satadev_type = new_sdinfo.satadrv_type;
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 if (SATA_FEATURES(sata_hba_inst) & SATA_CTLF_ATAPI) {
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 * HBA supports ATAPI - try to issue Identify Packet
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8127 * Device command.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8128 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8129 new_sdinfo.satadrv_type = SATA_DTYPE_ATAPICD;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8130 if (sata_identify_device(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8131 &new_sdinfo) == 0) {
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 * Got something responding to Identify Packet
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8134 * Device cmd.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8135 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8136 /* Set UDMA mode here as well ? - phase 2 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8137 sata_device->satadev_type =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8138 new_sdinfo.satadrv_type;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8139 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8140 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8141 }
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 if (retry_cnt <= SATA_DEVICE_IDENTIFY_RETRY) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8144 /* save device info, if possible */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8145 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8146 sata_device->satadev_addr.cport)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8147 sdinfo = sata_get_device_info(sata_hba_inst, sata_device);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8148 if (sdinfo == NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8149 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8150 sata_device->satadev_addr.cport)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8151 return (SATA_FAILURE);
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 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8154 * Copy drive info into the port-linked drive info structure.
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 *sdinfo = new_sdinfo;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8157 sdinfo->satadrv_state &= ~SATA_STATE_PROBING;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8158 sdinfo->satadrv_state |= SATA_STATE_PROBED;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8159 if (sata_device->satadev_addr.qual == SATA_ADDR_DCPORT)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8160 SATA_CPORT_DEV_TYPE(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8161 sata_device->satadev_addr.cport) =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8162 sdinfo->satadrv_type;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8163 else /* SATA_ADDR_DPMPORT */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8164 SATA_PMPORT_DEV_TYPE(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8165 sata_device->satadev_addr.cport,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8166 sata_device->satadev_addr.pmport) =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8167 sdinfo->satadrv_type;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8168 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8169 sata_device->satadev_addr.cport)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8170 return (SATA_SUCCESS);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8171 }
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 failure:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8174 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8175 * Looks like we cannot determine the device type.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8176 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8177 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8178 sata_device->satadev_addr.cport)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8179 sdinfo = sata_get_device_info(sata_hba_inst, sata_device);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8180 if (sdinfo != NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8181 sata_device->satadev_type = SATA_DTYPE_UNKNOWN;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8182 sdinfo->satadrv_type = SATA_DTYPE_UNKNOWN;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8183 sdinfo->satadrv_state &= ~SATA_STATE_PROBING;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8184 sdinfo->satadrv_state = SATA_STATE_PROBED;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8185 if (sata_device->satadev_addr.qual == SATA_ADDR_DCPORT)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8186 SATA_CPORT_DEV_TYPE(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8187 sata_device->satadev_addr.cport) =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8188 SATA_DTYPE_UNKNOWN;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8189 else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8190 /* SATA_ADDR_DPMPORT */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8191 if ((SATA_PMULT_INFO(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8192 sata_device->satadev_addr.cport) != NULL) &&
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8193 (SATA_PMPORT_INFO(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8194 sata_device->satadev_addr.cport,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8195 sata_device->satadev_addr.pmport) != NULL))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8196 SATA_PMPORT_DEV_TYPE(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8197 sata_device->satadev_addr.cport,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8198 sata_device->satadev_addr.pmport) =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8199 SATA_DTYPE_UNKNOWN;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8200 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8201 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8202 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8203 sata_device->satadev_addr.cport)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8204 return (SATA_FAILURE);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8205 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8206
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8207
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8208 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8209 * Get pointer to sata_drive_info structure.
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 * The sata_device has to contain address (cport, pmport and qualifier) for
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8212 * specified sata_scsi structure.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8213 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8214 * Returns NULL if device address is not valid for this HBA configuration.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8215 * Otherwise, returns a pointer to sata_drive_info structure.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8216 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8217 * This function should be called with a port mutex held.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8218 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8219 static sata_drive_info_t *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8220 sata_get_device_info(sata_hba_inst_t *sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8221 sata_device_t *sata_device)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8222 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8223 uint8_t cport = sata_device->satadev_addr.cport;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8224 uint8_t pmport = sata_device->satadev_addr.pmport;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8225 uint8_t qual = sata_device->satadev_addr.qual;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8226
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8227 if (cport >= SATA_NUM_CPORTS(sata_hba_inst))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8228 return (NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8229
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8230 if (!(SATA_CPORT_STATE(sata_hba_inst, cport) &
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8231 (SATA_STATE_PROBED | SATA_STATE_READY)))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8232 /* Port not probed yet */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8233 return (NULL);
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 if (SATA_CPORT_DEV_TYPE(sata_hba_inst, cport) == SATA_DTYPE_NONE)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8236 return (NULL);
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 if (qual == SATA_ADDR_DCPORT) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8239 /* Request for a device on a controller port */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8240 if (SATA_CPORT_DEV_TYPE(sata_hba_inst, cport) ==
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8241 SATA_DTYPE_PMULT)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8242 /* Port multiplier attached */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8243 return (NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8244 return (SATA_CPORT_DRV_INFO(sata_hba_inst, cport));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8245 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8246 if (qual == SATA_ADDR_DPMPORT) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8247 if (SATA_CPORT_DEV_TYPE(sata_hba_inst, cport) !=
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8248 SATA_DTYPE_PMULT)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8249 return (NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8250
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8251 if (pmport > SATA_NUM_PMPORTS(sata_hba_inst, cport))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8252 return (NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8253
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8254 return (SATA_PMPORT_DRV_INFO(sata_hba_inst, cport, pmport));
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
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8257 /* we should not get here */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8258 return (NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8259 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8260
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8261
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8262 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8263 * sata_identify_device.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8264 * Send Identify Device command to SATA HBA driver.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8265 * If command executes successfully, update sata_drive_info structure pointed
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8266 * to by sdinfo argument, including Identify Device data.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8267 * If command fails, invalidate data in sata_drive_info.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8268 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8269 * Cannot be called from interrupt level.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8270 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8271 * Returns 0 if device was identified as supported device, -1 otherwise.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8272 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8273 static int
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8274 sata_identify_device(sata_hba_inst_t *sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8275 sata_drive_info_t *sdinfo)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8276 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8277 uint16_t cfg_word;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8278 int i;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8279
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8280 /* fetch device identify data */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8281 if (sata_fetch_device_identify_data(sata_hba_inst, sdinfo) != 0)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8282 goto fail_unknown;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8283
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8284 cfg_word = sdinfo->satadrv_id.ai_config;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8285 if (sdinfo->satadrv_type == SATA_DTYPE_ATADISK &&
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8286 (cfg_word & SATA_ATA_TYPE_MASK) != SATA_ATA_TYPE) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8287 /* Change device type to reflect Identify Device data */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8288 if (((cfg_word & SATA_ATAPI_TYPE_MASK) ==
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8289 SATA_ATAPI_TYPE) &&
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8290 ((cfg_word & SATA_ATAPI_ID_DEV_TYPE) ==
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8291 SATA_ATAPI_CDROM_DEV)) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8292 sdinfo->satadrv_type = SATA_DTYPE_ATAPICD;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8293 } else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8294 sdinfo->satadrv_type = SATA_DTYPE_UNKNOWN;
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 } else if (sdinfo->satadrv_type == SATA_DTYPE_ATAPICD &&
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8297 (((cfg_word & SATA_ATAPI_TYPE_MASK) != SATA_ATAPI_TYPE) ||
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8298 ((cfg_word & SATA_ATAPI_ID_DEV_TYPE) != SATA_ATAPI_CDROM_DEV))) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8299 /* Change device type to reflect Identify Device data ! */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8300 if ((sdinfo->satadrv_id.ai_config & SATA_ATA_TYPE_MASK) ==
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8301 SATA_ATA_TYPE) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8302 sdinfo->satadrv_type = SATA_DTYPE_ATADISK;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8303 } else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8304 sdinfo->satadrv_type = SATA_DTYPE_UNKNOWN;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8305 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8306 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8307 if (sdinfo->satadrv_type == SATA_DTYPE_ATADISK) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8308 if (sdinfo->satadrv_capacity == 0) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8309 /* Non-LBA disk. Too bad... */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8310 sata_log(sata_hba_inst, CE_WARN,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8311 "SATA disk device at port %d does not support LBA",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8312 sdinfo->satadrv_addr.cport);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8313 goto fail_unknown;
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 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8316 /* Check for Ultra DMA modes 6 through 0 being supported */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8317 for (i = 6; i >= 0; --i) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8318 if (sdinfo->satadrv_id.ai_ultradma & (1 << i))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8319 break;
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 * 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
8323 * higher are not supported by the device, fail this
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8324 * device.
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 if (i < 4) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8327 /* No required Ultra DMA mode supported */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8328 sata_log(sata_hba_inst, CE_WARN,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8329 "SATA disk device at port %d does not support UDMA "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8330 "mode 4 or higher", sdinfo->satadrv_addr.cport);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8331 SATA_LOG_D((sata_hba_inst, CE_WARN,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8332 "mode 4 or higher required, %d supported", i));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8333 goto fail_unknown;
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
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8336 return (0);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8337
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8338 fail_unknown:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8339 /* Invalidate sata_drive_info ? */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8340 sdinfo->satadrv_type = SATA_DTYPE_UNKNOWN;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8341 sdinfo->satadrv_state = SATA_STATE_UNKNOWN;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8342 return (-1);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8343 }
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 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8346 * Log/display device information
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8347 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8348 static void
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8349 sata_show_drive_info(sata_hba_inst_t *sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8350 sata_drive_info_t *sdinfo)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8351 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8352 int valid_version;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8353 char msg_buf[MAXPATHLEN];
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 /* Show HBA path */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8356 (void) ddi_pathname(SATA_DIP(sata_hba_inst), msg_buf);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8357
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8358 cmn_err(CE_CONT, "?%s :\n", msg_buf);
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 if (sdinfo->satadrv_type == SATA_DTYPE_UNKNOWN) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8361 (void) sprintf(msg_buf,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8362 "Unsupported SATA device type (cfg 0x%x) at ",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8363 sdinfo->satadrv_id.ai_config);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8364 } else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8365 (void) sprintf(msg_buf, "SATA %s device at",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8366 sdinfo->satadrv_type == SATA_DTYPE_ATADISK ?
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8367 "disk":"CD/DVD (ATAPI)");
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 if (sdinfo->satadrv_addr.qual == SATA_ADDR_DCPORT)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8370 cmn_err(CE_CONT, "?\t%s port %d\n",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8371 msg_buf, sdinfo->satadrv_addr.cport);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8372 else
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8373 cmn_err(CE_CONT, "?\t%s port %d pmport %d\n",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8374 msg_buf, sdinfo->satadrv_addr.cport,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8375 sdinfo->satadrv_addr.pmport);
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 bcopy(&sdinfo->satadrv_id.ai_model, msg_buf,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8378 sizeof (sdinfo->satadrv_id.ai_model));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8379 swab(msg_buf, msg_buf, sizeof (sdinfo->satadrv_id.ai_model));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8380 msg_buf[sizeof (sdinfo->satadrv_id.ai_model)] = '\0';
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8381 cmn_err(CE_CONT, "?\tmodel %s\n", msg_buf);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8382
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8383 bcopy(&sdinfo->satadrv_id.ai_fw, msg_buf,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8384 sizeof (sdinfo->satadrv_id.ai_fw));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8385 swab(msg_buf, msg_buf, sizeof (sdinfo->satadrv_id.ai_fw));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8386 msg_buf[sizeof (sdinfo->satadrv_id.ai_fw)] = '\0';
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8387 cmn_err(CE_CONT, "?\tfirmware %s\n", msg_buf);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8388
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8389 bcopy(&sdinfo->satadrv_id.ai_drvser, msg_buf,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8390 sizeof (sdinfo->satadrv_id.ai_drvser));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8391 swab(msg_buf, msg_buf, sizeof (sdinfo->satadrv_id.ai_drvser));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8392 msg_buf[sizeof (sdinfo->satadrv_id.ai_drvser)] = '\0';
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8393 cmn_err(CE_CONT, "?\tserial number %s\n", msg_buf);
1258
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 #ifdef SATA_DEBUG
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8396 if (sdinfo->satadrv_id.ai_majorversion != 0 &&
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8397 sdinfo->satadrv_id.ai_majorversion != 0xffff) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8398 int i;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8399 for (i = 14; i >= 2; i--) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8400 if (sdinfo->satadrv_id.ai_majorversion & (1 << i)) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8401 valid_version = i;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8402 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8403 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8404 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8405 cmn_err(CE_CONT,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8406 "?\tATA/ATAPI-%d supported, majver 0x%x minver 0x%x\n",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8407 valid_version,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8408 sdinfo->satadrv_id.ai_majorversion,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8409 sdinfo->satadrv_id.ai_minorversion);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8410 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8411 #endif
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8412 /* Log some info */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8413 cmn_err(CE_CONT, "?\tsupported features:\n");
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8414 msg_buf[0] = '\0';
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8415 if (sdinfo->satadrv_features_support & SATA_DEV_F_LBA48)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8416 (void) strlcat(msg_buf, "48-bit LBA", MAXPATHLEN);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8417 else if (sdinfo->satadrv_features_support & SATA_DEV_F_LBA28)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8418 (void) strlcat(msg_buf, "28-bit LBA", MAXPATHLEN);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8419 if (sdinfo->satadrv_features_support & SATA_DEV_F_DMA)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8420 (void) strlcat(msg_buf, ", DMA", MAXPATHLEN);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8421 if (sdinfo->satadrv_features_support & SATA_DEV_F_NCQ)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8422 (void) strlcat(msg_buf, ", Native Command Queueing",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8423 MAXPATHLEN);
1940
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
8424 if (sdinfo->satadrv_features_support & SATA_DEV_F_TCQ)
2553
624f674f2ad8 6430966 SATA NCQ support is needed in SATA framework and hba drivers
ls24207
parents: 2539
diff changeset
8425 (void) strlcat(msg_buf, ", Legacy Tagged Queuing", MAXPATHLEN);
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8426 if ((sdinfo->satadrv_id.ai_cmdset82 & SATA_SMART_SUPPORTED) &&
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8427 (sdinfo->satadrv_id.ai_features85 & SATA_SMART_ENABLED))
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8428 (void) strlcat(msg_buf, ", SMART", MAXPATHLEN);
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8429 if ((sdinfo->satadrv_id.ai_cmdset84 & SATA_SMART_SELF_TEST_SUPPORTED) &&
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8430 (sdinfo->satadrv_id.ai_features87 & SATA_SMART_SELF_TEST_SUPPORTED))
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
8431 (void) strlcat(msg_buf, ", SMART self-test", MAXPATHLEN);
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8432 cmn_err(CE_CONT, "?\t %s\n", msg_buf);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8433 if (sdinfo->satadrv_features_support & SATA_DEV_F_SATA2)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8434 cmn_err(CE_CONT, "?\tSATA1 & SATA2 compatible\n");
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8435 else if (sdinfo->satadrv_features_support & SATA_DEV_F_SATA1)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8436 cmn_err(CE_CONT, "?\tSATA1 compatible\n");
2177
7fd6af926424 6430603 Misc marvell88sx driver clean up
ls24207
parents: 2071
diff changeset
8437 if (sdinfo->satadrv_features_support & SATA_DEV_F_TCQ) {
7fd6af926424 6430603 Misc marvell88sx driver clean up
ls24207
parents: 2071
diff changeset
8438 cmn_err(CE_CONT, "?\tQueue depth %d\n",
7fd6af926424 6430603 Misc marvell88sx driver clean up
ls24207
parents: 2071
diff changeset
8439 sdinfo->satadrv_queue_depth);
7fd6af926424 6430603 Misc marvell88sx driver clean up
ls24207
parents: 2071
diff changeset
8440 }
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8441
2553
624f674f2ad8 6430966 SATA NCQ support is needed in SATA framework and hba drivers
ls24207
parents: 2539
diff changeset
8442 if (sdinfo->satadrv_features_support &
624f674f2ad8 6430966 SATA NCQ support is needed in SATA framework and hba drivers
ls24207
parents: 2539
diff changeset
8443 (SATA_DEV_F_TCQ | SATA_DEV_F_NCQ)) {
624f674f2ad8 6430966 SATA NCQ support is needed in SATA framework and hba drivers
ls24207
parents: 2539
diff changeset
8444 (void) sprintf(msg_buf, "\tqueue depth %d\n",
624f674f2ad8 6430966 SATA NCQ support is needed in SATA framework and hba drivers
ls24207
parents: 2539
diff changeset
8445 sdinfo->satadrv_queue_depth);
624f674f2ad8 6430966 SATA NCQ support is needed in SATA framework and hba drivers
ls24207
parents: 2539
diff changeset
8446 cmn_err(CE_CONT, "?%s", msg_buf);
624f674f2ad8 6430966 SATA NCQ support is needed in SATA framework and hba drivers
ls24207
parents: 2539
diff changeset
8447 }
624f674f2ad8 6430966 SATA NCQ support is needed in SATA framework and hba drivers
ls24207
parents: 2539
diff changeset
8448
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8449 #ifdef __i386
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8450 (void) sprintf(msg_buf, "\tcapacity = %llu sectors\n",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8451 sdinfo->satadrv_capacity);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8452 #else
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8453 (void) sprintf(msg_buf, "\tcapacity = %lu sectors\n",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8454 sdinfo->satadrv_capacity);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8455 #endif
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8456 cmn_err(CE_CONT, "?%s", msg_buf);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8457 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8458
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8459
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8460 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8461 * sata_save_drive_settings extracts current setting of the device and stores
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8462 * 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
8463 * after the device reset.
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 * 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
8466 * device supports these features at all.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8467 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8468 static void
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8469 sata_save_drive_settings(sata_drive_info_t *sdinfo)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8470 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8471 if (!(sdinfo->satadrv_id.ai_cmdset82 & SATA_LOOK_AHEAD) &&
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8472 !(sdinfo->satadrv_id.ai_cmdset82 & SATA_WRITE_CACHE)) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8473 /* None of the features is supported - do nothing */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8474 return;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8475 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8476
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8477 /* Current setting of Read Ahead (and Read Cache) */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8478 if (sdinfo->satadrv_id.ai_features85 & SATA_LOOK_AHEAD)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8479 sdinfo->satadrv_settings |= SATA_DEV_READ_AHEAD;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8480 else
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8481 sdinfo->satadrv_settings &= ~SATA_DEV_READ_AHEAD;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8482
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8483 /* Current setting of Write Cache */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8484 if (sdinfo->satadrv_id.ai_features85 & SATA_WRITE_CACHE)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8485 sdinfo->satadrv_settings |= SATA_DEV_WRITE_CACHE;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8486 else
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8487 sdinfo->satadrv_settings &= ~SATA_DEV_WRITE_CACHE;
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
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8490
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8491 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8492 * sata_check_capacity function determines a disk capacity
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8493 * and addressing mode (LBA28/LBA48) by examining a disk identify device data.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8494 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8495 * 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
8496 * this function is not called.
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 * 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
8499 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8500 static uint64_t
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8501 sata_check_capacity(sata_drive_info_t *sdinfo)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8502 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8503 uint64_t capacity = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8504 int i;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8505
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8506 if (sdinfo->satadrv_type != SATA_DTYPE_ATADISK ||
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8507 !sdinfo->satadrv_id.ai_cap & SATA_LBA_SUPPORT)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8508 /* Capacity valid only for LBA-addressable disk devices */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8509 return (0);
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 ((sdinfo->satadrv_id.ai_validinfo & SATA_VALIDINFO_88) &&
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8512 (sdinfo->satadrv_id.ai_cmdset83 & SATA_EXT48) &&
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8513 (sdinfo->satadrv_id.ai_features86 & SATA_EXT48)) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8514 /* LBA48 mode supported and enabled */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8515 sdinfo->satadrv_features_support |= SATA_DEV_F_LBA48 |
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8516 SATA_DEV_F_LBA28;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8517 for (i = 3; i >= 0; --i) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8518 capacity <<= 16;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8519 capacity += sdinfo->satadrv_id.ai_addrsecxt[i];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8520 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8521 } else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8522 capacity = sdinfo->satadrv_id.ai_addrsec[1];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8523 capacity <<= 16;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8524 capacity += sdinfo->satadrv_id.ai_addrsec[0];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8525 if (capacity >= 0x1000000)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8526 /* LBA28 mode */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8527 sdinfo->satadrv_features_support |= SATA_DEV_F_LBA28;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8528 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8529 return (capacity);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8530 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8531
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8532
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8533 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8534 * Allocate consistent buffer for DMA transfer
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 * 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
8537 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8538 * Returns pointer to allocated buffer structure, or NULL if allocation failed.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8539 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8540 static struct buf *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8541 sata_alloc_local_buffer(sata_pkt_txlate_t *spx, int len)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8542 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8543 struct scsi_address ap;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8544 struct buf *bp;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8545 ddi_dma_attr_t cur_dma_attr;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8546
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8547 ASSERT(spx->txlt_sata_pkt != NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8548 ap.a_hba_tran = spx->txlt_sata_hba_inst->satahba_scsi_tran;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8549 ap.a_target = SATA_TO_SCSI_TARGET(
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8550 spx->txlt_sata_pkt->satapkt_device.satadev_addr.cport,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8551 spx->txlt_sata_pkt->satapkt_device.satadev_addr.pmport,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8552 spx->txlt_sata_pkt->satapkt_device.satadev_addr.qual);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8553 ap.a_lun = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8554
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8555 bp = scsi_alloc_consistent_buf(&ap, NULL, len,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8556 B_READ, SLEEP_FUNC, NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8557
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8558 if (bp != NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8559 /* Allocate DMA resources for this buffer */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8560 spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp = bp;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8561 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8562 * We use a local version of the dma_attr, to account
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8563 * for a device addressing limitations.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8564 * sata_adjust_dma_attr() will handle sdinfo == NULL which
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8565 * will cause dma attributes to be adjusted to a lowest
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8566 * acceptable level.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8567 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8568 sata_adjust_dma_attr(NULL,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8569 SATA_DMA_ATTR(spx->txlt_sata_hba_inst), &cur_dma_attr);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8570
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8571 if (sata_dma_buf_setup(spx, PKT_CONSISTENT,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8572 SLEEP_FUNC, NULL, &cur_dma_attr) != DDI_SUCCESS) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8573 scsi_free_consistent_buf(bp);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8574 spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp = NULL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8575 bp = 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 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8578 return (bp);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8579 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8580
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 * Release local buffer (consistent buffer for DMA transfer) allocated
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8583 * via sata_alloc_local_buffer().
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8584 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8585 static void
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8586 sata_free_local_buffer(sata_pkt_txlate_t *spx)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8587 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8588 ASSERT(spx->txlt_sata_pkt != NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8589 ASSERT(spx->txlt_dma_cookie_list != NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8590 ASSERT(spx->txlt_dma_cookie_list_len != 0);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8591 ASSERT(spx->txlt_buf_dma_handle != NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8592 ASSERT(spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp != NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8593
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8594 spx->txlt_sata_pkt->satapkt_cmd.satacmd_num_dma_cookies = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8595 spx->txlt_sata_pkt->satapkt_cmd.satacmd_dma_cookie_list = NULL;
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 /* Free DMA resources */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8598 (void) ddi_dma_unbind_handle(spx->txlt_buf_dma_handle);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8599 ddi_dma_free_handle(&spx->txlt_buf_dma_handle);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8600 spx->txlt_buf_dma_handle = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8601
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8602 kmem_free(spx->txlt_dma_cookie_list,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8603 spx->txlt_dma_cookie_list_len * sizeof (ddi_dma_cookie_t));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8604 spx->txlt_dma_cookie_list = NULL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8605 spx->txlt_dma_cookie_list_len = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8606
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8607 /* Free buffer */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8608 scsi_free_consistent_buf(spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8609 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8610
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8611
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8612
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8613
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 * Allocate sata_pkt
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8616 * Pkt structure version and embedded strcutures version are initialized.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8617 * sata_pkt and sata_pkt_txlate structures are cross-linked.
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 * 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
8620 * callback argument determines if it can sleep or not.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8621 * Hence, it should not be called from interrupt context.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8622 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8623 * If successful, non-NULL pointer to a sata pkt is returned.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8624 * Upon failure, NULL pointer is returned.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8625 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8626 static sata_pkt_t *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8627 sata_pkt_alloc(sata_pkt_txlate_t *spx, int (*callback)(caddr_t))
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 sata_pkt_t *spkt;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8630 int kmsflag;
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 kmsflag = (callback == SLEEP_FUNC) ? KM_SLEEP : KM_NOSLEEP;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8633 spkt = kmem_zalloc(sizeof (sata_pkt_t), kmsflag);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8634 if (spkt == NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8635 SATA_LOG_D((spx->txlt_sata_hba_inst, CE_WARN,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8636 "sata_pkt_alloc: failed"));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8637 return (NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8638 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8639 spkt->satapkt_rev = SATA_PKT_REV;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8640 spkt->satapkt_cmd.satacmd_rev = SATA_CMD_REV;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8641 spkt->satapkt_device.satadev_rev = SATA_DEVICE_REV;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8642 spkt->satapkt_framework_private = spx;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8643 spx->txlt_sata_pkt = spkt;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8644 return (spkt);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8645 }
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 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8648 * Free sata pkt allocated via sata_pkt_alloc()
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8649 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8650 static void
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8651 sata_pkt_free(sata_pkt_txlate_t *spx)
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 ASSERT(spx->txlt_sata_pkt != NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8654 ASSERT(spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp == NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8655 kmem_free(spx->txlt_sata_pkt, sizeof (sata_pkt_t));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8656 spx->txlt_sata_pkt = NULL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8657 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8658
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8659
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8660 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8661 * Adjust DMA attributes.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8662 * 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
8663 * from 8 bits to 16 bits, depending on a command being used.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8664 * Limiting max block count arbitrarily to 256 for all read/write
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8665 * commands may affects performance, so check both the device and
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8666 * controller capability before adjusting dma attributes.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8667 * For ATAPI CD/DVD dma granularity has to be adjusted as well,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8668 * because these devices support block size of 2k rather
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8669 * then 512 bytes.
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 void
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8672 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
8673 ddi_dma_attr_t *adj_dma_attr)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8674 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8675 uint32_t count_max;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8676
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8677 /* Copy original attributes */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8678 *adj_dma_attr = *dma_attr;
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 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8681 * Things to consider: device addressing capability,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8682 * "excessive" controller DMA capabilities.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8683 * If a device is being probed/initialized, there are
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8684 * no device info - use default limits then.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8685 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8686 if (sdinfo == NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8687 count_max = dma_attr->dma_attr_granular * 0x100;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8688 if (dma_attr->dma_attr_count_max > count_max)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8689 adj_dma_attr->dma_attr_count_max = count_max;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8690 if (dma_attr->dma_attr_maxxfer > count_max)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8691 adj_dma_attr->dma_attr_maxxfer = count_max;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8692 return;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8693 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8694 if (sdinfo->satadrv_type == SATA_DTYPE_ATAPICD) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8695 /* arbitrarily modify controller dma granularity */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8696 adj_dma_attr->dma_attr_granular = SATA_ATAPI_SECTOR_SIZE;
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
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8699 if (sdinfo->satadrv_features_support & (SATA_DEV_F_LBA48)) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8700 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8701 * 16-bit sector count may be used - we rely on
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8702 * the assumption that only read and write cmds
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8703 * will request more than 256 sectors worth of data
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8704 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8705 count_max = adj_dma_attr->dma_attr_granular * 0x10000;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8706 } else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8707 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8708 * 8-bit sector count will be used - default limits
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8709 * for dma attributes
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8710 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8711 count_max = adj_dma_attr->dma_attr_granular * 0x100;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8712 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8713
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8714
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8715 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8716 * Adjust controler dma attributes, if necessary
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 if (dma_attr->dma_attr_count_max > count_max)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8719 adj_dma_attr->dma_attr_count_max = count_max;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8720 if (dma_attr->dma_attr_maxxfer > count_max)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8721 adj_dma_attr->dma_attr_maxxfer = count_max;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8722 }
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
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8725 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8726 * Allocate DMA resources for the buffer
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8727 * This function handles initial DMA resource allocation as well as
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8728 * 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
8729 * until all DMA cookies in the DMA window are processed.
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 * Returns DDI_SUCCESS upon successful operation,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8732 * returns failure code returned by failing commands or DDI_FAILURE when
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8733 * internal cleanup failed.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8734 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8735 static int
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8736 sata_dma_buf_setup(sata_pkt_txlate_t *spx, int flags,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8737 int (*callback)(caddr_t), caddr_t arg,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8738 ddi_dma_attr_t *cur_dma_attr)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8739 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8740 int rval;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8741 ddi_dma_cookie_t cookie;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8742 off_t offset;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8743 size_t size;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8744 int max_sg_len, req_sg_len, i;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8745 uint_t dma_flags;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8746 struct buf *bp;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8747 uint64_t max_txfer_len;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8748 uint64_t cur_txfer_len;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8749
2539
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
8750
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8751 ASSERT(spx->txlt_sata_pkt != NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8752 bp = spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8753 ASSERT(bp != NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8754
2553
624f674f2ad8 6430966 SATA NCQ support is needed in SATA framework and hba drivers
ls24207
parents: 2539
diff changeset
8755
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8756 if (spx->txlt_buf_dma_handle == NULL) {
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 * No DMA resources allocated so far - this is a first call
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8759 * for this sata pkt.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8760 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8761 rval = ddi_dma_alloc_handle(SATA_DIP(spx->txlt_sata_hba_inst),
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8762 cur_dma_attr, callback, arg, &spx->txlt_buf_dma_handle);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8763
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8764 if (rval != DDI_SUCCESS) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8765 SATA_LOG_D((spx->txlt_sata_hba_inst, CE_WARN,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8766 "sata_dma_buf_setup: no buf DMA resources %x",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8767 rval));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8768 return (rval);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8769 }
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 if (bp->b_flags & B_READ)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8772 dma_flags = DDI_DMA_READ;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8773 else
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8774 dma_flags = DDI_DMA_WRITE;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8775
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8776 if (flags & PKT_CONSISTENT)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8777 dma_flags |= DDI_DMA_CONSISTENT;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8778
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8779 if (flags & PKT_DMA_PARTIAL)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8780 dma_flags |= DDI_DMA_PARTIAL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8781
2539
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
8782 /*
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
8783 * Check buffer alignment and size against dma attributes
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
8784 * Consider dma_attr_align only. There may be requests
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
8785 * with the size lower then device granularity, but they
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
8786 * will not read/write from/to the device, so no adjustment
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
8787 * is necessary. The dma_attr_minxfer theoretically should
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
8788 * be considered, but no HBA driver is checking it.
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
8789 */
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
8790 if (IS_P2ALIGNED(bp->b_un.b_addr,
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
8791 cur_dma_attr->dma_attr_align)) {
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
8792 rval = ddi_dma_buf_bind_handle(
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
8793 spx->txlt_buf_dma_handle,
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
8794 bp, dma_flags, callback, arg,
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
8795 &cookie,
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
8796 &spx->txlt_curwin_num_dma_cookies);
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
8797 } else { /* Buffer is not aligned */
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
8798
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
8799 int (*ddicallback)(caddr_t);
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
8800 size_t bufsz;
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
8801
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
8802 /* Check id sleeping is allowed */
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
8803 ddicallback = (callback == NULL_FUNC) ?
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
8804 DDI_DMA_DONTWAIT : DDI_DMA_SLEEP;
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
8805
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
8806 SATADBG2(SATA_DBG_DMA_SETUP, spx->txlt_sata_hba_inst,
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
8807 "mis-aligned buffer: addr=0x%p, cnt=%lu",
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
8808 (void *)bp->b_un.b_addr, bp->b_bcount);
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
8809
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
8810 if (bp->b_flags & (B_PAGEIO|B_PHYS))
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
8811 /*
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
8812 * CPU will need to access data in the buffer
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
8813 * (for copying) so map it.
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
8814 */
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
8815 bp_mapin(bp);
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
8816
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
8817 ASSERT(spx->txlt_tmp_buf == NULL);
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
8818
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
8819 /* Buffer may be padded by ddi_dma_mem_alloc()! */
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
8820 rval = ddi_dma_mem_alloc(
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
8821 spx->txlt_buf_dma_handle,
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
8822 bp->b_bcount,
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
8823 &sata_acc_attr,
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
8824 DDI_DMA_STREAMING,
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
8825 ddicallback, NULL,
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
8826 &spx->txlt_tmp_buf,
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
8827 &bufsz,
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
8828 &spx->txlt_tmp_buf_handle);
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
8829
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
8830 if (rval != DDI_SUCCESS) {
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
8831 /* DMA mapping failed */
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
8832 (void) ddi_dma_free_handle(
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
8833 &spx->txlt_buf_dma_handle);
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
8834 spx->txlt_buf_dma_handle = NULL;
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
8835 #ifdef SATA_DEBUG
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
8836 mbuffail_count++;
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
8837 #endif
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
8838 SATADBG1(SATA_DBG_DMA_SETUP,
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
8839 spx->txlt_sata_hba_inst,
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
8840 "sata_dma_buf_setup: "
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
8841 "buf dma mem alloc failed %x\n", rval);
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
8842 return (rval);
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
8843 }
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
8844 ASSERT(IS_P2ALIGNED(spx->txlt_tmp_buf,
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
8845 cur_dma_attr->dma_attr_align));
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
8846
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
8847 #ifdef SATA_DEBUG
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
8848 mbuf_count++;
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
8849
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
8850 if (bp->b_bcount != bufsz)
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
8851 /*
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
8852 * This will require special handling, because
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
8853 * DMA cookies will be based on the temporary
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
8854 * buffer size, not the original buffer
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
8855 * b_bcount, so the residue may have to
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
8856 * be counted differently.
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
8857 */
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
8858 SATADBG2(SATA_DBG_DMA_SETUP,
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
8859 spx->txlt_sata_hba_inst,
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
8860 "sata_dma_buf_setup: bp size %x != "
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
8861 "bufsz %x\n", bp->b_bcount, bufsz);
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
8862 #endif
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
8863 if (dma_flags & DDI_DMA_WRITE) {
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
8864 /*
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
8865 * Write operation - copy data into
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
8866 * an aligned temporary buffer. Buffer will be
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
8867 * synced for device by ddi_dma_addr_bind_handle
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
8868 */
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
8869 bcopy(bp->b_un.b_addr, spx->txlt_tmp_buf,
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
8870 bp->b_bcount);
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
8871 }
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
8872
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
8873 rval = ddi_dma_addr_bind_handle(
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
8874 spx->txlt_buf_dma_handle,
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
8875 NULL,
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
8876 spx->txlt_tmp_buf,
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
8877 bufsz, dma_flags, ddicallback, 0,
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
8878 &cookie, &spx->txlt_curwin_num_dma_cookies);
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
8879 }
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8880
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8881 switch (rval) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8882 case DDI_DMA_PARTIAL_MAP:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8883 SATADBG1(SATA_DBG_DMA_SETUP, spx->txlt_sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8884 "sata_dma_buf_setup: DMA Partial Map\n", NULL);
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 * Partial DMA mapping.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8887 * Retrieve number of DMA windows for this request.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8888 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8889 if (ddi_dma_numwin(spx->txlt_buf_dma_handle,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8890 &spx->txlt_num_dma_win) != DDI_SUCCESS) {
2539
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
8891 if (spx->txlt_tmp_buf != NULL) {
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
8892 ddi_dma_mem_free(
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
8893 &spx->txlt_tmp_buf_handle);
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
8894 spx->txlt_tmp_buf = NULL;
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
8895 }
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8896 (void) ddi_dma_unbind_handle(
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8897 spx->txlt_buf_dma_handle);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8898 (void) ddi_dma_free_handle(
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8899 &spx->txlt_buf_dma_handle);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8900 spx->txlt_buf_dma_handle = NULL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8901 SATA_LOG_D((spx->txlt_sata_hba_inst, CE_WARN,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8902 "sata_dma_buf_setup: numwin failed\n"));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8903 return (DDI_FAILURE);
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 spx->txlt_cur_dma_win = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8906 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8907
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8908 case DDI_DMA_MAPPED:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8909 /* DMA fully mapped */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8910 spx->txlt_num_dma_win = 1;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8911 spx->txlt_cur_dma_win = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8912 break;
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 default:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8915 /* DMA mapping failed */
2539
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
8916 if (spx->txlt_tmp_buf != NULL) {
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
8917 ddi_dma_mem_free(
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
8918 &spx->txlt_tmp_buf_handle);
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
8919 spx->txlt_tmp_buf = NULL;
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
8920 }
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8921 (void) ddi_dma_free_handle(&spx->txlt_buf_dma_handle);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8922 spx->txlt_buf_dma_handle = NULL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8923 SATA_LOG_D((spx->txlt_sata_hba_inst, CE_WARN,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8924 "sata_dma_buf_setup: buf dma handle binding "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8925 "failed %x\n", rval));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8926 return (rval);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8927 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8928 spx->txlt_curwin_processed_dma_cookies = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8929 spx->txlt_dma_cookie_list = NULL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8930 } else {
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 * DMA setup is reused. Check if we need to process more
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8933 * cookies in current window, or to get next window, if any.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8934 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8935
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8936 ASSERT(spx->txlt_curwin_processed_dma_cookies <=
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8937 spx->txlt_curwin_num_dma_cookies);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8938
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8939 if (spx->txlt_curwin_processed_dma_cookies ==
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8940 spx->txlt_curwin_num_dma_cookies) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8941 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8942 * All cookies from current DMA window were processed.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8943 * Get next DMA window.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8944 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8945 spx->txlt_cur_dma_win++;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8946 if (spx->txlt_cur_dma_win < spx->txlt_num_dma_win) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8947 (void) ddi_dma_getwin(spx->txlt_buf_dma_handle,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8948 spx->txlt_cur_dma_win, &offset, &size,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8949 &cookie,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8950 &spx->txlt_curwin_num_dma_cookies);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8951 spx->txlt_curwin_processed_dma_cookies = 0;
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 } else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8954 /* No more windows! End of request! */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8955 /* What to do? - panic for now */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8956 ASSERT(spx->txlt_cur_dma_win >=
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8957 spx->txlt_num_dma_win);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8958
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8959 spx->txlt_curwin_num_dma_cookies = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8960 spx->txlt_curwin_processed_dma_cookies = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8961 spx->txlt_sata_pkt->
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8962 satapkt_cmd.satacmd_num_dma_cookies = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8963 return (DDI_SUCCESS);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8964 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8965 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8966 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8967 /* There better be at least one DMA cookie */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8968 ASSERT((spx->txlt_curwin_num_dma_cookies -
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8969 spx->txlt_curwin_processed_dma_cookies) > 0);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8970
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8971 if (spx->txlt_curwin_processed_dma_cookies == 0) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8972 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8973 * Processing a new DMA window - set-up dma cookies list.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8974 * We may reuse previously allocated cookie array if it is
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8975 * possible.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8976 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8977 if (spx->txlt_dma_cookie_list != NULL &&
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8978 spx->txlt_dma_cookie_list_len <
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8979 spx->txlt_curwin_num_dma_cookies) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8980 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8981 * New DMA window contains more cookies than
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8982 * the previous one. We need larger cookie list - free
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8983 * the old one.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8984 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8985 (void) kmem_free(spx->txlt_dma_cookie_list,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8986 spx->txlt_dma_cookie_list_len *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8987 sizeof (ddi_dma_cookie_t));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8988 spx->txlt_dma_cookie_list = NULL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8989 spx->txlt_dma_cookie_list_len = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8990 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8991 if (spx->txlt_dma_cookie_list == NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8992 /* Allocate new dma cookie array */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8993 spx->txlt_dma_cookie_list = kmem_zalloc(
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8994 sizeof (ddi_dma_cookie_t) *
2539
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
8995 spx->txlt_curwin_num_dma_cookies,
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
8996 callback == NULL_FUNC ? KM_NOSLEEP : KM_SLEEP);
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8997 spx->txlt_dma_cookie_list_len =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8998 spx->txlt_curwin_num_dma_cookies;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
8999 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9000 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9001 * Copy all DMA cookies into local list, so we will know their
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9002 * dma_size in advance of setting the sata_pkt.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9003 * One cookie was already fetched, so copy it.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9004 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9005 *(&spx->txlt_dma_cookie_list[0]) = cookie;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9006 for (i = 1; i < spx->txlt_curwin_num_dma_cookies; i++) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9007 ddi_dma_nextcookie(spx->txlt_buf_dma_handle, &cookie);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9008 *(&spx->txlt_dma_cookie_list[i]) = cookie;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9009 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9010 } else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9011 SATADBG2(SATA_DBG_DMA_SETUP, spx->txlt_sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9012 "sata_dma_buf_setup: sliding within DMA window, "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9013 "cur cookie %d, total cookies %d\n",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9014 spx->txlt_curwin_processed_dma_cookies,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9015 spx->txlt_curwin_num_dma_cookies);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9016 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9017
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9018 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9019 * Set-up sata_pkt cookie list.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9020 * No single cookie transfer size would exceed max transfer size of
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9021 * an ATA command used for addressed device (tha adjustment of the dma
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9022 * attributes took care of this). But there may be more
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9023 * then one cookie, so the cmd cookie list has to be
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9024 * constrained by both a maximum scatter gather list length and
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9025 * a maximum transfer size restriction of an ATA command.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9026 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9027
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9028 max_sg_len = cur_dma_attr->dma_attr_sgllen;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9029 req_sg_len = MIN(max_sg_len,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9030 (spx->txlt_curwin_num_dma_cookies -
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9031 spx->txlt_curwin_processed_dma_cookies));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9032
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9033 ASSERT(req_sg_len > 0);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9034
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9035 max_txfer_len = MAX((cur_dma_attr->dma_attr_granular * 0x100),
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9036 cur_dma_attr->dma_attr_maxxfer);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9037
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9038 /* One cookie should be always available */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9039 spx->txlt_sata_pkt->satapkt_cmd.satacmd_dma_cookie_list =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9040 &spx->txlt_dma_cookie_list[spx->txlt_curwin_processed_dma_cookies];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9041
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9042 spx->txlt_sata_pkt->satapkt_cmd.satacmd_num_dma_cookies = 1;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9043
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9044 cur_txfer_len =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9045 (uint64_t)spx->txlt_dma_cookie_list[
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9046 spx->txlt_curwin_processed_dma_cookies].dmac_size;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9047
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9048 spx->txlt_curwin_processed_dma_cookies++;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9049
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9050 ASSERT(cur_txfer_len <= max_txfer_len);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9051
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9052 /* Add more cookies to the scatter-gather list */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9053 for (i = 1; i < req_sg_len; i++) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9054 if (cur_txfer_len < max_txfer_len) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9055 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9056 * Check if the next cookie could be used by
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9057 * this sata_pkt.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9058 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9059 if ((cur_txfer_len +
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9060 spx->txlt_dma_cookie_list[
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9061 spx->txlt_curwin_processed_dma_cookies].
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9062 dmac_size) <= max_txfer_len) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9063 /* Yes, transfer lenght is within bounds */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9064 spx->txlt_sata_pkt->
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9065 satapkt_cmd.satacmd_num_dma_cookies++;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9066 cur_txfer_len +=
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9067 spx->txlt_dma_cookie_list[
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9068 spx->txlt_curwin_processed_dma_cookies].
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9069 dmac_size;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9070 spx->txlt_curwin_processed_dma_cookies++;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9071 } else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9072 /* No, transfer would exceed max lenght. */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9073 SATADBG3(SATA_DBG_DMA_SETUP,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9074 spx->txlt_sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9075 "ncookies %d, size 0x%lx, "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9076 "max_size 0x%lx\n",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9077 spx->txlt_sata_pkt->
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9078 satapkt_cmd.satacmd_num_dma_cookies,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9079 cur_txfer_len, max_txfer_len);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9080 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9081 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9082 } else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9083 /* Cmd max transfer length reached */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9084 SATADBG3(SATA_DBG_DMA_SETUP, spx->txlt_sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9085 "Max transfer length? "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9086 "ncookies %d, size 0x%lx, max_size 0x%lx\n",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9087 spx->txlt_sata_pkt->
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9088 satapkt_cmd.satacmd_num_dma_cookies,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9089 cur_txfer_len, max_txfer_len);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9090 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9091 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9092 }
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 ASSERT(cur_txfer_len != 0);
2539
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
9095 if (cur_txfer_len <= bp->b_bcount)
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
9096 spx->txlt_total_residue -= cur_txfer_len;
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
9097 else
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
9098 /*
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
9099 * Temporary DMA buffer has been padded by
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
9100 * ddi_dma_mem_alloc()!
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
9101 * This requires special handling, because DMA cookies are
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
9102 * based on the temporary buffer size, not the b_bcount,
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
9103 * and we have extra bytes to transfer - but the packet
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
9104 * residue has to stay correct because we will copy only
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
9105 * the requested number of bytes.
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
9106 */
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
9107 spx->txlt_total_residue -= bp->b_bcount;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9108
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9109 return (DDI_SUCCESS);
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
2539
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
9112
1258
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 * Fetch Device Identify data.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9115 * 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
9116 * 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
9117 * device identify command).
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9118 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9119 * Returns 0 if success, -1 otherwise.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9120 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9121 * Cannot be called in an interrupt context.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9122 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9123
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9124 static int
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9125 sata_fetch_device_identify_data(sata_hba_inst_t *sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9126 sata_drive_info_t *sdinfo)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9127 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9128 struct buf *bp;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9129 sata_pkt_t *spkt;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9130 sata_cmd_t *scmd;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9131 sata_pkt_txlate_t *spx;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9132 int rval;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9133
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9134 spx = kmem_zalloc(sizeof (sata_pkt_txlate_t), KM_SLEEP);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9135 spx->txlt_sata_hba_inst = sata_hba_inst;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9136 spx->txlt_scsi_pkt = NULL; /* No scsi pkt involved */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9137 spkt = sata_pkt_alloc(spx, SLEEP_FUNC);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9138 if (spkt == NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9139 kmem_free(spx, sizeof (sata_pkt_txlate_t));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9140 return (-1);
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 /* address is needed now */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9143 spkt->satapkt_device.satadev_addr = sdinfo->satadrv_addr;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9144
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9145 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9146 * Allocate buffer for Identify Data return data
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 bp = sata_alloc_local_buffer(spx, sizeof (sata_id_t));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9149 if (bp == NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9150 sata_pkt_free(spx);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9151 kmem_free(spx, sizeof (sata_pkt_txlate_t));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9152 SATA_LOG_D((sata_hba_inst, CE_WARN,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9153 "sata_fetch_device_identify_data: "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9154 "cannot allocate buffer for ID"));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9155 return (-1);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9156 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9157
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9158 /* Fill sata_pkt */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9159 sdinfo->satadrv_state = SATA_STATE_PROBING;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9160 spkt->satapkt_device.satadev_addr = sdinfo->satadrv_addr;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9161 spkt->satapkt_op_mode = SATA_OPMODE_SYNCH | SATA_OPMODE_INTERRUPTS;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9162 /* Synchronous mode, no callback */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9163 spkt->satapkt_comp = NULL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9164 /* Timeout 30s */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9165 spkt->satapkt_time = sata_default_pkt_time;
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 scmd = &spkt->satapkt_cmd;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9168 scmd->satacmd_bp = bp;
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
9169 scmd->satacmd_flags.sata_data_direction = SATA_DIR_READ;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
9170 scmd->satacmd_flags.sata_ignore_dev_reset = B_TRUE;
1258
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 /* Build Identify Device cmd in the sata_pkt */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9173 scmd->satacmd_addr_type = 0; /* N/A */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9174 scmd->satacmd_sec_count_lsb = 0; /* N/A */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9175 scmd->satacmd_lba_low_lsb = 0; /* N/A */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9176 scmd->satacmd_lba_mid_lsb = 0; /* N/A */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9177 scmd->satacmd_lba_high_lsb = 0; /* N/A */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9178 scmd->satacmd_features_reg = 0; /* N/A */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9179 scmd->satacmd_device_reg = 0; /* Always device 0 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9180 if (sdinfo->satadrv_type == SATA_DTYPE_ATAPICD) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9181 /* Identify Packet Device cmd */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9182 scmd->satacmd_cmd_reg = SATAC_ID_PACKET_DEVICE;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9183 } else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9184 /* Identify Device cmd - mandatory for all other devices */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9185 scmd->satacmd_cmd_reg = SATAC_ID_DEVICE;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9186 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9187
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9188 /* Send pkt to SATA HBA driver */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9189 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
9190 SATA_TRAN_ACCEPTED ||
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9191 spkt->satapkt_reason != SATA_PKT_COMPLETED) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9192 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9193 * Woops, no Identify Data.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9194 * Invalidate sata_drive_info ?
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9195 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9196 rval = -1;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9197 } else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9198 /* Update sata_drive_info */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9199 rval = ddi_dma_sync(spx->txlt_buf_dma_handle, 0, 0,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9200 DDI_DMA_SYNC_FORKERNEL);
2539
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
9201 ASSERT(rval == DDI_SUCCESS);
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9202 bcopy(bp->b_un.b_addr, &sdinfo->satadrv_id,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9203 sizeof (sata_id_t));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9204
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9205 sdinfo->satadrv_features_support = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9206 if (sdinfo->satadrv_type == SATA_DTYPE_ATADISK) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9207 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9208 * Retrieve capacity (disks only) and addressing mode
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 sdinfo->satadrv_capacity = sata_check_capacity(sdinfo);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9211 } else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9212 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9213 * For ATAPI devices one has to issue Get Capacity cmd
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9214 * (not needed at the moment)
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 sdinfo->satadrv_capacity = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9217 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9218 /* Setup supported features flags */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9219 if (sdinfo->satadrv_id.ai_cap & SATA_DMA_SUPPORT)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9220 sdinfo->satadrv_features_support |= SATA_DEV_F_DMA;
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 /* Check for NCQ support */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9223 if (sdinfo->satadrv_id.ai_satacap != 0 &&
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9224 sdinfo->satadrv_id.ai_satacap != 0xffff) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9225 /* SATA compliance */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9226 if (sdinfo->satadrv_id.ai_satacap & SATA_NCQ)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9227 sdinfo->satadrv_features_support |=
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9228 SATA_DEV_F_NCQ;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9229 if (sdinfo->satadrv_id.ai_satacap &
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9230 (SATA_1_SPEED | SATA_2_SPEED)) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9231 if (sdinfo->satadrv_id.ai_satacap &
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9232 SATA_2_SPEED)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9233 sdinfo->satadrv_features_support |=
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9234 SATA_DEV_F_SATA2;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9235 if (sdinfo->satadrv_id.ai_satacap &
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9236 SATA_1_SPEED)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9237 sdinfo->satadrv_features_support |=
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9238 SATA_DEV_F_SATA1;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9239 } else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9240 sdinfo->satadrv_features_support |=
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9241 SATA_DEV_F_SATA1;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9242 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9243 }
1940
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
9244 if ((sdinfo->satadrv_id.ai_cmdset83 & SATA_RW_DMA_QUEUED_CMD) &&
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
9245 (sdinfo->satadrv_id.ai_features86 & SATA_RW_DMA_QUEUED_CMD))
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
9246 sdinfo->satadrv_features_support |= SATA_DEV_F_TCQ;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9247
2553
624f674f2ad8 6430966 SATA NCQ support is needed in SATA framework and hba drivers
ls24207
parents: 2539
diff changeset
9248 sdinfo->satadrv_queue_depth = sdinfo->satadrv_id.ai_qdepth;
624f674f2ad8 6430966 SATA NCQ support is needed in SATA framework and hba drivers
ls24207
parents: 2539
diff changeset
9249 if ((sdinfo->satadrv_features_support & SATA_DEV_F_NCQ) ||
624f674f2ad8 6430966 SATA NCQ support is needed in SATA framework and hba drivers
ls24207
parents: 2539
diff changeset
9250 (sdinfo->satadrv_features_support & SATA_DEV_F_TCQ))
624f674f2ad8 6430966 SATA NCQ support is needed in SATA framework and hba drivers
ls24207
parents: 2539
diff changeset
9251 ++sdinfo->satadrv_queue_depth;
624f674f2ad8 6430966 SATA NCQ support is needed in SATA framework and hba drivers
ls24207
parents: 2539
diff changeset
9252
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9253 rval = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9254 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9255 fail:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9256 /* Free allocated resources */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9257 sata_free_local_buffer(spx);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9258 spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp = NULL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9259 sata_pkt_free(spx);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9260 kmem_free(spx, sizeof (sata_pkt_txlate_t));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9261
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9262 return (rval);
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
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9265
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 * 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
9268 * UDMA mode is selected.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9269 * Some devices (bridged devices) may not come-up with default UDMA mode
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9270 * set correctly, so this function is setting it.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9271 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9272 * Returns SATA_SUCCESS if proper UDMA mode is selected.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9273 * Returns SATA_FAILURE if proper UDMA mode could not be selected.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9274 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9275 static int
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9276 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
9277 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9278 sata_pkt_t *spkt;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9279 sata_cmd_t *scmd;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9280 sata_pkt_txlate_t *spx;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9281 int result = SATA_SUCCESS;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9282 int i, mode;
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 ASSERT(sdinfo != NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9285 ASSERT(sata_hba_inst != NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9286
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9287 /* Find highest Ultra DMA mode supported */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9288 for (mode = 6; mode >= 0; --mode) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9289 if (sdinfo->satadrv_id.ai_ultradma & (1 << mode))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9290 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9291 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9292 if (mode < 4)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9293 return (SATA_FAILURE);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9294
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9295 /* Find UDMA mode currently selected */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9296 for (i = 6; i >= 0; --i) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9297 if (sdinfo->satadrv_id.ai_ultradma & (1 << (i + 8)))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9298 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9299 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9300
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9301 if (i < mode) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9302 /* Set UDMA mode via SET FEATURES COMMAND */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9303 /* Prepare packet for SET FEATURES COMMAND */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9304 spx = kmem_zalloc(sizeof (sata_pkt_txlate_t), KM_SLEEP);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9305 spx->txlt_sata_hba_inst = sata_hba_inst;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9306 spx->txlt_scsi_pkt = NULL; /* No scsi pkt involved */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9307 spkt = sata_pkt_alloc(spx, SLEEP_FUNC);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9308 if (spkt == NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9309 result = SATA_FAILURE;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9310 goto failure;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9311 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9312 /* Fill sata_pkt */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9313 spkt->satapkt_device.satadev_addr = sdinfo->satadrv_addr;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9314 /* Timeout 30s */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9315 spkt->satapkt_time = sata_default_pkt_time;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9316 /* Synchronous mode, no callback, interrupts */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9317 spkt->satapkt_op_mode =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9318 SATA_OPMODE_SYNCH | SATA_OPMODE_INTERRUPTS;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9319 spkt->satapkt_comp = NULL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9320 scmd = &spkt->satapkt_cmd;
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
9321 scmd->satacmd_flags.sata_data_direction = SATA_DIR_NODATA_XFER;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
9322 scmd->satacmd_flags.sata_ignore_dev_reset = B_TRUE;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9323 scmd->satacmd_addr_type = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9324 scmd->satacmd_device_reg = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9325 scmd->satacmd_status_reg = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9326 scmd->satacmd_error_reg = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9327 scmd->satacmd_cmd_reg = SATAC_SET_FEATURES;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9328 scmd->satacmd_features_reg = SATAC_SF_TRANSFER_MODE;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9329 scmd->satacmd_sec_count_lsb =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9330 SATAC_TRANSFER_MODE_ULTRA_DMA | mode;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9331
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9332 /* Transfer command to HBA */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9333 if ((*SATA_START_FUNC(sata_hba_inst))(SATA_DIP(sata_hba_inst),
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9334 spkt) != SATA_TRAN_ACCEPTED ||
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9335 spkt->satapkt_reason != SATA_PKT_COMPLETED) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9336 /* Pkt execution failed */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9337 result = SATA_FAILURE;
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 failure:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9340 if (result == SATA_FAILURE)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9341 SATA_LOG_D((sata_hba_inst, CE_WARN,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9342 "sata_set_udma_mode: could not set UDMA "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9343 "mode %", mode));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9344
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9345 /* Free allocated resources */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9346 if (spkt != NULL)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9347 sata_pkt_free(spx);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9348 (void) kmem_free(spx, sizeof (sata_pkt_txlate_t));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9349 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9350 return (result);
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
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9353
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9354 /*
1781
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
9355 * Set device caching mode.
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
9356 * One of the following operations should be specified:
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
9357 * SATAC_SF_ENABLE_READ_AHEAD
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
9358 * SATAC_SF_DISABLE_READ_AHEAD
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
9359 * SATAC_SF_ENABLE_WRITE_CACHE
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
9360 * SATAC_SF_DISABLE_WRITE_CACHE
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
9361 *
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
9362 * If operation fails, system log messgage is emitted.
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
9363 * Returns SATA_SUCCESS when the operation succeeds, SATA_FAILURE otherwise.
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
9364 */
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
9365
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
9366 static int
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
9367 sata_set_cache_mode(sata_hba_inst_t *sata_hba_inst, sata_drive_info_t *sdinfo,
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
9368 int cache_op)
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
9369 {
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
9370 sata_pkt_t *spkt;
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
9371 sata_cmd_t *scmd;
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
9372 sata_pkt_txlate_t *spx;
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
9373 int rval = SATA_SUCCESS;
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
9374 char *infop;
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
9375
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
9376 ASSERT(sdinfo != NULL);
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
9377 ASSERT(sata_hba_inst != NULL);
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
9378 ASSERT(cache_op == SATAC_SF_ENABLE_READ_AHEAD ||
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
9379 cache_op == SATAC_SF_DISABLE_READ_AHEAD ||
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
9380 cache_op == SATAC_SF_ENABLE_WRITE_CACHE ||
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
9381 cache_op == SATAC_SF_DISABLE_WRITE_CACHE);
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
9382
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
9383
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
9384 /* Prepare packet for SET FEATURES COMMAND */
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
9385 spx = kmem_zalloc(sizeof (sata_pkt_txlate_t), KM_SLEEP);
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
9386 spx->txlt_sata_hba_inst = sata_hba_inst;
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
9387 spx->txlt_scsi_pkt = NULL; /* No scsi pkt involved */
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
9388 spkt = sata_pkt_alloc(spx, SLEEP_FUNC);
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
9389 if (spkt == NULL) {
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
9390 rval = SATA_FAILURE;
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
9391 goto failure;
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
9392 }
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
9393 /* Fill sata_pkt */
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
9394 spkt->satapkt_device.satadev_addr = sdinfo->satadrv_addr;
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
9395 /* Timeout 30s */
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
9396 spkt->satapkt_time = sata_default_pkt_time;
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
9397 /* Synchronous mode, no callback, interrupts */
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
9398 spkt->satapkt_op_mode =
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
9399 SATA_OPMODE_SYNCH | SATA_OPMODE_INTERRUPTS;
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
9400 spkt->satapkt_comp = NULL;
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
9401 scmd = &spkt->satapkt_cmd;
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
9402 scmd->satacmd_flags.sata_data_direction = SATA_DIR_NODATA_XFER;
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
9403 scmd->satacmd_flags.sata_ignore_dev_reset = B_TRUE;
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
9404 scmd->satacmd_addr_type = 0;
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
9405 scmd->satacmd_device_reg = 0;
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
9406 scmd->satacmd_status_reg = 0;
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
9407 scmd->satacmd_error_reg = 0;
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
9408 scmd->satacmd_cmd_reg = SATAC_SET_FEATURES;
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
9409 scmd->satacmd_features_reg = cache_op;
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
9410
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
9411 /* Transfer command to HBA */
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
9412 if (((*SATA_START_FUNC(sata_hba_inst))(
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
9413 SATA_DIP(sata_hba_inst), spkt) != 0) ||
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
9414 (spkt->satapkt_reason != SATA_PKT_COMPLETED)) {
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
9415 /* Pkt execution failed */
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
9416 switch (cache_op) {
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
9417 case SATAC_SF_ENABLE_READ_AHEAD:
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
9418 infop = "enabling read ahead failed";
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
9419 break;
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
9420 case SATAC_SF_DISABLE_READ_AHEAD:
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
9421 infop = "disabling read ahead failed";
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
9422 break;
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
9423 case SATAC_SF_ENABLE_WRITE_CACHE:
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
9424 infop = "enabling write cache failed";
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
9425 break;
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
9426 case SATAC_SF_DISABLE_WRITE_CACHE:
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
9427 infop = "disabling write cache failed";
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
9428 break;
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
9429 }
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
9430 SATA_LOG_D((sata_hba_inst, CE_WARN, "%s", infop));
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
9431 rval = SATA_FAILURE;
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
9432 }
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
9433 failure:
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
9434 /* Free allocated resources */
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
9435 if (spkt != NULL)
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
9436 sata_pkt_free(spx);
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
9437 (void) kmem_free(spx, sizeof (sata_pkt_txlate_t));
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
9438 return (rval);
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
9439 }
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
9440
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
9441
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
9442
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
9443 /*
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9444 * Update port SCR block
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9445 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9446 static void
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9447 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
9448 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9449 port_scr->sstatus = device->satadev_scr.sstatus;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9450 port_scr->serror = device->satadev_scr.serror;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9451 port_scr->scontrol = device->satadev_scr.scontrol;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9452 port_scr->sactive = device->satadev_scr.sactive;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9453 port_scr->snotific = device->satadev_scr.snotific;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9454 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9455
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 * Update state and copy port ss* values from passed sata_device structure.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9458 * 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
9459 * configuration struct.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9460 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9461 * 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
9462 * regardless of the state in device argument.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9463 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9464 * Port mutex should be held while calling this function.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9465 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9466 static void
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9467 sata_update_port_info(sata_hba_inst_t *sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9468 sata_device_t *sata_device)
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 ASSERT(mutex_owned(&SATA_CPORT_MUTEX(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9471 sata_device->satadev_addr.cport)));
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 if (sata_device->satadev_addr.qual == SATA_ADDR_CPORT ||
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9474 sata_device->satadev_addr.qual == SATA_ADDR_DCPORT) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9475
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9476 sata_cport_info_t *cportinfo;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9477
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9478 if (SATA_NUM_CPORTS(sata_hba_inst) <=
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9479 sata_device->satadev_addr.cport)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9480 return;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9481
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9482 cportinfo = SATA_CPORT_INFO(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9483 sata_device->satadev_addr.cport);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9484 sata_update_port_scr(&cportinfo->cport_scr, sata_device);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9485
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9486 /* Preserve SATA_PSTATE_SHUTDOWN flag */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9487 cportinfo->cport_state &= ~(SATA_PSTATE_PWRON |
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9488 SATA_PSTATE_PWROFF | SATA_PSTATE_FAILED);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9489 cportinfo->cport_state |=
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9490 sata_device->satadev_state & SATA_PSTATE_VALID;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9491 } else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9492 sata_pmport_info_t *pmportinfo;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9493
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9494 if ((sata_device->satadev_addr.qual != SATA_ADDR_PMPORT) ||
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9495 (sata_device->satadev_addr.qual != SATA_ADDR_DPMPORT) ||
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9496 SATA_NUM_PMPORTS(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9497 sata_device->satadev_addr.cport) <
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9498 sata_device->satadev_addr.pmport)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9499 return;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9500
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9501 pmportinfo = SATA_PMPORT_INFO(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9502 sata_device->satadev_addr.cport,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9503 sata_device->satadev_addr.pmport);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9504 sata_update_port_scr(&pmportinfo->pmport_scr, sata_device);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9505
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9506 /* Preserve SATA_PSTATE_SHUTDOWN flag */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9507 pmportinfo->pmport_state &=
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9508 ~(SATA_PSTATE_PWRON | SATA_PSTATE_PWROFF |
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9509 SATA_PSTATE_FAILED);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9510 pmportinfo->pmport_state |=
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9511 sata_device->satadev_state & SATA_PSTATE_VALID;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9512 }
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
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9515
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9516
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9517 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9518 * Extract SATA port specification from an IOCTL argument.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9519 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9520 * 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
9521 * cannot retrieve port spec, then -1 is returned.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9522 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9523 * Note: Only cport - no port multiplier port.
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 static int32_t
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9526 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
9527 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9528 int32_t port;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9529
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9530 /* Extract port number from nvpair in dca structure */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9531 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
9532 SATA_LOG_D((sata_hba_inst, CE_NOTE,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9533 "sata_get_port_num: invalid port spec 0x%x in ioctl",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9534 port));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9535 port = -1;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9536 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9537
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9538 return (port);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9539 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9540
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9541 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9542 * 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
9543 * NOTE: target argument is a value used in ioctls to identify
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9544 * the AP - it is not a sata_address.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9545 * It is a combination of cport, pmport and address qualifier, encodded same
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9546 * way as a scsi target number.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9547 * At this moment it carries only cport number.
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 * No PMult hotplug support.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9550 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9551 * Returns dev_info_t pointer if target device was found, NULL otherwise.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9552 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9553
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9554 static dev_info_t *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9555 sata_get_target_dip(dev_info_t *dip, int32_t port)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9556 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9557 dev_info_t *cdip = NULL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9558 int target, tgt;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9559 int ncport;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9560 int circ;
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 ncport = port & SATA_CFGA_CPORT_MASK;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9563 target = SATA_TO_SCSI_TARGET(ncport, 0, SATA_ADDR_DCPORT);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9564
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9565 ndi_devi_enter(dip, &circ);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9566 for (cdip = ddi_get_child(dip); cdip != NULL; ) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9567 dev_info_t *next = ddi_get_next_sibling(cdip);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9568
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9569 tgt = ddi_prop_get_int(DDI_DEV_T_ANY, cdip,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9570 DDI_PROP_DONTPASS, "target", -1);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9571 if (tgt == -1) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9572 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9573 * This is actually an error condition, but not
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9574 * a fatal one. Just continue the search.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9575 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9576 cdip = next;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9577 continue;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9578 }
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 if (tgt == target)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9581 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9582
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9583 cdip = next;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9584 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9585 ndi_devi_exit(dip, circ);
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 return (cdip);
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
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9590
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9591 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9592 * sata_cfgadm_state:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9593 * 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
9594 * the cfgadm_state.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9595 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9596 * The port argument is a value with encoded cport,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9597 * 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
9598 * SCSI_TO_SATA_CPORT macro extracts cport number,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9599 * SCSI_TO_SATA_PMPORT extracts pmport number and
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9600 * SCSI_TO_SATA_ADDR_QUAL extracts port mulitplier qualifier flag.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9601 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9602 * For now, support is for cports only - no pmultiplier ports.
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
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9605 static void
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9606 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
9607 devctl_ap_state_t *ap_state)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9608 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9609 uint16_t cport;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9610 int port_state;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9611
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9612 /* Cport only */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9613 cport = SCSI_TO_SATA_CPORT(port);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9614
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9615 port_state = SATA_CPORT_STATE(sata_hba_inst, cport);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9616 if (port_state & SATA_PSTATE_SHUTDOWN ||
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9617 port_state & SATA_PSTATE_FAILED) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9618 ap_state->ap_rstate = AP_RSTATE_DISCONNECTED;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9619 ap_state->ap_ostate = AP_OSTATE_UNCONFIGURED;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9620 if (port_state & SATA_PSTATE_FAILED)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9621 ap_state->ap_condition = AP_COND_FAILED;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9622 else
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9623 ap_state->ap_condition = AP_COND_UNKNOWN;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9624
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9625 return;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9626 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9627
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9628 /* Need to check pmult device port here as well, when supported */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9629
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9630 /* Port is enabled and ready */
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 switch (SATA_CPORT_DEV_TYPE(sata_hba_inst, cport)) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9633 case SATA_DTYPE_NONE:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9634 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9635 /* No device attached */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9636 ap_state->ap_rstate = AP_RSTATE_EMPTY;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9637 ap_state->ap_ostate = AP_OSTATE_UNCONFIGURED;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9638 ap_state->ap_condition = AP_COND_OK;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9639 break;
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 case SATA_DTYPE_UNKNOWN:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9642 case SATA_DTYPE_ATAPINONCD:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9643 case SATA_DTYPE_PMULT: /* Until PMult is supported */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9644 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9645 /* Unknown device attached */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9646 ap_state->ap_rstate = AP_RSTATE_CONNECTED;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9647 ap_state->ap_ostate = AP_OSTATE_UNCONFIGURED;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9648 ap_state->ap_condition = AP_COND_UNKNOWN;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9649 break;
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 case SATA_DTYPE_ATADISK:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9652 case SATA_DTYPE_ATAPICD:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9653 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9654 dev_info_t *tdip = NULL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9655 dev_info_t *dip = NULL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9656 int circ;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9657
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9658 dip = SATA_DIP(sata_hba_inst);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9659 tdip = sata_get_target_dip(dip, port);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9660 ap_state->ap_rstate = AP_RSTATE_CONNECTED;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9661 if (tdip != NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9662 ndi_devi_enter(dip, &circ);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9663 mutex_enter(&(DEVI(tdip)->devi_lock));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9664 if ((DEVI_IS_DEVICE_OFFLINE(tdip)) ||
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9665 (DEVI_IS_DEVICE_DOWN(tdip))) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9666 ap_state->ap_ostate = AP_OSTATE_UNCONFIGURED;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9667 } else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9668 ap_state->ap_ostate = AP_OSTATE_CONFIGURED;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9669 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9670 ap_state->ap_condition = AP_COND_OK;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9671 mutex_exit(&(DEVI(tdip)->devi_lock));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9672 ndi_devi_exit(dip, circ);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9673 } else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9674 ap_state->ap_ostate = AP_OSTATE_UNCONFIGURED;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9675 ap_state->ap_condition = AP_COND_UNKNOWN;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9676 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9677 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9678 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9679 default:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9680 ap_state->ap_rstate = AP_RSTATE_CONNECTED;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9681 ap_state->ap_ostate = AP_OSTATE_UNCONFIGURED;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9682 ap_state->ap_condition = AP_COND_UNKNOWN;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9683 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9684 * This is actually internal error condition (non fatal),
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9685 * beacuse we already checked all defined device types.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9686 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9687 SATA_LOG_D((sata_hba_inst, CE_WARN,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9688 "sata_cfgadm_state: Internal error: "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9689 "unknown device type"));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9690 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9691 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9692 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9693
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9694 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9695 * Start or terminate the thread, depending on flag arg and current state
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9696 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9697 static void
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9698 sata_event_thread_control(int startstop)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9699 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9700 static int sata_event_thread_terminating = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9701 static int sata_event_thread_starting = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9702 int i;
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 mutex_enter(&sata_event_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9705
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9706 if (startstop == 0 && (sata_event_thread_starting == 1 ||
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9707 sata_event_thread_terminating == 1)) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9708 mutex_exit(&sata_event_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9709 return;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9710 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9711 if (startstop == 1 && sata_event_thread_starting == 1) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9712 mutex_exit(&sata_event_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9713 return;
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 if (startstop == 1 && sata_event_thread_terminating == 1) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9716 sata_event_thread_starting = 1;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9717 /* wait til terminate operation completes */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9718 i = SATA_EVNT_DAEMON_TERM_WAIT/SATA_EVNT_DAEMON_TERM_TIMEOUT;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9719 while (sata_event_thread_terminating == 1) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9720 if (i-- <= 0) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9721 sata_event_thread_starting = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9722 mutex_exit(&sata_event_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9723 #ifdef SATA_DEBUG
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9724 cmn_err(CE_WARN, "sata_event_thread_control: "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9725 "timeout waiting for thread to terminate");
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9726 #endif
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9727 return;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9728 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9729 mutex_exit(&sata_event_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9730 delay(drv_usectohz(SATA_EVNT_DAEMON_TERM_TIMEOUT));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9731 mutex_enter(&sata_event_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9732 }
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 (startstop == 1) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9735 if (sata_event_thread == NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9736 sata_event_thread = thread_create(NULL, 0,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9737 (void (*)())sata_event_daemon,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9738 &sata_hba_list, 0, &p0, TS_RUN, minclsyspri);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9739 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9740 sata_event_thread_starting = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9741 mutex_exit(&sata_event_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9742 return;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9743 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9744
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9745 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9746 * If we got here, thread may need to be terminated
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9747 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9748 if (sata_event_thread != NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9749 int i;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9750 /* Signal event thread to go away */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9751 sata_event_thread_terminating = 1;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9752 sata_event_thread_terminate = 1;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9753 cv_signal(&sata_event_cv);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9754 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9755 * Wait til daemon terminates.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9756 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9757 i = SATA_EVNT_DAEMON_TERM_WAIT/SATA_EVNT_DAEMON_TERM_TIMEOUT;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9758 while (sata_event_thread_terminate == 1) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9759 mutex_exit(&sata_event_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9760 if (i-- <= 0) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9761 /* Daemon did not go away !!! */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9762 #ifdef SATA_DEBUG
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9763 cmn_err(CE_WARN, "sata_event_thread_control: "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9764 "cannot terminate event daemon thread");
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9765 #endif
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9766 mutex_enter(&sata_event_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9767 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9768 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9769 delay(drv_usectohz(SATA_EVNT_DAEMON_TERM_TIMEOUT));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9770 mutex_enter(&sata_event_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9771 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9772 sata_event_thread_terminating = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9773 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9774 ASSERT(sata_event_thread_terminating == 0);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9775 ASSERT(sata_event_thread_starting == 0);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9776 mutex_exit(&sata_event_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9777 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9778
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9779
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9780 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9781 * Log sata message
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9782 * dev pathname msg line preceeds the logged message.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9783 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9784
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9785 static void
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9786 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
9787 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9788 char pathname[128];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9789 dev_info_t *dip;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9790 va_list ap;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9791
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9792 mutex_enter(&sata_log_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9793
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9794 va_start(ap, fmt);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9795 (void) vsprintf(sata_log_buf, fmt, ap);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9796 va_end(ap);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9797
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9798 if (sata_hba_inst != NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9799 dip = SATA_DIP(sata_hba_inst);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9800 (void) ddi_pathname(dip, pathname);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9801 } else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9802 pathname[0] = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9803 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9804 if (level == CE_CONT) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9805 if (sata_debug_flags == 0)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9806 cmn_err(level, "?%s:\n %s\n", pathname, sata_log_buf);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9807 else
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9808 cmn_err(level, "%s:\n %s\n", pathname, sata_log_buf);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9809 } else
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9810 cmn_err(level, "%s:\n %s", pathname, sata_log_buf);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9811
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9812 mutex_exit(&sata_log_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9813 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9814
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9815
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9816 /* ******** Asynchronous HBA events handling & hotplugging support ******** */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9817
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9818 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9819 * SATA HBA event notification function.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9820 * 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
9821 * a port and/or device state or a controller itself.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9822 * Events for different addresses/addr types cannot be combined.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9823 * A warning message is generated for each event type.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9824 * Events are not processed by this function, so only the
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9825 * 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
9826 * waken up. Event daemon thread processes all events.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9827 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9828 * 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
9829 * cannot determine a sequence of events when opposite event are reported, eg.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9830 * LINK_LOST and LINK_ESTABLISHED. Actual port status during event processing
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9831 * is taking precedence over reported events, i.e. may cause ignoring some
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9832 * events.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9833 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9834 #define SATA_EVENT_MAX_MSG_LENGTH 79
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9835
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9836 void
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9837 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
9838 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9839 sata_hba_inst_t *sata_hba_inst = NULL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9840 sata_address_t *saddr;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9841 sata_drive_info_t *sdinfo;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9842 sata_port_stats_t *pstats;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9843 int cport, pmport;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9844 char buf1[SATA_EVENT_MAX_MSG_LENGTH + 1];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9845 char buf2[SATA_EVENT_MAX_MSG_LENGTH + 1];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9846 char *lcp;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9847 static char *err_msg_evnt_1 =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9848 "sata_hba_event_notify: invalid port event 0x%x ";
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9849 static char *err_msg_evnt_2 =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9850 "sata_hba_event_notify: invalid device event 0x%x ";
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9851 int linkevent;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9852
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9853 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9854 * There is a possibility that an event will be generated on HBA
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9855 * that has not completed attachment or is detaching.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9856 * HBA driver should prevent this, but just in case it does not,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9857 * we need to ignore events for such HBA.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9858 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9859 mutex_enter(&sata_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9860 for (sata_hba_inst = sata_hba_list; sata_hba_inst != NULL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9861 sata_hba_inst = sata_hba_inst->satahba_next) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9862 if (SATA_DIP(sata_hba_inst) == dip)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9863 if (sata_hba_inst->satahba_attached == 1)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9864 break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9865 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9866 mutex_exit(&sata_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9867 if (sata_hba_inst == NULL)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9868 /* HBA not attached */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9869 return;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9870
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9871 ASSERT(sata_device != NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9872
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9873 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9874 * Validate address before - do not proceed with invalid address.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9875 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9876 saddr = &sata_device->satadev_addr;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9877 if (saddr->cport >= SATA_NUM_CPORTS(sata_hba_inst))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9878 return;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9879 if (saddr->qual == SATA_ADDR_PMPORT ||
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9880 saddr->qual == SATA_ADDR_DPMPORT)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9881 /* Port Multiplier not supported yet */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9882 return;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9883
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9884 cport = saddr->cport;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9885 pmport = saddr->pmport;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9886
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9887 buf1[0] = buf2[0] = '\0';
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9888
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9889 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9890 * Events refer to devices, ports and controllers - each has
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9891 * unique address. Events for different addresses cannot be combined.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9892 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9893 if (saddr->qual & (SATA_ADDR_CPORT | SATA_ADDR_PMPORT)) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9894
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9895 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9896
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9897 /* qualify this event(s) */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9898 if ((event & SATA_EVNT_PORT_EVENTS) == 0) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9899 /* Invalid event for the device port */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9900 (void) sprintf(buf2, err_msg_evnt_1,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9901 event & SATA_EVNT_PORT_EVENTS);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9902 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9903 goto event_info;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9904 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9905 if (saddr->qual == SATA_ADDR_CPORT) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9906 /* Controller's device port event */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9907
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9908 (SATA_CPORT_INFO(sata_hba_inst, cport))->
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9909 cport_event_flags |=
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9910 event & SATA_EVNT_PORT_EVENTS;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9911 pstats =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9912 &(SATA_CPORT_INFO(sata_hba_inst, cport))->
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9913 cport_stats;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9914 } else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9915 /* Port multiplier's device port event */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9916 (SATA_PMPORT_INFO(sata_hba_inst, cport, pmport))->
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9917 pmport_event_flags |=
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9918 event & SATA_EVNT_PORT_EVENTS;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9919 pstats =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9920 &(SATA_PMPORT_INFO(sata_hba_inst, cport, pmport))->
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9921 pmport_stats;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9922 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9923
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9924 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9925 * Add to statistics and log the message. We have to do it
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9926 * here rather than in the event daemon, because there may be
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9927 * multiple events occuring before they are processed.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9928 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9929 linkevent = event &
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9930 (SATA_EVNT_LINK_LOST | SATA_EVNT_LINK_ESTABLISHED);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9931 if (linkevent) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9932 if (linkevent == (SATA_EVNT_LINK_LOST |
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9933 SATA_EVNT_LINK_ESTABLISHED)) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9934 /* This is likely event combination */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9935 (void) strlcat(buf1, "link lost/established, ",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9936 SATA_EVENT_MAX_MSG_LENGTH);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9937
1781
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
9938 if (pstats->link_lost < 0xffffffffffffffffULL)
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9939 pstats->link_lost++;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9940 if (pstats->link_established <
1781
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
9941 0xffffffffffffffffULL)
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9942 pstats->link_established++;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9943 linkevent = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9944 } else if (linkevent & SATA_EVNT_LINK_LOST) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9945 (void) strlcat(buf1, "link lost, ",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9946 SATA_EVENT_MAX_MSG_LENGTH);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9947
1781
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
9948 if (pstats->link_lost < 0xffffffffffffffffULL)
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9949 pstats->link_lost++;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9950 } else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9951 (void) strlcat(buf1, "link established, ",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9952 SATA_EVENT_MAX_MSG_LENGTH);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9953 if (pstats->link_established <
1781
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
9954 0xffffffffffffffffULL)
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9955 pstats->link_established++;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9956 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9957 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9958 if (event & SATA_EVNT_DEVICE_ATTACHED) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9959 (void) strlcat(buf1, "device attached, ",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9960 SATA_EVENT_MAX_MSG_LENGTH);
1781
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
9961 if (pstats->device_attached < 0xffffffffffffffffULL)
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9962 pstats->device_attached++;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9963 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9964 if (event & SATA_EVNT_DEVICE_DETACHED) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9965 (void) strlcat(buf1, "device detached, ",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9966 SATA_EVENT_MAX_MSG_LENGTH);
1781
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
9967 if (pstats->device_detached < 0xffffffffffffffffULL)
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9968 pstats->device_detached++;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9969 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9970 if (event & SATA_EVNT_PWR_LEVEL_CHANGED) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9971 SATADBG1(SATA_DBG_EVENTS, sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9972 "port %d power level changed", cport);
1781
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
9973 if (pstats->port_pwr_changed < 0xffffffffffffffffULL)
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9974 pstats->port_pwr_changed++;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9975 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9976
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9977 if ((event & ~SATA_EVNT_PORT_EVENTS) != 0) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9978 /* There should be no other events for this address */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9979 (void) sprintf(buf2, err_msg_evnt_1,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9980 event & ~SATA_EVNT_PORT_EVENTS);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9981 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9982 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9983
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9984 } else if (saddr->qual & (SATA_ADDR_DCPORT | SATA_ADDR_DPMPORT)) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9985 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9986
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9987 /* qualify this event */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9988 if ((event & SATA_EVNT_DEVICE_RESET) == 0) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9989 /* Invalid event for a device */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9990 (void) sprintf(buf2, err_msg_evnt_2,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9991 event & SATA_EVNT_DEVICE_RESET);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9992 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9993 goto event_info;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9994 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9995 /* drive event */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9996 sdinfo = sata_get_device_info(sata_hba_inst, sata_device);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9997 if (sdinfo != NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9998 if (event & SATA_EVNT_DEVICE_RESET) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
9999 (void) strlcat(buf1, "device reset, ",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10000 SATA_EVENT_MAX_MSG_LENGTH);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10001 if (sdinfo->satadrv_stats.drive_reset <
1781
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
10002 0xffffffffffffffffULL)
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10003 sdinfo->satadrv_stats.drive_reset++;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10004 sdinfo->satadrv_event_flags |=
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10005 SATA_EVNT_DEVICE_RESET;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10006 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10007 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10008 if ((event & ~SATA_EVNT_DEVICE_RESET) != 0) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10009 /* Invalid event for a device */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10010 (void) sprintf(buf2, err_msg_evnt_2,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10011 event & ~SATA_EVNT_DRIVE_EVENTS);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10012 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10013 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10014 } else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10015 if (saddr->qual != SATA_ADDR_NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10016 /* Wrong address qualifier */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10017 SATA_LOG_D((sata_hba_inst, CE_WARN,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10018 "sata_hba_event_notify: invalid address 0x%x",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10019 *(uint32_t *)saddr));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10020 return;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10021 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10022 if ((event & SATA_EVNT_CONTROLLER_EVENTS) == 0 ||
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10023 (event & ~SATA_EVNT_CONTROLLER_EVENTS) != 0) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10024 /* Invalid event for the controller */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10025 SATA_LOG_D((sata_hba_inst, CE_WARN,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10026 "sata_hba_event_notify: invalid event 0x%x for "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10027 "controller",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10028 event & SATA_EVNT_CONTROLLER_EVENTS));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10029 return;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10030 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10031 buf1[0] = '\0';
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10032 /* This may be a frequent and not interesting event */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10033 SATADBG1(SATA_DBG_EVENTS, sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10034 "controller power level changed\n", NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10035
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10036 mutex_enter(&sata_hba_inst->satahba_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10037 if (sata_hba_inst->satahba_stats.ctrl_pwr_change <
1781
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
10038 0xffffffffffffffffULL)
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10039 sata_hba_inst->satahba_stats.ctrl_pwr_change++;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10040
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10041 sata_hba_inst->satahba_event_flags |=
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10042 SATA_EVNT_PWR_LEVEL_CHANGED;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10043 mutex_exit(&sata_hba_inst->satahba_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10044 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10045 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10046 * If we got here, there is something to do with this HBA
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10047 * instance.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10048 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10049 mutex_enter(&sata_hba_inst->satahba_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10050 sata_hba_inst->satahba_event_flags |= SATA_EVNT_MAIN;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10051 mutex_exit(&sata_hba_inst->satahba_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10052 mutex_enter(&sata_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10053 sata_event_pending |= SATA_EVNT_MAIN; /* global event indicator */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10054 mutex_exit(&sata_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10055
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10056 /* Tickle event thread */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10057 mutex_enter(&sata_event_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10058 if (sata_event_thread_active == 0)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10059 cv_signal(&sata_event_cv);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10060 mutex_exit(&sata_event_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10061
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10062 event_info:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10063 if (buf1[0] != '\0') {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10064 lcp = strrchr(buf1, ',');
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10065 if (lcp != NULL)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10066 *lcp = '\0';
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10067 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10068 if (saddr->qual == SATA_ADDR_CPORT ||
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10069 saddr->qual == SATA_ADDR_DCPORT) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10070 if (buf1[0] != '\0') {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10071 sata_log(sata_hba_inst, CE_NOTE, "port %d: %s\n",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10072 cport, buf1);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10073 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10074 if (buf2[0] != '\0') {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10075 sata_log(sata_hba_inst, CE_NOTE, "port %d: %s\n",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10076 cport, buf2);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10077 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10078 } else if (saddr->qual == SATA_ADDR_PMPORT ||
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10079 saddr->qual == SATA_ADDR_DPMPORT) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10080 if (buf1[0] != '\0') {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10081 sata_log(sata_hba_inst, CE_NOTE,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10082 "port %d pmport %d: %s\n", cport, pmport, buf1);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10083 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10084 if (buf2[0] != '\0') {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10085 sata_log(sata_hba_inst, CE_NOTE,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10086 "port %d pmport %d: %s\n", cport, pmport, buf2);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10087 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10088 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10089 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10090
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10091
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10092 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10093 * Event processing thread.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10094 * Arg is a pointer to the sata_hba_list pointer.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10095 * 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
10096 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10097 static void
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10098 sata_event_daemon(void *arg)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10099 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10100 #ifndef __lock_lint
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10101 _NOTE(ARGUNUSED(arg))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10102 #endif
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10103 sata_hba_inst_t *sata_hba_inst;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10104 clock_t lbolt;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10105
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10106 SATADBG1(SATA_DBG_EVENTS_DAEMON, NULL,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10107 "SATA event daemon started\n", NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10108 loop:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10109 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10110 * Process events here. Walk through all registered HBAs
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10111 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10112 mutex_enter(&sata_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10113 for (sata_hba_inst = sata_hba_list; sata_hba_inst != NULL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10114 sata_hba_inst = sata_hba_inst->satahba_next) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10115 ASSERT(sata_hba_inst != NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10116 mutex_enter(&sata_hba_inst->satahba_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10117 if (sata_hba_inst->satahba_attached != 1 ||
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10118 (sata_hba_inst->satahba_event_flags &
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10119 SATA_EVNT_SKIP) != 0) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10120 mutex_exit(&sata_hba_inst->satahba_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10121 continue;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10122 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10123 if (sata_hba_inst->satahba_event_flags & SATA_EVNT_MAIN) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10124 sata_hba_inst->satahba_event_flags |= SATA_EVNT_SKIP;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10125 mutex_exit(&sata_hba_inst->satahba_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10126 mutex_exit(&sata_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10127 /* Got the controller with pending event */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10128 sata_process_controller_events(sata_hba_inst);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10129 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10130 * Since global mutex was released, there is a
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10131 * possibility that HBA list has changed, so start
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10132 * over from the top. Just processed controller
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10133 * will be passed-over because of the SKIP flag.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10134 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10135 goto loop;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10136 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10137 mutex_exit(&sata_hba_inst->satahba_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10138 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10139 /* Clear SKIP flag in all controllers */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10140 for (sata_hba_inst = sata_hba_list; sata_hba_inst != NULL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10141 sata_hba_inst = sata_hba_inst->satahba_next) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10142 mutex_enter(&sata_hba_inst->satahba_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10143 sata_hba_inst->satahba_event_flags &= ~SATA_EVNT_SKIP;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10144 mutex_exit(&sata_hba_inst->satahba_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10145 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10146 mutex_exit(&sata_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10147
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10148 SATADBG1(SATA_DBG_EVENTS_DAEMON, NULL,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10149 "SATA EVENT DAEMON suspending itself", NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10150
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10151 #ifdef SATA_DEBUG
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10152 if ((sata_func_enable & SATA_ENABLE_PROCESS_EVENTS) == 0) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10153 sata_log(sata_hba_inst, CE_WARN,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10154 "SATA EVENTS PROCESSING DISABLED\n");
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10155 thread_exit(); /* Daemon will not run again */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10156 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10157 #endif
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10158 mutex_enter(&sata_event_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10159 sata_event_thread_active = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10160 mutex_exit(&sata_event_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10161 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10162 * 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
10163 * wait timeout. Exit if there is a termination request (driver
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10164 * unload).
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10165 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10166 do {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10167 lbolt = ddi_get_lbolt();
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10168 lbolt += drv_usectohz(SATA_EVNT_DAEMON_SLEEP_TIME);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10169 mutex_enter(&sata_event_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10170 (void) cv_timedwait(&sata_event_cv, &sata_event_mutex, lbolt);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10171
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10172 if (sata_event_thread_active != 0) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10173 mutex_exit(&sata_event_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10174 continue;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10175 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10176
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10177 /* Check if it is time to go away */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10178 if (sata_event_thread_terminate == 1) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10179 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10180 * It is up to the thread setting above flag to make
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10181 * sure that this thread is not killed prematurely.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10182 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10183 sata_event_thread_terminate = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10184 sata_event_thread = NULL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10185 mutex_exit(&sata_event_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10186 SATADBG1(SATA_DBG_EVENTS_DAEMON, NULL,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10187 "SATA_EVENT_DAEMON_TERMINATING", NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10188 thread_exit(); { _NOTE(NOT_REACHED) }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10189 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10190 mutex_exit(&sata_event_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10191 } while (!(sata_event_pending & SATA_EVNT_MAIN));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10192
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10193 mutex_enter(&sata_event_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10194 sata_event_thread_active = 1;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10195 mutex_exit(&sata_event_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10196
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10197 mutex_enter(&sata_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10198 sata_event_pending &= ~SATA_EVNT_MAIN;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10199 mutex_exit(&sata_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10200
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10201 SATADBG1(SATA_DBG_EVENTS_DAEMON, NULL,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10202 "SATA EVENT DAEMON READY TO PROCESS EVENT", NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10203
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10204 goto loop;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10205 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10206
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10207 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10208 * Specific HBA instance event processing.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10209 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10210 * NOTE: At the moment, device event processing is limited to hard disks
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10211 * only.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10212 * cports only are supported - no pmports.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10213 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10214 static void
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10215 sata_process_controller_events(sata_hba_inst_t *sata_hba_inst)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10216 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10217 int ncport;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10218 uint32_t event_flags;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10219 sata_address_t *saddr;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10220
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10221 SATADBG1(SATA_DBG_EVENTS_CNTRL, sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10222 "Processing controller %d event(s)",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10223 ddi_get_instance(SATA_DIP(sata_hba_inst)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10224
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10225 mutex_enter(&sata_hba_inst->satahba_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10226 sata_hba_inst->satahba_event_flags &= ~SATA_EVNT_MAIN;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10227 event_flags = sata_hba_inst->satahba_event_flags;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10228 mutex_exit(&sata_hba_inst->satahba_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10229 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10230 * Process controller power change first
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10231 * HERE
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10232 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10233 if (event_flags & SATA_EVNT_PWR_LEVEL_CHANGED)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10234 sata_process_cntrl_pwr_level_change(sata_hba_inst);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10235
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10236 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10237 * Search through ports/devices to identify affected port/device.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10238 * We may have to process events for more than one port/device.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10239 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10240 for (ncport = 0; ncport < SATA_NUM_CPORTS(sata_hba_inst); ncport++) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10241 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst, ncport)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10242 event_flags = (SATA_CPORT_INFO(sata_hba_inst, ncport))->
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10243 cport_event_flags;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10244 /* Check if port was locked by IOCTL processing */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10245 if (event_flags & SATA_APCTL_LOCK_PORT_BUSY) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10246 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10247 * We ignore port events because port is busy
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10248 * with AP control processing. Set again
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10249 * controller and main event flag, so that
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10250 * events may be processed by the next daemon
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10251 * run.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10252 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10253 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, ncport)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10254 mutex_enter(&sata_hba_inst->satahba_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10255 sata_hba_inst->satahba_event_flags |= SATA_EVNT_MAIN;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10256 mutex_exit(&sata_hba_inst->satahba_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10257 mutex_enter(&sata_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10258 sata_event_pending |= SATA_EVNT_MAIN;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10259 mutex_exit(&sata_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10260 SATADBG1(SATA_DBG_EVENTS_PROCPST, sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10261 "Event processing postponed until "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10262 "AP control processing completes",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10263 NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10264 /* Check other ports */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10265 continue;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10266 } else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10267 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10268 * Set BSY flag so that AP control would not
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10269 * interfere with events processing for
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10270 * this port.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10271 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10272 (SATA_CPORT_INFO(sata_hba_inst, ncport))->
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10273 cport_event_flags |= SATA_EVNT_LOCK_PORT_BUSY;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10274 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10275 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, ncport)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10276
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10277 saddr = &(SATA_CPORT_INFO(sata_hba_inst, ncport))->cport_addr;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10278
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10279 if ((event_flags &
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10280 (SATA_EVNT_PORT_EVENTS | SATA_EVNT_DRIVE_EVENTS)) != 0) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10281 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10282 * Got port event.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10283 * We need some hierarchy of event processing as they
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10284 * are affecting each other:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10285 * 1. port failed
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10286 * 2. device detached/attached
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10287 * 3. link events - link events may trigger device
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10288 * detached or device attached events in some
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10289 * circumstances.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10290 * 4. port power level changed
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10291 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10292 if (event_flags & SATA_EVNT_PORT_FAILED) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10293 sata_process_port_failed_event(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10294 saddr);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10295 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10296 if (event_flags & SATA_EVNT_DEVICE_DETACHED) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10297 sata_process_device_detached(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10298 saddr);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10299 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10300 if (event_flags & SATA_EVNT_DEVICE_ATTACHED) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10301 sata_process_device_attached(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10302 saddr);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10303 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10304 if (event_flags &
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10305 (SATA_EVNT_LINK_ESTABLISHED |
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10306 SATA_EVNT_LINK_LOST)) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10307 sata_process_port_link_events(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10308 saddr);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10309 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10310 if (event_flags & SATA_EVNT_PWR_LEVEL_CHANGED) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10311 sata_process_port_pwr_change(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10312 saddr);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10313 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10314 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10315 if (SATA_CPORT_DEV_TYPE(sata_hba_inst, ncport) !=
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10316 SATA_DTYPE_NONE) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10317 /* May have device event */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10318 sata_process_device_reset(sata_hba_inst, saddr);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10319 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10320 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst, ncport)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10321 /* Release PORT_BUSY flag */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10322 (SATA_CPORT_INFO(sata_hba_inst, ncport))->
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10323 cport_event_flags &= ~SATA_EVNT_LOCK_PORT_BUSY;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10324 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, ncport)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10325
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10326 } /* End of loop through the controller SATA ports */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10327 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10328
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10329 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10330 * Process HBA power level change reported by HBA driver.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10331 * Not implemented at this time - event is ignored.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10332 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10333 static void
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10334 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
10335 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10336 SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10337 "Processing controller power level change", NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10338
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10339 /* Ignoring it for now */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10340 mutex_enter(&sata_hba_inst->satahba_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10341 sata_hba_inst->satahba_event_flags &= ~SATA_EVNT_PWR_LEVEL_CHANGED;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10342 mutex_exit(&sata_hba_inst->satahba_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10343 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10344
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10345 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10346 * Process port power level change reported by HBA driver.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10347 * Not implemented at this time - event is ignored.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10348 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10349 static void
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10350 sata_process_port_pwr_change(sata_hba_inst_t *sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10351 sata_address_t *saddr)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10352 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10353 sata_cport_info_t *cportinfo;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10354
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10355 SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10356 "Processing port power level change", NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10357
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10358 cportinfo = SATA_CPORT_INFO(sata_hba_inst, saddr->cport);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10359 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10360 /* Reset event flag */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10361 cportinfo->cport_event_flags &= ~SATA_EVNT_PWR_LEVEL_CHANGED;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10362 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10363 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10364
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10365 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10366 * Process port failure reported by HBA driver.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10367 * cports support only - no pmports.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10368 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10369 static void
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10370 sata_process_port_failed_event(sata_hba_inst_t *sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10371 sata_address_t *saddr)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10372 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10373 sata_cport_info_t *cportinfo;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10374
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10375 cportinfo = SATA_CPORT_INFO(sata_hba_inst, saddr->cport);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10376 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10377 /* Reset event flag first */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10378 cportinfo->cport_event_flags &= ~SATA_EVNT_PORT_FAILED;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10379 /* If the port is in SHUTDOWN or FAILED state, ignore this event. */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10380 if ((cportinfo->cport_state &
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10381 (SATA_PSTATE_SHUTDOWN | SATA_PSTATE_FAILED)) == 0) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10382 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10383 cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10384 return;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10385 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10386 /* Fail the port */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10387 cportinfo->cport_state = SATA_PSTATE_FAILED;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10388 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10389 sata_log(sata_hba_inst, CE_WARN, "port %d failed", saddr->cport);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10390 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10391
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10392 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10393 * Device Reset Event processing.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10394 * The seqeunce is managed by 3 stage flags:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10395 * - reset event reported,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10396 * - reset event being processed,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10397 * - request to clear device reset state.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10398 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10399 static void
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10400 sata_process_device_reset(sata_hba_inst_t *sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10401 sata_address_t *saddr)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10402 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10403 sata_drive_info_t old_sdinfo; /* local copy of the drive info */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10404 sata_drive_info_t *sdinfo;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10405 sata_cport_info_t *cportinfo;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10406 sata_device_t sata_device;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10407 int rval;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10408
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10409 /* We only care about host sata cport for now */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10410 cportinfo = SATA_CPORT_INFO(sata_hba_inst, saddr->cport);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10411
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10412 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10413
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10414 /* If the port is in SHUTDOWN or FAILED state, ignore reset event. */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10415 if ((cportinfo->cport_state &
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10416 (SATA_PSTATE_SHUTDOWN | SATA_PSTATE_FAILED)) != 0) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10417 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10418 cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10419 return;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10420 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10421
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10422 if ((SATA_CPORT_DEV_TYPE(sata_hba_inst, saddr->cport) &
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10423 SATA_VALID_DEV_TYPE) == 0) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10424 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10425 cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10426 return;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10427 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10428 sdinfo = SATA_CPORT_DRV_INFO(sata_hba_inst, saddr->cport);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10429 if (sdinfo == NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10430 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10431 cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10432 return;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10433 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10434
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10435 if ((sdinfo->satadrv_event_flags & SATA_EVNT_DEVICE_RESET) == 0) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10436 /* Nothing to do */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10437 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10438 cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10439 return;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10440 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10441
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10442 SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10443 "Processing port %d device reset", saddr->cport);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10444
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10445 if (sdinfo->satadrv_event_flags & SATA_EVNT_INPROC_DEVICE_RESET) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10446 /* Something is weird - new device reset event */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10447 SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10448 "Overlapping device reset events!", NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10449 /* Just leave */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10450 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10451 cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10452 return;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10453 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10454
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10455 /* Clear event flag */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10456 sdinfo->satadrv_event_flags &= ~SATA_EVNT_DEVICE_RESET;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10457
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10458 /* It seems that we always need to check the port state first */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10459 sata_device.satadev_rev = SATA_DEVICE_REV;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10460 sata_device.satadev_addr = *saddr;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10461 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10462 * We have to exit mutex, because the HBA probe port function may
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10463 * block on its own mutex.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10464 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10465 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10466 rval = (*SATA_PROBE_PORT_FUNC(sata_hba_inst))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10467 (SATA_DIP(sata_hba_inst), &sata_device);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10468 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10469 sata_update_port_info(sata_hba_inst, &sata_device);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10470 if (rval != SATA_SUCCESS) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10471 /* Something went wrong? Fail the port */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10472 cportinfo->cport_state = SATA_PSTATE_FAILED;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10473 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10474 cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10475 SATA_LOG_D((sata_hba_inst, CE_WARN, "Port %d probing failed",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10476 saddr->cport));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10477 return;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10478 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10479 if ((sata_device.satadev_scr.sstatus &
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10480 SATA_PORT_DEVLINK_UP_MASK) !=
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10481 SATA_PORT_DEVLINK_UP ||
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10482 sata_device.satadev_type == SATA_DTYPE_NONE) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10483 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10484 * No device to process, anymore. Some other event processing
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10485 * would or have already performed port info cleanup.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10486 * To be safe (HBA may need it), request clearing device
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10487 * reset condition.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10488 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10489 sdinfo->satadrv_event_flags = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10490 sdinfo->satadrv_event_flags |= SATA_EVNT_CLEAR_DEVICE_RESET;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10491 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10492 cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10493 return;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10494 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10495
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10496 /* Mark device reset processing as active */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10497 sdinfo->satadrv_event_flags |= SATA_EVNT_INPROC_DEVICE_RESET;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10498
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10499 old_sdinfo = *sdinfo; /* local copy of the drive info */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10500 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10501
1781
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
10502 if (sata_set_drive_features(sata_hba_inst, &old_sdinfo, 1) ==
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10503 SATA_FAILURE) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10504 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10505 * Restoring drive setting failed.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10506 * Probe the port first, to check if the port state has changed
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10507 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10508 sata_device.satadev_rev = SATA_DEVICE_REV;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10509 sata_device.satadev_addr = *saddr;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10510 sata_device.satadev_addr.qual = SATA_ADDR_CPORT;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10511 /* probe port */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10512 rval = (*SATA_PROBE_PORT_FUNC(sata_hba_inst))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10513 (SATA_DIP(sata_hba_inst), &sata_device);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10514 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10515 cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10516 if (rval == SATA_SUCCESS &&
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10517 (sata_device.satadev_state &
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10518 (SATA_PSTATE_SHUTDOWN | SATA_PSTATE_FAILED)) == 0 &&
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10519 (sata_device.satadev_scr.sstatus &
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10520 SATA_PORT_DEVLINK_UP_MASK) == SATA_PORT_DEVLINK_UP &&
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10521 (sata_device.satadev_type & SATA_DTYPE_ATADISK) != 0) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10522 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10523 * We may retry this a bit later - reinstate reset
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10524 * condition
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10525 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10526 if ((cportinfo->cport_dev_type &
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10527 SATA_VALID_DEV_TYPE) != 0 &&
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10528 SATA_CPORTINFO_DRV_INFO(cportinfo) != NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10529 sdinfo = SATA_CPORTINFO_DRV_INFO(cportinfo);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10530 sdinfo->satadrv_event_flags |=
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10531 SATA_EVNT_DEVICE_RESET;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10532 sdinfo->satadrv_event_flags &=
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10533 ~SATA_EVNT_INPROC_DEVICE_RESET;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10534 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10535 saddr->cport)->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10536 mutex_enter(&sata_hba_inst->satahba_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10537 sata_hba_inst->satahba_event_flags |=
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10538 SATA_EVNT_MAIN;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10539 mutex_exit(&sata_hba_inst->satahba_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10540 return;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10541 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10542 } else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10543 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10544 * No point of retrying - some other event processing
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10545 * would or already did port info cleanup.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10546 * To be safe (HBA may need it),
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10547 * request clearing device reset condition.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10548 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10549 sdinfo->satadrv_event_flags = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10550 sdinfo->satadrv_event_flags |=
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10551 SATA_EVNT_CLEAR_DEVICE_RESET;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10552 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10553 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10554 cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10555 return;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10556 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10557
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10558 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10559 * Raise the flag indicating that the next sata command could
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10560 * 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
10561 * reset is reported.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10562 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10563 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10564 if ((cportinfo->cport_dev_type & SATA_VALID_DEV_TYPE) != 0 &&
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10565 SATA_CPORTINFO_DRV_INFO(cportinfo) != NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10566 sdinfo = SATA_CPORTINFO_DRV_INFO(cportinfo);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10567 sdinfo->satadrv_event_flags &= ~SATA_EVNT_INPROC_DEVICE_RESET;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10568 sdinfo->satadrv_event_flags |= SATA_EVNT_CLEAR_DEVICE_RESET;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10569 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10570 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10571 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10572
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10573
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10574 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10575 * Port Link Events processing.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10576 * Every link established event may involve device reset (due to
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10577 * COMRESET signal, equivalent of the hard reset) so arbitrarily
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10578 * set device reset event for an attached device (if any).
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10579 * If the port is in SHUTDOWN or FAILED state, ignore link events.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10580 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10581 * The link established event processing varies, depending on the state
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10582 * of the target node, HBA hotplugging capabilities, state of the port.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10583 * If the link is not active, the link established event is ignored.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10584 * If HBA cannot detect device attachment and there is no target node,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10585 * the link established event triggers device attach event processing.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10586 * Else, link established event triggers device reset event processing.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10587 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10588 * The link lost event processing varies, depending on a HBA hotplugging
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10589 * capability and the state of the port (link active or not active).
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10590 * If the link is active, the lost link event is ignored.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10591 * If HBA cannot detect device removal, the lost link event triggers
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10592 * device detached event processing after link lost timeout.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10593 * Else, the event is ignored.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10594 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10595 * 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
10596 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10597 static void
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10598 sata_process_port_link_events(sata_hba_inst_t *sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10599 sata_address_t *saddr)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10600 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10601 sata_device_t sata_device;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10602 sata_cport_info_t *cportinfo;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10603 sata_drive_info_t *sdinfo;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10604 int event_flags;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10605 int rval;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10606
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10607 SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10608 "Processing port %d link event(s)", saddr->cport);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10609
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10610 cportinfo = SATA_CPORT_INFO(sata_hba_inst, saddr->cport);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10611 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10612 event_flags = cportinfo->cport_event_flags;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10613
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10614 /* Reset event flags first */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10615 cportinfo->cport_event_flags &=
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10616 ~(SATA_EVNT_LINK_ESTABLISHED | SATA_EVNT_LINK_LOST);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10617
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10618 /* If the port is in SHUTDOWN or FAILED state, ignore link events. */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10619 if ((cportinfo->cport_state &
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10620 (SATA_PSTATE_SHUTDOWN | SATA_PSTATE_FAILED)) != 0) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10621 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10622 cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10623 return;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10624 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10625
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10626 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10627 * For the sanity sake get current port state.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10628 * Set device address only. Other sata_device fields should be
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10629 * set by HBA driver.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10630 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10631 sata_device.satadev_rev = SATA_DEVICE_REV;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10632 sata_device.satadev_addr = *saddr;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10633 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10634 * We have to exit mutex, because the HBA probe port function may
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10635 * block on its own mutex.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10636 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10637 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10638 rval = (*SATA_PROBE_PORT_FUNC(sata_hba_inst))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10639 (SATA_DIP(sata_hba_inst), &sata_device);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10640 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10641 sata_update_port_info(sata_hba_inst, &sata_device);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10642 if (rval != SATA_SUCCESS) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10643 /* Something went wrong? Fail the port */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10644 cportinfo->cport_state = SATA_PSTATE_FAILED;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10645 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10646 cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10647 SATA_LOG_D((sata_hba_inst, CE_WARN, "Port %d probing failed",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10648 saddr->cport));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10649 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10650 * We may want to release device info structure, but
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10651 * it is not necessary.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10652 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10653 return;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10654 } else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10655 /* port probed successfully */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10656 cportinfo->cport_state |= SATA_STATE_PROBED | SATA_STATE_READY;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10657 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10658 if (event_flags & SATA_EVNT_LINK_ESTABLISHED) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10659
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10660 if ((sata_device.satadev_scr.sstatus &
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10661 SATA_PORT_DEVLINK_UP_MASK) != SATA_PORT_DEVLINK_UP) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10662 /* Ignore event */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10663 SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10664 "Ignoring port %d link established event - "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10665 "link down",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10666 saddr->cport);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10667 goto linklost;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10668 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10669
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10670 SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10671 "Processing port %d link established event",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10672 saddr->cport);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10673
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10674 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10675 * For the sanity sake check if a device is attached - check
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10676 * return state of a port probing.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10677 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10678 if (sata_device.satadev_type != SATA_DTYPE_NONE &&
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10679 sata_device.satadev_type != SATA_DTYPE_PMULT) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10680 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10681 * HBA port probe indicated that there is a device
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10682 * attached. Check if the framework had device info
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10683 * structure attached for this device.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10684 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10685 if (cportinfo->cport_dev_type != SATA_DTYPE_NONE) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10686 ASSERT(SATA_CPORTINFO_DRV_INFO(cportinfo) !=
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10687 NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10688
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10689 sdinfo = SATA_CPORTINFO_DRV_INFO(cportinfo);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10690 if ((sdinfo->satadrv_type &
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10691 SATA_VALID_DEV_TYPE) != 0) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10692 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10693 * Dev info structure is present.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10694 * If dev_type is set to known type in
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10695 * the framework's drive info struct
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10696 * then the device existed before and
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10697 * the link was probably lost
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10698 * momentarily - in such case
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10699 * we may want to check device
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10700 * identity.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10701 * Identity check is not supported now.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10702 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10703 * Link established event
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10704 * triggers device reset event.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10705 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10706 (SATA_CPORTINFO_DRV_INFO(cportinfo))->
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10707 satadrv_event_flags |=
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10708 SATA_EVNT_DEVICE_RESET;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10709 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10710 } else if (cportinfo->cport_dev_type ==
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10711 SATA_DTYPE_NONE) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10712 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10713 * We got new device attached! If HBA does not
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10714 * generate device attached events, trigger it
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10715 * here.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10716 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10717 if (!(SATA_FEATURES(sata_hba_inst) &
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10718 SATA_CTLF_HOTPLUG)) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10719 cportinfo->cport_event_flags |=
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10720 SATA_EVNT_DEVICE_ATTACHED;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10721 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10722 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10723 /* Reset link lost timeout */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10724 cportinfo->cport_link_lost_time = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10725 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10726 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10727 linklost:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10728 if (event_flags & SATA_EVNT_LINK_LOST) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10729 if ((sata_device.satadev_scr.sstatus &
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10730 SATA_PORT_DEVLINK_UP_MASK) == SATA_PORT_DEVLINK_UP) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10731 /* Ignore event */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10732 SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10733 "Ignoring port %d link lost event - link is up",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10734 saddr->cport);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10735 goto done;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10736 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10737 #ifdef SATA_DEBUG
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10738 if (cportinfo->cport_link_lost_time == 0) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10739 SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10740 "Processing port %d link lost event",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10741 saddr->cport);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10742 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10743 #endif
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10744 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10745 * When HBA cannot generate device attached/detached events,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10746 * we need to track link lost time and eventually generate
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10747 * device detach event.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10748 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10749 if (!(SATA_FEATURES(sata_hba_inst) & SATA_CTLF_HOTPLUG)) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10750 /* We are tracking link lost time */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10751 if (cportinfo->cport_link_lost_time == 0) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10752 /* save current time (lbolt value) */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10753 cportinfo->cport_link_lost_time =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10754 ddi_get_lbolt();
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10755 /* just keep link lost event */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10756 cportinfo->cport_event_flags |=
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10757 SATA_EVNT_LINK_LOST;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10758 } else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10759 clock_t cur_time = ddi_get_lbolt();
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10760 if ((cur_time -
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10761 cportinfo->cport_link_lost_time) >=
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10762 drv_usectohz(
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10763 SATA_EVNT_LINK_LOST_TIMEOUT)) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10764 /* trigger device detach event */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10765 cportinfo->cport_event_flags |=
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10766 SATA_EVNT_DEVICE_DETACHED;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10767 cportinfo->cport_link_lost_time = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10768 SATADBG1(SATA_DBG_EVENTS,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10769 sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10770 "Triggering port %d "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10771 "device detached event",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10772 saddr->cport);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10773 } else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10774 /* keep link lost event */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10775 cportinfo->cport_event_flags |=
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10776 SATA_EVNT_LINK_LOST;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10777 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10778 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10779 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10780 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10781 * We could change port state to disable/delay access to
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10782 * the attached device until the link is recovered.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10783 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10784 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10785 done:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10786 event_flags = cportinfo->cport_event_flags;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10787 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10788 if (event_flags != 0) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10789 mutex_enter(&sata_hba_inst->satahba_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10790 sata_hba_inst->satahba_event_flags |= SATA_EVNT_MAIN;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10791 mutex_exit(&sata_hba_inst->satahba_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10792 mutex_enter(&sata_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10793 sata_event_pending |= SATA_EVNT_MAIN;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10794 mutex_exit(&sata_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10795 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10796 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10797
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10798 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10799 * Device Detached Event processing.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10800 * 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
10801 * the device info structure is detached from the SATA port info structure
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10802 * and released.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10803 * Port status is updated.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10804 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10805 * NOTE: Process cports event only, no port multiplier ports.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10806 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10807 static void
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10808 sata_process_device_detached(sata_hba_inst_t *sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10809 sata_address_t *saddr)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10810 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10811 sata_cport_info_t *cportinfo;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10812 sata_drive_info_t *sdevinfo;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10813 sata_device_t sata_device;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10814 dev_info_t *tdip;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10815 int rval;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10816
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10817 SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10818 "Processing port %d device detached", saddr->cport);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10819
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10820 cportinfo = SATA_CPORT_INFO(sata_hba_inst, saddr->cport);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10821 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10822 /* Clear event flag */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10823 cportinfo->cport_event_flags &= ~SATA_EVNT_DEVICE_DETACHED;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10824
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10825 /* If the port is in SHUTDOWN or FAILED state, ignore detach event. */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10826 if ((cportinfo->cport_state &
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10827 (SATA_PSTATE_SHUTDOWN | SATA_PSTATE_FAILED)) != 0) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10828 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10829 cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10830 return;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10831 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10832 /* For sanity, re-probe the port */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10833 sata_device.satadev_rev = SATA_DEVICE_REV;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10834 sata_device.satadev_addr = *saddr;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10835
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10836 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10837 * We have to exit mutex, because the HBA probe port function may
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10838 * block on its own mutex.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10839 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10840 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10841 rval = (*SATA_PROBE_PORT_FUNC(sata_hba_inst))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10842 (SATA_DIP(sata_hba_inst), &sata_device);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10843 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10844 sata_update_port_info(sata_hba_inst, &sata_device);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10845 if (rval != SATA_SUCCESS) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10846 /* Something went wrong? Fail the port */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10847 cportinfo->cport_state = SATA_PSTATE_FAILED;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10848 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10849 cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10850 SATA_LOG_D((sata_hba_inst, CE_WARN, "Port %d probing failed",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10851 saddr->cport));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10852 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10853 * We may want to release device info structure, but
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10854 * it is not necessary.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10855 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10856 return;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10857 } else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10858 /* port probed successfully */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10859 cportinfo->cport_state |= SATA_STATE_PROBED | SATA_STATE_READY;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10860 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10861 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10862 * Check if a device is still attached. For sanity, check also
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10863 * link status - if no link, there is no device.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10864 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10865 if ((sata_device.satadev_scr.sstatus & SATA_PORT_DEVLINK_UP_MASK) ==
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10866 SATA_PORT_DEVLINK_UP && sata_device.satadev_type !=
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10867 SATA_DTYPE_NONE) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10868 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10869 * Device is still attached - ignore detach event.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10870 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10871 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10872 cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10873 SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10874 "Ignoring detach - device still attached to port %d",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10875 sata_device.satadev_addr.cport);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10876 return;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10877 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10878 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10879 * We need to detach and release device info structure here
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10880 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10881 if (SATA_CPORTINFO_DRV_INFO(cportinfo) != NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10882 sdevinfo = SATA_CPORTINFO_DRV_INFO(cportinfo);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10883 SATA_CPORTINFO_DRV_INFO(cportinfo) = NULL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10884 (void) kmem_free((void *)sdevinfo,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10885 sizeof (sata_drive_info_t));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10886 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10887 cportinfo->cport_dev_type = SATA_DTYPE_NONE;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10888 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10889 * Device cannot be reached anymore, even if the target node may be
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10890 * still present.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10891 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10892
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10893 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10894 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
10895 sata_device.satadev_addr.cport);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10896
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10897 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10898 * 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
10899 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10900 tdip = sata_get_target_dip(SATA_DIP(sata_hba_inst), saddr->cport);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10901 if (tdip != NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10902 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10903 * target node exist - unconfigure device first, then remove
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10904 * the node
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10905 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10906 if (ndi_devi_offline(tdip, NDI_UNCONFIG) != NDI_SUCCESS) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10907 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10908 * PROBLEM - no device, but target node remained
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10909 * This happens when the file was open or node was
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10910 * waiting for resources.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10911 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10912 SATA_LOG_D((sata_hba_inst, CE_WARN,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10913 "sata_process_device_detached: "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10914 "Failed to unconfigure removed device."));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10915 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10916 if (ndi_devi_offline(tdip, NDI_DEVI_REMOVE) != NDI_SUCCESS) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10917 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10918 * PROBLEM - no device, but target node remained
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10919 * This happens when the file was open or node was
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10920 * waiting for resources.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10921 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10922 SATA_LOG_D((sata_hba_inst, CE_WARN,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10923 "sata_process_device_detached: "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10924 "Failed to remove target node for "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10925 "removed device."));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10926 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10927 }
1529
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
10928 /*
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
10929 * Generate sysevent - EC_DR / ESC_DR_AP_STATE_CHANGE
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
10930 * with the hint: SE_HINT_REMOVE
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
10931 */
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
10932 sata_gen_sysevent(sata_hba_inst, saddr, SE_HINT_REMOVE);
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10933 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10934
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10935
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10936 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10937 * Device Attached Event processing.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10938 * 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
10939 * 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
10940 * structure.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10941 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10942 * This function cannot be called in interrupt context (it may sleep).
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10943 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10944 * NOTE: Process cports event only, no port multiplier ports.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10945 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10946 static void
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10947 sata_process_device_attached(sata_hba_inst_t *sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10948 sata_address_t *saddr)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10949 {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10950 sata_cport_info_t *cportinfo;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10951 sata_drive_info_t *sdevinfo;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10952 sata_device_t sata_device;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10953 dev_info_t *tdip;
1529
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
10954 int rval;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10955
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10956 SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10957 "Processing port %d device attached", saddr->cport);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10958
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10959 cportinfo = SATA_CPORT_INFO(sata_hba_inst, saddr->cport);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10960 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10961
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10962 /* Clear event flag first */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10963 cportinfo->cport_event_flags &= ~SATA_EVNT_DEVICE_ATTACHED;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10964 /* If the port is in SHUTDOWN or FAILED state, ignore event. */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10965 if ((cportinfo->cport_state &
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10966 (SATA_PSTATE_SHUTDOWN | SATA_PSTATE_FAILED)) != 0) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10967 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10968 cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10969 return;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10970 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10971
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10972 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10973 * 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
10974 * something went wrong in the event reporting and processing sequence.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10975 * To recover, arbitrarily release device info structure and issue
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10976 * a warning.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10977 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10978 if (SATA_CPORTINFO_DRV_INFO(cportinfo) != NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10979 sdevinfo = SATA_CPORTINFO_DRV_INFO(cportinfo);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10980 SATA_CPORTINFO_DRV_INFO(cportinfo) = NULL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10981 (void) kmem_free((void *)sdevinfo,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10982 sizeof (sata_drive_info_t));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10983 SATA_LOG_D((sata_hba_inst, CE_WARN,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10984 "Arbitrarily detaching old device info."));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10985 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10986 cportinfo->cport_dev_type = SATA_DTYPE_NONE;
1529
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
10987
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
10988 /* For sanity, re-probe the port */
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
10989 sata_device.satadev_rev = SATA_DEVICE_REV;
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
10990 sata_device.satadev_addr = *saddr;
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
10991
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
10992 /*
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
10993 * We have to exit mutex, because the HBA probe port function may
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
10994 * block on its own mutex.
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
10995 */
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
10996 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
1529
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
10997 rval = (*SATA_PROBE_PORT_FUNC(sata_hba_inst))
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
10998 (SATA_DIP(sata_hba_inst), &sata_device);
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
10999 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
11000 sata_update_port_info(sata_hba_inst, &sata_device);
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
11001 if (rval != SATA_SUCCESS) {
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
11002 /* Something went wrong? Fail the port */
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
11003 cportinfo->cport_state = SATA_PSTATE_FAILED;
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
11004 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
11005 cport_mutex);
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
11006 SATA_LOG_D((sata_hba_inst, CE_WARN, "Port %d probing failed",
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
11007 saddr->cport));
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
11008 return;
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
11009 } else {
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
11010 /* port probed successfully */
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
11011 cportinfo->cport_state |= SATA_STATE_PROBED | SATA_STATE_READY;
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
11012 }
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
11013 /*
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
11014 * Check if a device is still attached. For sanity, check also
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
11015 * link status - if no link, there is no device.
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
11016 */
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
11017 if ((sata_device.satadev_scr.sstatus & SATA_PORT_DEVLINK_UP_MASK) !=
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
11018 SATA_PORT_DEVLINK_UP || sata_device.satadev_type ==
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
11019 SATA_DTYPE_NONE) {
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
11020 /*
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
11021 * No device - ignore attach event.
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
11022 */
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
11023 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
11024 cport_mutex);
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
11025 SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
11026 "Ignoring attach - no device connected to port %d",
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
11027 sata_device.satadev_addr.cport);
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
11028 return;
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
11029 }
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
11030
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
11031 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
11032 /*
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
11033 * Generate sysevent - EC_DR / ESC_DR_AP_STATE_CHANGE
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
11034 * with the hint: SE_HINT_INSERT
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
11035 */
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
11036 sata_gen_sysevent(sata_hba_inst, saddr, SE_HINT_INSERT);
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
11037
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11038 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11039 * Make sure that there is no target node for that device.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11040 * If so, release it. It should not happen, unless we had problem
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11041 * removing the node when device was detached.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11042 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11043 tdip = sata_get_target_dip(SATA_DIP(sata_hba_inst), saddr->cport);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11044 if (tdip != NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11045
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11046 SATA_LOG_D((sata_hba_inst, CE_WARN,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11047 "sata_process_device_attached: "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11048 "old device target node exists!!!"));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11049 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11050 * target node exist - unconfigure device first, then remove
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11051 * the node
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11052 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11053 if (ndi_devi_offline(tdip, NDI_UNCONFIG) != NDI_SUCCESS) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11054 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11055 * PROBLEM - no device, but target node remained
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11056 * This happens when the file was open or node was
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11057 * waiting for resources.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11058 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11059 SATA_LOG_D((sata_hba_inst, CE_WARN,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11060 "sata_process_device_attached: "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11061 "Failed to unconfigure old target node!"));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11062 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11063 /* Following call will retry node offlining and removing it */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11064 if (ndi_devi_offline(tdip, NDI_DEVI_REMOVE) != NDI_SUCCESS) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11065 /* PROBLEM - no device, but target node remained */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11066 SATA_LOG_D((sata_hba_inst, CE_WARN,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11067 "sata_process_device_attached: "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11068 "Failed to remove old target node!"));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11069 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11070 * It is not clear, what should be done here.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11071 * For now, we will not attach a new device
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11072 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11073 return;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11074 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11075 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11076
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11077 /*
1529
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
11078 * Reprobing port will take care of the creation of the device info
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
11079 * structure and determination of the device type.
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11080 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11081 sata_device.satadev_addr = *saddr;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11082 (void) sata_reprobe_port(sata_hba_inst, &sata_device);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11083 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11084 * If device was successfully attached, an explicit
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11085 * 'configure' command is needed to configure it.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11086 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11087 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11088 if ((cportinfo->cport_state & SATA_STATE_READY) &&
1529
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
11089 cportinfo->cport_dev_type != SATA_DTYPE_NONE) {
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
11090 sata_log(sata_hba_inst, CE_WARN,
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
11091 "SATA device attached at port %d", saddr->cport);
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
11092
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
11093 if (SATA_CPORTINFO_DRV_INFO(cportinfo) != NULL) {
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
11094 sata_drive_info_t new_sdinfo;
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
11095
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
11096 /* Log device info data */
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
11097 new_sdinfo = *(SATA_CPORTINFO_DRV_INFO(cportinfo));
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
11098 sata_show_drive_info(sata_hba_inst, &new_sdinfo);
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
11099 }
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11100 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11101 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11102 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11103
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11104
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11105 /*
2553
624f674f2ad8 6430966 SATA NCQ support is needed in SATA framework and hba drivers
ls24207
parents: 2539
diff changeset
11106 * sata_set_drive_features function compares current device features setting
1781
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
11107 * with the saved device features settings and, if there is a difference,
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
11108 * it restores device features setting to the previously saved state.
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11109 * Device Identify data has to be current.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11110 * At the moment only read ahead and write cache settings are considered.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11111 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11112 * This function cannot be called in the interrupt context (it may sleep).
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11113 *
1781
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
11114 * The input argument sdinfo should point to the drive info structure
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
11115 * to be updated after features are set.
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
11116 *
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11117 * Returns TRUE if successful or there was nothing to do.
2553
624f674f2ad8 6430966 SATA NCQ support is needed in SATA framework and hba drivers
ls24207
parents: 2539
diff changeset
11118 * Returns FALSE if device features could not be set .
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11119 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11120 * Note: This function may fail the port, making it inaccessible.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11121 * Explicit port disconnect/connect or physical device
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11122 * detach/attach is required to re-evaluate it's state afterwards
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11123 */
1781
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
11124
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11125 static int
1781
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
11126 sata_set_drive_features(sata_hba_inst_t *sata_hba_inst,
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
11127 sata_drive_info_t *sdinfo, int restore)
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
11128 {
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11129 int rval = SATA_SUCCESS;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11130 sata_drive_info_t new_sdinfo;
1781
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
11131 char *finfo = "sata_set_drive_features: cannot";
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
11132 char *finfox;
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
11133 int cache_op;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11134
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11135 bzero(&new_sdinfo, sizeof (sata_drive_info_t));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11136 new_sdinfo.satadrv_addr = sdinfo->satadrv_addr;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11137 new_sdinfo.satadrv_type = sdinfo->satadrv_type;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11138 if (sata_fetch_device_identify_data(sata_hba_inst, &new_sdinfo) != 0) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11139 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11140 * Cannot get device identification - retry later
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11141 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11142 SATA_LOG_D((sata_hba_inst, CE_WARN,
1781
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
11143 "%s fetch device identify data\n", finfo));
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11144 return (SATA_FAILURE);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11145 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11146 /* Arbitrarily set UDMA mode */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11147 if (sata_set_udma_mode(sata_hba_inst, &new_sdinfo) != SATA_SUCCESS) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11148 SATA_LOG_D((sata_hba_inst, CE_WARN,
1781
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
11149 "%s set UDMA mode\n", finfo));
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11150 return (SATA_FAILURE);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11151 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11152
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11153 if (!(new_sdinfo.satadrv_id.ai_cmdset82 & SATA_LOOK_AHEAD) &&
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11154 !(new_sdinfo.satadrv_id.ai_cmdset82 & SATA_WRITE_CACHE)) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11155 /* None of the features is supported - do nothing */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11156 SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
1781
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
11157 "settable features not supported\n", NULL);
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11158 return (SATA_SUCCESS);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11159 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11160
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11161 if (((new_sdinfo.satadrv_id.ai_features85 & SATA_LOOK_AHEAD) &&
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11162 (sdinfo->satadrv_settings & SATA_DEV_READ_AHEAD)) &&
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11163 ((new_sdinfo.satadrv_id.ai_features85 & SATA_WRITE_CACHE) &&
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11164 (sdinfo->satadrv_settings & SATA_DEV_WRITE_CACHE))) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11165 /* Nothing to do */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11166 SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
1781
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
11167 "no device features to set\n", NULL);
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11168 return (SATA_SUCCESS);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11169 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11170
1781
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
11171 finfox = (restore != 0) ? " restore device features" :
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
11172 " initialize device features\n";
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11173
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11174 if (!((new_sdinfo.satadrv_id.ai_features85 & SATA_LOOK_AHEAD) &&
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11175 (sdinfo->satadrv_settings & SATA_DEV_READ_AHEAD))) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11176 if (sdinfo->satadrv_settings & SATA_DEV_READ_AHEAD)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11177 /* Enable read ahead / read cache */
1781
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
11178 cache_op = SATAC_SF_ENABLE_READ_AHEAD;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11179 else
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11180 /* Disable read ahead / read cache */
1781
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
11181 cache_op = SATAC_SF_DISABLE_READ_AHEAD;
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
11182
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
11183 /* Try to set read cache mode */
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
11184 if (sata_set_cache_mode(sata_hba_inst, &new_sdinfo,
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
11185 cache_op) != SATA_SUCCESS) {
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11186 /* Pkt execution failed */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11187 rval = SATA_FAILURE;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11188 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11189 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11190
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11191 if (!((new_sdinfo.satadrv_id.ai_features85 & SATA_WRITE_CACHE) &&
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11192 (sdinfo->satadrv_settings & SATA_DEV_WRITE_CACHE))) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11193 if (sdinfo->satadrv_settings & SATA_DEV_WRITE_CACHE)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11194 /* Enable write cache */
1781
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
11195 cache_op = SATAC_SF_ENABLE_WRITE_CACHE;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11196 else
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11197 /* Disable write cache */
1781
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
11198 cache_op = SATAC_SF_DISABLE_WRITE_CACHE;
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
11199
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
11200 /* Try to set write cache mode */
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
11201 if (sata_set_cache_mode(sata_hba_inst, &new_sdinfo,
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
11202 cache_op) != SATA_SUCCESS) {
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11203 /* Pkt execution failed */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11204 rval = SATA_FAILURE;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11205 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11206 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11207
1781
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
11208 if (rval == SATA_FAILURE)
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
11209 SATA_LOG_D((sata_hba_inst, CE_WARN,
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
11210 "%s %s", finfo, finfox));
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11211
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11212 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11213 * We need to fetch Device Identify data again
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11214 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11215 if (sata_fetch_device_identify_data(sata_hba_inst, &new_sdinfo) != 0) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11216 /*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11217 * Cannot get device identification - retry later
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11218 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11219 SATA_LOG_D((sata_hba_inst, CE_WARN,
1781
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
11220 "%s cannot re-fetch device identify data\n"));
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11221 rval = SATA_FAILURE;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11222 }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11223 /* Copy device sata info. */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11224 sdinfo->satadrv_id = new_sdinfo.satadrv_id;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11225
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11226 return (rval);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
11227 }
1529
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
11228
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
11229
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11230 /*
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11231 *
2553
624f674f2ad8 6430966 SATA NCQ support is needed in SATA framework and hba drivers
ls24207
parents: 2539
diff changeset
11232 * Returns 1 if threshold exceeded, 0 if threshold not exceeded, -1 if
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11233 * unable to determine.
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11234 *
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11235 * Cannot be called in an interrupt context.
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11236 *
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11237 * Called by sata_build_lsense_page_2f()
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11238 */
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11239
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11240 static int
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11241 sata_fetch_smart_return_status(sata_hba_inst_t *sata_hba_inst,
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11242 sata_drive_info_t *sdinfo)
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11243 {
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11244 sata_pkt_t *spkt;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11245 sata_cmd_t *scmd;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11246 sata_pkt_txlate_t *spx;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11247 int rval;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11248
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11249 spx = kmem_zalloc(sizeof (sata_pkt_txlate_t), KM_SLEEP);
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11250 spx->txlt_sata_hba_inst = sata_hba_inst;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11251 spx->txlt_scsi_pkt = NULL; /* No scsi pkt involved */
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11252 spkt = sata_pkt_alloc(spx, SLEEP_FUNC);
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11253 if (spkt == NULL) {
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11254 kmem_free(spx, sizeof (sata_pkt_txlate_t));
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11255 return (-1);
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11256 }
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11257 /* address is needed now */
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11258 spkt->satapkt_device.satadev_addr = sdinfo->satadrv_addr;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11259
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11260
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11261 /* Fill sata_pkt */
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11262 spkt->satapkt_device.satadev_addr = sdinfo->satadrv_addr;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11263 spkt->satapkt_op_mode = SATA_OPMODE_SYNCH | SATA_OPMODE_INTERRUPTS;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11264 /* Synchronous mode, no callback */
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11265 spkt->satapkt_comp = NULL;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11266 /* Timeout 30s */
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11267 spkt->satapkt_time = sata_default_pkt_time;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11268
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11269 scmd = &spkt->satapkt_cmd;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11270 scmd->satacmd_flags.sata_special_regs = B_TRUE;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11271 scmd->satacmd_flags.sata_data_direction = SATA_DIR_NODATA_XFER;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11272
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11273 /* Set up which registers need to be returned */
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11274 scmd->satacmd_flags.sata_copy_out_lba_mid_lsb = B_TRUE;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11275 scmd->satacmd_flags.sata_copy_out_lba_high_lsb = B_TRUE;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11276
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11277 /* Build SMART_RETURN_STATUS cmd in the sata_pkt */
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11278 scmd->satacmd_addr_type = 0; /* N/A */
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11279 scmd->satacmd_sec_count_lsb = 0; /* N/A */
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11280 scmd->satacmd_lba_low_lsb = 0; /* N/A */
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11281 scmd->satacmd_lba_mid_lsb = SMART_MAGIC_VAL_1;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11282 scmd->satacmd_lba_high_lsb = SMART_MAGIC_VAL_2;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11283 scmd->satacmd_features_reg = SATA_SMART_RETURN_STATUS;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11284 scmd->satacmd_device_reg = 0; /* Always device 0 */
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11285 scmd->satacmd_cmd_reg = SATAC_SMART;
1940
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
11286 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
11287 sdinfo->satadrv_addr.cport)));
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
11288
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11289
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11290 /* Send pkt to SATA HBA driver */
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11291 if ((*SATA_START_FUNC(sata_hba_inst))(SATA_DIP(sata_hba_inst), spkt) !=
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11292 SATA_TRAN_ACCEPTED ||
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11293 spkt->satapkt_reason != SATA_PKT_COMPLETED) {
1940
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
11294 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
11295 sdinfo->satadrv_addr.cport)));
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11296 /*
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11297 * Whoops, no SMART RETURN STATUS
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11298 */
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11299 rval = -1;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11300 } else {
1940
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
11301 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
11302 sdinfo->satadrv_addr.cport)));
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11303 if (scmd->satacmd_error_reg & SATA_ERROR_ABORT) {
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11304 rval = -1;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11305 goto fail;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11306 }
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11307 if (scmd->satacmd_status_reg & SATA_STATUS_ERR) {
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11308 rval = -1;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11309 goto fail;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11310 }
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11311 if ((scmd->satacmd_lba_mid_lsb == SMART_MAGIC_VAL_1) &&
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11312 (scmd->satacmd_lba_high_lsb == SMART_MAGIC_VAL_2))
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11313 rval = 0;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11314 else if ((scmd->satacmd_lba_mid_lsb == SMART_MAGIC_VAL_3) &&
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11315 (scmd->satacmd_lba_high_lsb == SMART_MAGIC_VAL_4))
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11316 rval = 1;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11317 else {
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11318 rval = -1;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11319 goto fail;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11320 }
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11321 }
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11322 fail:
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11323 /* Free allocated resources */
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11324 sata_pkt_free(spx);
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11325 kmem_free(spx, sizeof (sata_pkt_txlate_t));
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11326
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11327 return (rval);
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11328 }
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11329
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11330 /*
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11331 *
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11332 * Returns 0 if succeeded, -1 otherwise
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11333 *
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11334 * Cannot be called in an interrupt context.
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11335 *
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11336 */
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11337 static int
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11338 sata_fetch_smart_data(
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11339 sata_hba_inst_t *sata_hba_inst,
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11340 sata_drive_info_t *sdinfo,
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11341 struct smart_data *smart_data)
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11342 {
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11343 sata_pkt_t *spkt;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11344 sata_cmd_t *scmd;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11345 sata_pkt_txlate_t *spx;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11346 int rval;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11347
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11348 #if ! defined(lint)
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11349 ASSERT(sizeof (struct smart_data) == 512);
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11350 #endif
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11351
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11352 spx = kmem_zalloc(sizeof (sata_pkt_txlate_t), KM_SLEEP);
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11353 spx->txlt_sata_hba_inst = sata_hba_inst;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11354 spx->txlt_scsi_pkt = NULL; /* No scsi pkt involved */
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11355 spkt = sata_pkt_alloc(spx, SLEEP_FUNC);
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11356 if (spkt == NULL) {
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11357 kmem_free(spx, sizeof (sata_pkt_txlate_t));
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11358 return (-1);
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11359 }
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11360 /* address is needed now */
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11361 spkt->satapkt_device.satadev_addr = sdinfo->satadrv_addr;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11362
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11363
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11364 /* Fill sata_pkt */
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11365 spkt->satapkt_device.satadev_addr = sdinfo->satadrv_addr;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11366 spkt->satapkt_op_mode = SATA_OPMODE_SYNCH | SATA_OPMODE_INTERRUPTS;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11367 /* Synchronous mode, no callback */
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11368 spkt->satapkt_comp = NULL;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11369 /* Timeout 30s */
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11370 spkt->satapkt_time = sata_default_pkt_time;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11371
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11372 scmd = &spkt->satapkt_cmd;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11373 scmd->satacmd_flags.sata_data_direction = SATA_DIR_READ;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11374
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11375 /*
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11376 * Allocate buffer for SMART data
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11377 */
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11378 scmd->satacmd_bp = sata_alloc_local_buffer(spx,
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11379 sizeof (struct smart_data));
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11380 if (scmd->satacmd_bp == NULL) {
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11381 sata_pkt_free(spx);
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11382 kmem_free(spx, sizeof (sata_pkt_txlate_t));
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11383 SATA_LOG_D((sata_hba_inst, CE_WARN,
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11384 "sata_fetch_smart_data: "
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11385 "cannot allocate buffer"));
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11386 return (-1);
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11387 }
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11388
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11389
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11390 /* Build SMART_READ_DATA cmd in the sata_pkt */
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11391 scmd->satacmd_addr_type = 0; /* N/A */
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11392 scmd->satacmd_sec_count_lsb = 0; /* N/A */
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11393 scmd->satacmd_lba_low_lsb = 0; /* N/A */
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11394 scmd->satacmd_lba_mid_lsb = SMART_MAGIC_VAL_1;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11395 scmd->satacmd_lba_high_lsb = SMART_MAGIC_VAL_2;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11396 scmd->satacmd_features_reg = SATA_SMART_READ_DATA;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11397 scmd->satacmd_device_reg = 0; /* Always device 0 */
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11398 scmd->satacmd_cmd_reg = SATAC_SMART;
1940
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
11399 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
11400 sdinfo->satadrv_addr.cport)));
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11401
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11402 /* Send pkt to SATA HBA driver */
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11403 if ((*SATA_START_FUNC(sata_hba_inst))(SATA_DIP(sata_hba_inst), spkt) !=
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11404 SATA_TRAN_ACCEPTED ||
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11405 spkt->satapkt_reason != SATA_PKT_COMPLETED) {
1940
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
11406 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
11407 sdinfo->satadrv_addr.cport)));
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11408 /*
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11409 * Whoops, no SMART DATA available
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11410 */
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11411 rval = -1;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11412 goto fail;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11413 } else {
1940
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
11414 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
11415 sdinfo->satadrv_addr.cport)));
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11416 rval = ddi_dma_sync(spx->txlt_buf_dma_handle, 0, 0,
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11417 DDI_DMA_SYNC_FORKERNEL);
2539
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
11418 ASSERT(rval == DDI_SUCCESS);
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11419 bcopy(scmd->satacmd_bp->b_un.b_addr, (uint8_t *)smart_data,
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11420 sizeof (struct smart_data));
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11421 }
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11422
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11423 fail:
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11424 /* Free allocated resources */
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11425 sata_free_local_buffer(spx);
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11426 spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp = NULL;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11427 sata_pkt_free(spx);
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11428 kmem_free(spx, sizeof (sata_pkt_txlate_t));
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11429
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11430 return (rval);
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11431 }
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11432
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11433 /*
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11434 * Used by LOG SENSE page 0x10
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11435 *
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11436 * return 0 for success, -1 otherwise
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11437 *
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11438 */
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11439 static int
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11440 sata_ext_smart_selftest_read_log(
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11441 sata_hba_inst_t *sata_hba_inst,
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11442 sata_drive_info_t *sdinfo,
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11443 struct smart_ext_selftest_log *ext_selftest_log,
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11444 uint16_t block_num)
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11445 {
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11446 sata_pkt_txlate_t *spx;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11447 sata_pkt_t *spkt;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11448 sata_cmd_t *scmd;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11449 int rval;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11450
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11451 #if ! defined(lint)
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11452 ASSERT(sizeof (struct smart_ext_selftest_log) == 512);
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11453 #endif
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11454
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11455 spx = kmem_zalloc(sizeof (sata_pkt_txlate_t), KM_SLEEP);
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11456 spx->txlt_sata_hba_inst = sata_hba_inst;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11457 spx->txlt_scsi_pkt = NULL; /* No scsi pkt involved */
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11458 spkt = sata_pkt_alloc(spx, SLEEP_FUNC);
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11459 if (spkt == NULL) {
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11460 kmem_free(spx, sizeof (sata_pkt_txlate_t));
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11461 return (-1);
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11462 }
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11463 /* address is needed now */
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11464 spkt->satapkt_device.satadev_addr = sdinfo->satadrv_addr;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11465
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11466
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11467 /* Fill sata_pkt */
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11468 spkt->satapkt_device.satadev_addr = sdinfo->satadrv_addr;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11469 spkt->satapkt_op_mode = SATA_OPMODE_SYNCH | SATA_OPMODE_INTERRUPTS;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11470 /* Synchronous mode, no callback */
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11471 spkt->satapkt_comp = NULL;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11472 /* Timeout 30s */
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11473 spkt->satapkt_time = sata_default_pkt_time;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11474
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11475 scmd = &spkt->satapkt_cmd;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11476 scmd->satacmd_flags.sata_data_direction = SATA_DIR_READ;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11477
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11478 /*
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11479 * Allocate buffer for SMART extended self-test log
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11480 */
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11481 scmd->satacmd_bp = sata_alloc_local_buffer(spx,
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11482 sizeof (struct smart_ext_selftest_log));
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11483 if (scmd->satacmd_bp == NULL) {
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11484 sata_pkt_free(spx);
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11485 kmem_free(spx, sizeof (sata_pkt_txlate_t));
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11486 SATA_LOG_D((sata_hba_inst, CE_WARN,
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11487 "sata_ext_smart_selftest_log: "
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11488 "cannot allocate buffer"));
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11489 return (-1);
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11490 }
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11491
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11492 /* Build READ LOG EXT w/ extended self-test log cmd in the sata_pkt */
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11493 scmd->satacmd_addr_type = ATA_ADDR_LBA48;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11494 scmd->satacmd_sec_count_lsb = 1; /* One sector of selftest log */
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11495 scmd->satacmd_sec_count_msb = 0; /* One sector of selftest log */
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11496 scmd->satacmd_lba_low_lsb = EXT_SMART_SELFTEST_LOG_PAGE;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11497 scmd->satacmd_lba_low_msb = 0;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11498 scmd->satacmd_lba_mid_lsb = block_num & 0xff;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11499 scmd->satacmd_lba_mid_msb = block_num >> 8;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11500 scmd->satacmd_device_reg = 0; /* Always device 0 */
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11501 scmd->satacmd_cmd_reg = SATAC_READ_LOG_EXT;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11502
1940
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
11503 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
11504 sdinfo->satadrv_addr.cport)));
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
11505
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11506 /* Send pkt to SATA HBA driver */
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11507 if ((*SATA_START_FUNC(sata_hba_inst))(SATA_DIP(sata_hba_inst), spkt) !=
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11508 SATA_TRAN_ACCEPTED ||
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11509 spkt->satapkt_reason != SATA_PKT_COMPLETED) {
1940
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
11510 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
11511 sdinfo->satadrv_addr.cport)));
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
11512
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11513 /*
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11514 * Whoops, no SMART selftest log info available
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11515 */
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11516 rval = -1;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11517 goto fail;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11518 } else {
1940
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
11519 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
11520 sdinfo->satadrv_addr.cport)));
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
11521
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11522 rval = ddi_dma_sync(spx->txlt_buf_dma_handle, 0, 0,
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11523 DDI_DMA_SYNC_FORKERNEL);
2539
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
11524 ASSERT(rval == DDI_SUCCESS);
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11525 bcopy(scmd->satacmd_bp->b_un.b_addr,
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11526 (uint8_t *)ext_selftest_log,
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11527 sizeof (struct smart_ext_selftest_log));
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11528 rval = 0;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11529 }
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11530
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11531 fail:
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11532 /* Free allocated resources */
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11533 sata_free_local_buffer(spx);
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11534 spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp = NULL;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11535 sata_pkt_free(spx);
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11536 kmem_free(spx, sizeof (sata_pkt_txlate_t));
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11537
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11538 return (rval);
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11539 }
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11540
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11541 /*
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11542 * Returns 0 for success, -1 otherwise
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11543 *
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11544 * SMART self-test log data is returned in buffer pointed to by selftest_log
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11545 */
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11546 static int
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11547 sata_smart_selftest_log(
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11548 sata_hba_inst_t *sata_hba_inst,
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11549 sata_drive_info_t *sdinfo,
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11550 struct smart_selftest_log *selftest_log)
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11551 {
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11552 sata_pkt_t *spkt;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11553 sata_cmd_t *scmd;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11554 sata_pkt_txlate_t *spx;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11555 int rval;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11556
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11557 #if ! defined(lint)
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11558 ASSERT(sizeof (struct smart_selftest_log) == 512);
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11559 #endif
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11560
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11561 spx = kmem_zalloc(sizeof (sata_pkt_txlate_t), KM_SLEEP);
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11562 spx->txlt_sata_hba_inst = sata_hba_inst;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11563 spx->txlt_scsi_pkt = NULL; /* No scsi pkt involved */
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11564 spkt = sata_pkt_alloc(spx, SLEEP_FUNC);
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11565 if (spkt == NULL) {
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11566 kmem_free(spx, sizeof (sata_pkt_txlate_t));
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11567 return (-1);
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11568 }
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11569 /* address is needed now */
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11570 spkt->satapkt_device.satadev_addr = sdinfo->satadrv_addr;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11571
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11572
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11573 /* Fill sata_pkt */
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11574 spkt->satapkt_device.satadev_addr = sdinfo->satadrv_addr;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11575 spkt->satapkt_op_mode = SATA_OPMODE_SYNCH | SATA_OPMODE_INTERRUPTS;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11576 /* Synchronous mode, no callback */
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11577 spkt->satapkt_comp = NULL;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11578 /* Timeout 30s */
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11579 spkt->satapkt_time = sata_default_pkt_time;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11580
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11581 scmd = &spkt->satapkt_cmd;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11582 scmd->satacmd_flags.sata_data_direction = SATA_DIR_READ;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11583
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11584 /*
2553
624f674f2ad8 6430966 SATA NCQ support is needed in SATA framework and hba drivers
ls24207
parents: 2539
diff changeset
11585 * Allocate buffer for SMART SELFTEST LOG
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11586 */
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11587 scmd->satacmd_bp = sata_alloc_local_buffer(spx,
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11588 sizeof (struct smart_selftest_log));
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11589 if (scmd->satacmd_bp == NULL) {
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11590 sata_pkt_free(spx);
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11591 kmem_free(spx, sizeof (sata_pkt_txlate_t));
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11592 SATA_LOG_D((sata_hba_inst, CE_WARN,
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11593 "sata_smart_selftest_log: "
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11594 "cannot allocate buffer"));
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11595 return (-1);
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11596 }
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11597
2553
624f674f2ad8 6430966 SATA NCQ support is needed in SATA framework and hba drivers
ls24207
parents: 2539
diff changeset
11598 /* Build SMART_READ_LOG cmd in the sata_pkt */
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11599 scmd->satacmd_addr_type = 0; /* N/A */
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11600 scmd->satacmd_sec_count_lsb = 1; /* One sector of SMART log */
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11601 scmd->satacmd_lba_low_lsb = SMART_SELFTEST_LOG_PAGE;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11602 scmd->satacmd_lba_mid_lsb = SMART_MAGIC_VAL_1;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11603 scmd->satacmd_lba_high_lsb = SMART_MAGIC_VAL_2;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11604 scmd->satacmd_features_reg = SATA_SMART_READ_LOG;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11605 scmd->satacmd_device_reg = 0; /* Always device 0 */
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11606 scmd->satacmd_cmd_reg = SATAC_SMART;
1940
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
11607 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
11608 sdinfo->satadrv_addr.cport)));
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11609
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11610 /* Send pkt to SATA HBA driver */
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11611 if ((*SATA_START_FUNC(sata_hba_inst))(SATA_DIP(sata_hba_inst), spkt) !=
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11612 SATA_TRAN_ACCEPTED ||
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11613 spkt->satapkt_reason != SATA_PKT_COMPLETED) {
1940
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
11614 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
11615 sdinfo->satadrv_addr.cport)));
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11616 /*
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11617 * Whoops, no SMART DATA available
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11618 */
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11619 rval = -1;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11620 goto fail;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11621 } else {
1940
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
11622 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
11623 sdinfo->satadrv_addr.cport)));
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11624 rval = ddi_dma_sync(spx->txlt_buf_dma_handle, 0, 0,
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11625 DDI_DMA_SYNC_FORKERNEL);
2539
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
11626 ASSERT(rval == DDI_SUCCESS);
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11627 bcopy(scmd->satacmd_bp->b_un.b_addr, (uint8_t *)selftest_log,
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11628 sizeof (struct smart_selftest_log));
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11629 rval = 0;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11630 }
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11631
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11632 fail:
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11633 /* Free allocated resources */
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11634 sata_free_local_buffer(spx);
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11635 spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp = NULL;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11636 sata_pkt_free(spx);
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11637 kmem_free(spx, sizeof (sata_pkt_txlate_t));
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11638
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11639 return (rval);
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11640 }
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11641
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11642
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11643 /*
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11644 * Returns 0 for success, -1 otherwise
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11645 *
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11646 * SMART READ LOG data is returned in buffer pointed to by smart_log
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11647 */
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11648 static int
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11649 sata_smart_read_log(
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11650 sata_hba_inst_t *sata_hba_inst,
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11651 sata_drive_info_t *sdinfo,
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11652 uint8_t *smart_log, /* where the data should be returned */
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11653 uint8_t which_log, /* which log should be returned */
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11654 uint8_t log_size) /* # of 512 bytes in log */
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11655 {
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11656 sata_pkt_t *spkt;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11657 sata_cmd_t *scmd;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11658 sata_pkt_txlate_t *spx;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11659 int rval;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11660
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11661 spx = kmem_zalloc(sizeof (sata_pkt_txlate_t), KM_SLEEP);
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11662 spx->txlt_sata_hba_inst = sata_hba_inst;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11663 spx->txlt_scsi_pkt = NULL; /* No scsi pkt involved */
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11664 spkt = sata_pkt_alloc(spx, SLEEP_FUNC);
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11665 if (spkt == NULL) {
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11666 kmem_free(spx, sizeof (sata_pkt_txlate_t));
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11667 return (-1);
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11668 }
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11669 /* address is needed now */
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11670 spkt->satapkt_device.satadev_addr = sdinfo->satadrv_addr;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11671
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11672
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11673 /* Fill sata_pkt */
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11674 spkt->satapkt_device.satadev_addr = sdinfo->satadrv_addr;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11675 spkt->satapkt_op_mode = SATA_OPMODE_SYNCH | SATA_OPMODE_INTERRUPTS;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11676 /* Synchronous mode, no callback */
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11677 spkt->satapkt_comp = NULL;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11678 /* Timeout 30s */
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11679 spkt->satapkt_time = sata_default_pkt_time;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11680
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11681 scmd = &spkt->satapkt_cmd;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11682 scmd->satacmd_flags.sata_data_direction = SATA_DIR_READ;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11683
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11684 /*
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11685 * Allocate buffer for SMART READ LOG
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11686 */
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11687 scmd->satacmd_bp = sata_alloc_local_buffer(spx, log_size * 512);
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11688 if (scmd->satacmd_bp == NULL) {
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11689 sata_pkt_free(spx);
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11690 kmem_free(spx, sizeof (sata_pkt_txlate_t));
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11691 SATA_LOG_D((sata_hba_inst, CE_WARN,
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11692 "sata_smart_read_log: " "cannot allocate buffer"));
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11693 return (-1);
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11694 }
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11695
2553
624f674f2ad8 6430966 SATA NCQ support is needed in SATA framework and hba drivers
ls24207
parents: 2539
diff changeset
11696 /* Build SMART_READ_LOG cmd in the sata_pkt */
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11697 scmd->satacmd_addr_type = 0; /* N/A */
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11698 scmd->satacmd_sec_count_lsb = log_size; /* what the caller asked for */
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11699 scmd->satacmd_lba_low_lsb = which_log; /* which log page */
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11700 scmd->satacmd_lba_mid_lsb = SMART_MAGIC_VAL_1;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11701 scmd->satacmd_lba_high_lsb = SMART_MAGIC_VAL_2;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11702 scmd->satacmd_features_reg = SATA_SMART_READ_LOG;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11703 scmd->satacmd_device_reg = 0; /* Always device 0 */
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11704 scmd->satacmd_cmd_reg = SATAC_SMART;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11705
1940
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
11706 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
11707 sdinfo->satadrv_addr.cport)));
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
11708
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11709 /* Send pkt to SATA HBA driver */
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11710 if ((*SATA_START_FUNC(sata_hba_inst))(SATA_DIP(sata_hba_inst), spkt) !=
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11711 SATA_TRAN_ACCEPTED ||
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11712 spkt->satapkt_reason != SATA_PKT_COMPLETED) {
1940
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
11713 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
11714 sdinfo->satadrv_addr.cport)));
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
11715
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11716 /*
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11717 * Whoops, no SMART DATA available
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11718 */
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11719 rval = -1;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11720 goto fail;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11721 } else {
1940
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
11722 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
11723 sdinfo->satadrv_addr.cport)));
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
11724
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11725 rval = ddi_dma_sync(spx->txlt_buf_dma_handle, 0, 0,
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11726 DDI_DMA_SYNC_FORKERNEL);
2539
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
11727 ASSERT(rval == DDI_SUCCESS);
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11728 bcopy(scmd->satacmd_bp->b_un.b_addr, smart_log, log_size * 512);
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11729 rval = 0;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11730 }
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11731
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11732 fail:
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11733 /* Free allocated resources */
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11734 sata_free_local_buffer(spx);
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11735 spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp = NULL;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11736 sata_pkt_free(spx);
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11737 kmem_free(spx, sizeof (sata_pkt_txlate_t));
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11738
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11739 return (rval);
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11740 }
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11741
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11742 /*
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11743 * Used by LOG SENSE page 0x10
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11744 *
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11745 * return 0 for success, -1 otherwise
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11746 *
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11747 */
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11748 static int
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11749 sata_read_log_ext_directory(
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11750 sata_hba_inst_t *sata_hba_inst,
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11751 sata_drive_info_t *sdinfo,
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11752 struct read_log_ext_directory *logdir)
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11753 {
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11754 sata_pkt_txlate_t *spx;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11755 sata_pkt_t *spkt;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11756 sata_cmd_t *scmd;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11757 int rval;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11758
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11759 #if ! defined(lint)
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11760 ASSERT(sizeof (struct read_log_ext_directory) == 512);
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11761 #endif
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11762
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11763 spx = kmem_zalloc(sizeof (sata_pkt_txlate_t), KM_SLEEP);
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11764 spx->txlt_sata_hba_inst = sata_hba_inst;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11765 spx->txlt_scsi_pkt = NULL; /* No scsi pkt involved */
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11766 spkt = sata_pkt_alloc(spx, SLEEP_FUNC);
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11767 if (spkt == NULL) {
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11768 kmem_free(spx, sizeof (sata_pkt_txlate_t));
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11769 return (-1);
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11770 }
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11771
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11772 /* Fill sata_pkt */
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11773 spkt->satapkt_device.satadev_addr = sdinfo->satadrv_addr;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11774 spkt->satapkt_op_mode = SATA_OPMODE_SYNCH | SATA_OPMODE_INTERRUPTS;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11775 /* Synchronous mode, no callback */
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11776 spkt->satapkt_comp = NULL;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11777 /* Timeout 30s */
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11778 spkt->satapkt_time = sata_default_pkt_time;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11779
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11780 scmd = &spkt->satapkt_cmd;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11781 scmd->satacmd_flags.sata_data_direction = SATA_DIR_READ;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11782
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11783 /*
2553
624f674f2ad8 6430966 SATA NCQ support is needed in SATA framework and hba drivers
ls24207
parents: 2539
diff changeset
11784 * Allocate buffer for SMART READ LOG EXTENDED command
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11785 */
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11786 scmd->satacmd_bp = sata_alloc_local_buffer(spx,
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11787 sizeof (struct read_log_ext_directory));
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11788 if (scmd->satacmd_bp == NULL) {
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11789 sata_pkt_free(spx);
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11790 kmem_free(spx, sizeof (sata_pkt_txlate_t));
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11791 SATA_LOG_D((sata_hba_inst, CE_WARN,
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11792 "sata_read_log_ext_directory: "
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11793 "cannot allocate buffer"));
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11794 return (-1);
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11795 }
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11796
2553
624f674f2ad8 6430966 SATA NCQ support is needed in SATA framework and hba drivers
ls24207
parents: 2539
diff changeset
11797 /* Build READ LOG EXT w/ log directory cmd in the sata_pkt */
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11798 scmd->satacmd_addr_type = ATA_ADDR_LBA48;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11799 scmd->satacmd_sec_count_lsb = 1; /* One sector of directory */
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11800 scmd->satacmd_sec_count_msb = 0; /* One sector of directory */
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11801 scmd->satacmd_lba_low_lsb = READ_LOG_EXT_LOG_DIRECTORY;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11802 scmd->satacmd_lba_low_msb = 0;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11803 scmd->satacmd_lba_mid_lsb = 0;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11804 scmd->satacmd_lba_mid_msb = 0;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11805 scmd->satacmd_device_reg = 0; /* Always device 0 */
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11806 scmd->satacmd_cmd_reg = SATAC_READ_LOG_EXT;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11807
1940
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
11808 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
11809 sdinfo->satadrv_addr.cport)));
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
11810
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11811 /* Send pkt to SATA HBA driver */
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11812 if ((*SATA_START_FUNC(sata_hba_inst))(SATA_DIP(sata_hba_inst), spkt) !=
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11813 SATA_TRAN_ACCEPTED ||
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11814 spkt->satapkt_reason != SATA_PKT_COMPLETED) {
1940
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
11815 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
11816 sdinfo->satadrv_addr.cport)));
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11817 /*
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11818 * Whoops, no SMART selftest log info available
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11819 */
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11820 rval = -1;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11821 goto fail;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11822 } else {
1940
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
11823 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
11824 sdinfo->satadrv_addr.cport)));
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11825 rval = ddi_dma_sync(spx->txlt_buf_dma_handle, 0, 0,
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11826 DDI_DMA_SYNC_FORKERNEL);
2539
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
11827 ASSERT(rval == DDI_SUCCESS);
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11828 bcopy(scmd->satacmd_bp->b_un.b_addr, (uint8_t *)logdir,
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11829 sizeof (struct read_log_ext_directory));
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11830 rval = 0;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11831 }
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11832
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11833 fail:
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11834 /* Free allocated resources */
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11835 sata_free_local_buffer(spx);
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11836 spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp = NULL;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11837 sata_pkt_free(spx);
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11838 kmem_free(spx, sizeof (sata_pkt_txlate_t));
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11839
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11840 return (rval);
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11841 }
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
11842
1529
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
11843 static void
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
11844 sata_gen_sysevent(sata_hba_inst_t *sata_hba_inst, sata_address_t *saddr,
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
11845 int hint)
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
11846 {
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
11847 char ap[MAXPATHLEN];
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
11848 nvlist_t *ev_attr_list = NULL;
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
11849 int err;
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
11850
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
11851 /* Allocate and build sysevent attribute list */
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
11852 err = nvlist_alloc(&ev_attr_list, NV_UNIQUE_NAME_TYPE, DDI_NOSLEEP);
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
11853 if (err != 0) {
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
11854 SATA_LOG_D((sata_hba_inst, CE_WARN,
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
11855 "sata_gen_sysevent: "
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
11856 "cannot allocate memory for sysevent attributes\n"));
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
11857 return;
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
11858 }
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
11859 /* Add hint attribute */
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
11860 err = nvlist_add_string(ev_attr_list, DR_HINT, SE_HINT2STR(hint));
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
11861 if (err != 0) {
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
11862 SATA_LOG_D((sata_hba_inst, CE_WARN,
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
11863 "sata_gen_sysevent: "
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
11864 "failed to add DR_HINT attr for sysevent"));
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
11865 nvlist_free(ev_attr_list);
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
11866 return;
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
11867 }
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
11868 /*
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
11869 * Add AP attribute.
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
11870 * Get controller pathname and convert it into AP pathname by adding
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
11871 * a target number.
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
11872 */
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
11873 (void) snprintf(ap, MAXPATHLEN, "/devices");
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
11874 (void) ddi_pathname(SATA_DIP(sata_hba_inst), ap + strlen(ap));
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
11875 (void) snprintf(ap + strlen(ap), MAXPATHLEN - strlen(ap), ":%d",
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
11876 SATA_MAKE_AP_NUMBER(saddr->cport, saddr->pmport, saddr->qual));
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
11877
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
11878 err = nvlist_add_string(ev_attr_list, DR_AP_ID, ap);
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
11879 if (err != 0) {
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
11880 SATA_LOG_D((sata_hba_inst, CE_WARN,
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
11881 "sata_gen_sysevent: "
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
11882 "failed to add DR_AP_ID attr for sysevent"));
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
11883 nvlist_free(ev_attr_list);
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
11884 return;
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
11885 }
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
11886
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
11887 /* Generate/log sysevent */
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
11888 err = ddi_log_sysevent(SATA_DIP(sata_hba_inst), DDI_VENDOR_SUNW, EC_DR,
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
11889 ESC_DR_AP_STATE_CHANGE, ev_attr_list, NULL, DDI_NOSLEEP);
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
11890 if (err != DDI_SUCCESS) {
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
11891 SATA_LOG_D((sata_hba_inst, CE_WARN,
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
11892 "sata_gen_sysevent: "
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
11893 "cannot log sysevent, err code %x\n", err));
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
11894 }
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
11895
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
11896 nvlist_free(ev_attr_list);
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
11897 }
1675
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
11898
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
11899 /*
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
11900 * sata_xlate_errors() is used to translate (S)ATA error
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
11901 * information to SCSI information returned in the SCSI
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
11902 * packet.
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
11903 */
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
11904 static void
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
11905 sata_xlate_errors(sata_pkt_txlate_t *spx)
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
11906 {
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
11907 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
11908 struct scsi_extended_sense *sense;
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
11909
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
11910 scsipkt->pkt_reason = CMD_INCOMPLETE;
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
11911 *scsipkt->pkt_scbp = STATUS_CHECK;
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
11912 sense = sata_arq_sense(spx);
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
11913
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
11914 switch (spx->txlt_sata_pkt->satapkt_reason) {
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
11915 case SATA_PKT_PORT_ERROR:
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
11916 /*
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
11917 * We have no device data. Assume no data transfered.
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
11918 */
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
11919 sense->es_key = KEY_HARDWARE_ERROR;
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
11920 break;
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
11921
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
11922 case SATA_PKT_DEV_ERROR:
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
11923 if (spx->txlt_sata_pkt->satapkt_cmd.satacmd_status_reg &
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
11924 SATA_STATUS_ERR) {
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
11925 /*
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
11926 * determine dev error reason from error
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
11927 * reg content
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
11928 */
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
11929 sata_decode_device_error(spx, sense);
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
11930 break;
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
11931 }
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
11932 /* No extended sense key - no info available */
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
11933 break;
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
11934
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
11935 case SATA_PKT_TIMEOUT:
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
11936 /*
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
11937 * scsipkt->pkt_reason = CMD_TIMEOUT; This causes problems.
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
11938 */
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
11939 scsipkt->pkt_reason = CMD_INCOMPLETE;
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
11940 /* No extended sense key */
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
11941 break;
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
11942
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
11943 case SATA_PKT_ABORTED:
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
11944 scsipkt->pkt_reason = CMD_ABORTED;
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
11945 /* No extended sense key */
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
11946 break;
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
11947
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
11948 case SATA_PKT_RESET:
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
11949 /*
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
11950 * pkt aborted either by an explicit reset request from
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
11951 * a host, or due to error recovery
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
11952 */
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
11953 scsipkt->pkt_reason = CMD_RESET;
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
11954 break;
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
11955
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
11956 default:
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
11957 scsipkt->pkt_reason = CMD_TRAN_ERR;
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
11958 break;
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
11959 }
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
11960 }