ata_xpt.c revision 217874
1/*-
2 * Copyright (c) 2009 Alexander Motin <mav@FreeBSD.org>
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright
9 *    notice, this list of conditions and the following disclaimer,
10 *    without modification, immediately at the beginning of the file.
11 * 2. Redistributions in binary form must reproduce the above copyright
12 *    notice, this list of conditions and the following disclaimer in the
13 *    documentation and/or other materials provided with the distribution.
14 *
15 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
16 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
17 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
18 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
19 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
20 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
21 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
22 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
24 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25 */
26
27#include <sys/cdefs.h>
28__FBSDID("$FreeBSD: head/sys/cam/ata/ata_xpt.c 217874 2011-01-26 06:37:51Z mav $");
29
30#include <sys/param.h>
31#include <sys/bus.h>
32#include <sys/endian.h>
33#include <sys/systm.h>
34#include <sys/types.h>
35#include <sys/malloc.h>
36#include <sys/kernel.h>
37#include <sys/time.h>
38#include <sys/conf.h>
39#include <sys/fcntl.h>
40#include <sys/interrupt.h>
41#include <sys/sbuf.h>
42
43#include <sys/lock.h>
44#include <sys/mutex.h>
45#include <sys/sysctl.h>
46
47#include <cam/cam.h>
48#include <cam/cam_ccb.h>
49#include <cam/cam_queue.h>
50#include <cam/cam_periph.h>
51#include <cam/cam_sim.h>
52#include <cam/cam_xpt.h>
53#include <cam/cam_xpt_sim.h>
54#include <cam/cam_xpt_periph.h>
55#include <cam/cam_xpt_internal.h>
56#include <cam/cam_debug.h>
57
58#include <cam/scsi/scsi_all.h>
59#include <cam/scsi/scsi_message.h>
60#include <cam/ata/ata_all.h>
61#include <machine/stdarg.h>	/* for xpt_print below */
62#include "opt_cam.h"
63
64struct ata_quirk_entry {
65	struct scsi_inquiry_pattern inq_pat;
66	u_int8_t quirks;
67#define	CAM_QUIRK_MAXTAGS	0x01
68	u_int maxtags;
69};
70
71static periph_init_t probe_periph_init;
72
73static struct periph_driver probe_driver =
74{
75	probe_periph_init, "aprobe",
76	TAILQ_HEAD_INITIALIZER(probe_driver.units), /* generation */ 0,
77	CAM_PERIPH_DRV_EARLY
78};
79
80PERIPHDRIVER_DECLARE(aprobe, probe_driver);
81
82typedef enum {
83	PROBE_RESET,
84	PROBE_IDENTIFY,
85	PROBE_SPINUP,
86	PROBE_SETMODE,
87	PROBE_SETPM,
88	PROBE_SETAPST,
89	PROBE_SETDMAAA,
90	PROBE_SET_MULTI,
91	PROBE_INQUIRY,
92	PROBE_FULL_INQUIRY,
93	PROBE_PM_PID,
94	PROBE_PM_PRV,
95	PROBE_INVALID
96} probe_action;
97
98static char *probe_action_text[] = {
99	"PROBE_RESET",
100	"PROBE_IDENTIFY",
101	"PROBE_SPINUP",
102	"PROBE_SETMODE",
103	"PROBE_SETPM",
104	"PROBE_SETAPST",
105	"PROBE_SETDMAAA",
106	"PROBE_SET_MULTI",
107	"PROBE_INQUIRY",
108	"PROBE_FULL_INQUIRY",
109	"PROBE_PM_PID",
110	"PROBE_PM_PRV",
111	"PROBE_INVALID"
112};
113
114#define PROBE_SET_ACTION(softc, newaction)	\
115do {									\
116	char **text;							\
117	text = probe_action_text;					\
118	CAM_DEBUG((softc)->periph->path, CAM_DEBUG_INFO,		\
119	    ("Probe %s to %s\n", text[(softc)->action],			\
120	    text[(newaction)]));					\
121	(softc)->action = (newaction);					\
122} while(0)
123
124typedef enum {
125	PROBE_NO_ANNOUNCE	= 0x04
126} probe_flags;
127
128typedef struct {
129	TAILQ_HEAD(, ccb_hdr) request_ccbs;
130	struct ata_params	ident_data;
131	probe_action	action;
132	probe_flags	flags;
133	uint32_t	pm_pid;
134	uint32_t	pm_prv;
135	int		restart;
136	int		spinup;
137	int		faults;
138	u_int		caps;
139	struct cam_periph *periph;
140} probe_softc;
141
142static struct ata_quirk_entry ata_quirk_table[] =
143{
144	{
145		/* Default tagged queuing parameters for all devices */
146		{
147		  T_ANY, SIP_MEDIA_REMOVABLE|SIP_MEDIA_FIXED,
148		  /*vendor*/"*", /*product*/"*", /*revision*/"*"
149		},
150		/*quirks*/0, /*maxtags*/0
151	},
152};
153
154static const int ata_quirk_table_size =
155	sizeof(ata_quirk_table) / sizeof(*ata_quirk_table);
156
157static cam_status	proberegister(struct cam_periph *periph,
158				      void *arg);
159static void	 probeschedule(struct cam_periph *probe_periph);
160static void	 probestart(struct cam_periph *periph, union ccb *start_ccb);
161//static void	 proberequestdefaultnegotiation(struct cam_periph *periph);
162//static int       proberequestbackoff(struct cam_periph *periph,
163//				     struct cam_ed *device);
164static void	 probedone(struct cam_periph *periph, union ccb *done_ccb);
165static void	 probecleanup(struct cam_periph *periph);
166static void	 ata_find_quirk(struct cam_ed *device);
167static void	 ata_scan_bus(struct cam_periph *periph, union ccb *ccb);
168static void	 ata_scan_lun(struct cam_periph *periph,
169			       struct cam_path *path, cam_flags flags,
170			       union ccb *ccb);
171static void	 xptscandone(struct cam_periph *periph, union ccb *done_ccb);
172static struct cam_ed *
173		 ata_alloc_device(struct cam_eb *bus, struct cam_et *target,
174				   lun_id_t lun_id);
175static void	 ata_device_transport(struct cam_path *path);
176static void	 ata_set_transfer_settings(struct ccb_trans_settings *cts,
177					    struct cam_ed *device,
178					    int async_update);
179static void	 ata_dev_async(u_int32_t async_code,
180				struct cam_eb *bus,
181				struct cam_et *target,
182				struct cam_ed *device,
183				void *async_arg);
184static void	 ata_action(union ccb *start_ccb);
185static void	 ata_announce_periph(struct cam_periph *periph);
186
187static struct xpt_xport ata_xport = {
188	.alloc_device = ata_alloc_device,
189	.action = ata_action,
190	.async = ata_dev_async,
191	.announce = ata_announce_periph,
192};
193
194struct xpt_xport *
195ata_get_xport(void)
196{
197	return (&ata_xport);
198}
199
200static void
201probe_periph_init()
202{
203}
204
205static cam_status
206proberegister(struct cam_periph *periph, void *arg)
207{
208	union ccb *request_ccb;	/* CCB representing the probe request */
209	cam_status status;
210	probe_softc *softc;
211
212	request_ccb = (union ccb *)arg;
213	if (periph == NULL) {
214		printf("proberegister: periph was NULL!!\n");
215		return(CAM_REQ_CMP_ERR);
216	}
217
218	if (request_ccb == NULL) {
219		printf("proberegister: no probe CCB, "
220		       "can't register device\n");
221		return(CAM_REQ_CMP_ERR);
222	}
223
224	softc = (probe_softc *)malloc(sizeof(*softc), M_CAMXPT, M_ZERO | M_NOWAIT);
225
226	if (softc == NULL) {
227		printf("proberegister: Unable to probe new device. "
228		       "Unable to allocate softc\n");
229		return(CAM_REQ_CMP_ERR);
230	}
231	TAILQ_INIT(&softc->request_ccbs);
232	TAILQ_INSERT_TAIL(&softc->request_ccbs, &request_ccb->ccb_h,
233			  periph_links.tqe);
234	softc->flags = 0;
235	periph->softc = softc;
236	softc->periph = periph;
237	softc->action = PROBE_INVALID;
238	status = cam_periph_acquire(periph);
239	if (status != CAM_REQ_CMP) {
240		return (status);
241	}
242	/*
243	 * Ensure nobody slip in until probe finish.
244	 */
245	cam_freeze_devq_arg(periph->path,
246	    RELSIM_RELEASE_RUNLEVEL, CAM_RL_XPT + 1);
247	probeschedule(periph);
248	return(CAM_REQ_CMP);
249}
250
251static void
252probeschedule(struct cam_periph *periph)
253{
254	union ccb *ccb;
255	probe_softc *softc;
256
257	softc = (probe_softc *)periph->softc;
258	ccb = (union ccb *)TAILQ_FIRST(&softc->request_ccbs);
259
260	if ((periph->path->device->flags & CAM_DEV_UNCONFIGURED) ||
261	    periph->path->device->protocol == PROTO_SATAPM)
262		PROBE_SET_ACTION(softc, PROBE_RESET);
263	else
264		PROBE_SET_ACTION(softc, PROBE_IDENTIFY);
265
266	if (ccb->crcn.flags & CAM_EXPECT_INQ_CHANGE)
267		softc->flags |= PROBE_NO_ANNOUNCE;
268	else
269		softc->flags &= ~PROBE_NO_ANNOUNCE;
270
271	xpt_schedule(periph, CAM_PRIORITY_XPT);
272}
273
274static void
275probestart(struct cam_periph *periph, union ccb *start_ccb)
276{
277	struct ccb_trans_settings cts;
278	struct ccb_ataio *ataio;
279	struct ccb_scsiio *csio;
280	probe_softc *softc;
281	struct cam_path *path;
282	struct ata_params *ident_buf;
283
284	CAM_DEBUG(start_ccb->ccb_h.path, CAM_DEBUG_TRACE, ("probestart\n"));
285
286	softc = (probe_softc *)periph->softc;
287	path = start_ccb->ccb_h.path;
288	ataio = &start_ccb->ataio;
289	csio = &start_ccb->csio;
290	ident_buf = &periph->path->device->ident_data;
291
292	if (softc->restart) {
293		softc->restart = 0;
294		if ((path->device->flags & CAM_DEV_UNCONFIGURED) ||
295		    path->device->protocol == PROTO_SATAPM)
296			softc->action = PROBE_RESET;
297		else
298			softc->action = PROBE_IDENTIFY;
299	}
300	switch (softc->action) {
301	case PROBE_RESET:
302		cam_fill_ataio(ataio,
303		      0,
304		      probedone,
305		      /*flags*/CAM_DIR_NONE,
306		      0,
307		      /*data_ptr*/NULL,
308		      /*dxfer_len*/0,
309		      15 * 1000);
310		ata_reset_cmd(ataio);
311		break;
312	case PROBE_IDENTIFY:
313		cam_fill_ataio(ataio,
314		      1,
315		      probedone,
316		      /*flags*/CAM_DIR_IN,
317		      0,
318		      /*data_ptr*/(u_int8_t *)&softc->ident_data,
319		      /*dxfer_len*/sizeof(softc->ident_data),
320		      30 * 1000);
321		if (periph->path->device->protocol == PROTO_ATA)
322			ata_28bit_cmd(ataio, ATA_ATA_IDENTIFY, 0, 0, 0);
323		else
324			ata_28bit_cmd(ataio, ATA_ATAPI_IDENTIFY, 0, 0, 0);
325		break;
326	case PROBE_SPINUP:
327		if (bootverbose)
328			xpt_print(path, "Spinning up device\n");
329		cam_fill_ataio(ataio,
330		      1,
331		      probedone,
332		      /*flags*/CAM_DIR_NONE | CAM_HIGH_POWER,
333		      0,
334		      /*data_ptr*/NULL,
335		      /*dxfer_len*/0,
336		      30 * 1000);
337		ata_28bit_cmd(ataio, ATA_SETFEATURES, ATA_SF_PUIS_SPINUP, 0, 0);
338		break;
339	case PROBE_SETMODE:
340	{
341		int mode, wantmode;
342
343		mode = 0;
344		/* Fetch user modes from SIM. */
345		bzero(&cts, sizeof(cts));
346		xpt_setup_ccb(&cts.ccb_h, path, CAM_PRIORITY_NONE);
347		cts.ccb_h.func_code = XPT_GET_TRAN_SETTINGS;
348		cts.type = CTS_TYPE_USER_SETTINGS;
349		xpt_action((union ccb *)&cts);
350		if (path->device->transport == XPORT_ATA) {
351			if (cts.xport_specific.ata.valid & CTS_ATA_VALID_MODE)
352				mode = cts.xport_specific.ata.mode;
353		} else {
354			if (cts.xport_specific.sata.valid & CTS_SATA_VALID_MODE)
355				mode = cts.xport_specific.sata.mode;
356		}
357negotiate:
358		/* Honor device capabilities. */
359		wantmode = mode = ata_max_mode(ident_buf, mode);
360		/* Report modes to SIM. */
361		bzero(&cts, sizeof(cts));
362		xpt_setup_ccb(&cts.ccb_h, path, CAM_PRIORITY_NONE);
363		cts.ccb_h.func_code = XPT_SET_TRAN_SETTINGS;
364		cts.type = CTS_TYPE_CURRENT_SETTINGS;
365		if (path->device->transport == XPORT_ATA) {
366			cts.xport_specific.ata.mode = mode;
367			cts.xport_specific.ata.valid = CTS_ATA_VALID_MODE;
368		} else {
369			cts.xport_specific.sata.mode = mode;
370			cts.xport_specific.sata.valid = CTS_SATA_VALID_MODE;
371		}
372		xpt_action((union ccb *)&cts);
373		/* Fetch current modes from SIM. */
374		bzero(&cts, sizeof(cts));
375		xpt_setup_ccb(&cts.ccb_h, path, CAM_PRIORITY_NONE);
376		cts.ccb_h.func_code = XPT_GET_TRAN_SETTINGS;
377		cts.type = CTS_TYPE_CURRENT_SETTINGS;
378		xpt_action((union ccb *)&cts);
379		if (path->device->transport == XPORT_ATA) {
380			if (cts.xport_specific.ata.valid & CTS_ATA_VALID_MODE)
381				mode = cts.xport_specific.ata.mode;
382		} else {
383			if (cts.xport_specific.ata.valid & CTS_SATA_VALID_MODE)
384				mode = cts.xport_specific.sata.mode;
385		}
386		/* If SIM disagree - renegotiate. */
387		if (mode != wantmode)
388			goto negotiate;
389		cam_fill_ataio(ataio,
390		      1,
391		      probedone,
392		      /*flags*/CAM_DIR_NONE,
393		      0,
394		      /*data_ptr*/NULL,
395		      /*dxfer_len*/0,
396		      30 * 1000);
397		ata_28bit_cmd(ataio, ATA_SETFEATURES, ATA_SF_SETXFER, 0, mode);
398		break;
399	}
400	case PROBE_SETPM:
401		cam_fill_ataio(ataio,
402		    1,
403		    probedone,
404		    CAM_DIR_NONE,
405		    0,
406		    NULL,
407		    0,
408		    30*1000);
409		ata_28bit_cmd(ataio, ATA_SETFEATURES,
410		    (softc->caps & CTS_SATA_CAPS_H_PMREQ) ? 0x10 : 0x90,
411		    0, 0x03);
412		break;
413	case PROBE_SETAPST:
414		cam_fill_ataio(ataio,
415		    1,
416		    probedone,
417		    CAM_DIR_NONE,
418		    0,
419		    NULL,
420		    0,
421		    30*1000);
422		ata_28bit_cmd(ataio, ATA_SETFEATURES,
423		    (softc->caps & CTS_SATA_CAPS_H_APST) ? 0x10 : 0x90,
424		    0, 0x07);
425		break;
426	case PROBE_SETDMAAA:
427		cam_fill_ataio(ataio,
428		    1,
429		    probedone,
430		    CAM_DIR_NONE,
431		    0,
432		    NULL,
433		    0,
434		    30*1000);
435		ata_28bit_cmd(ataio, ATA_SETFEATURES,
436		    (softc->caps & CTS_SATA_CAPS_H_DMAAA) ? 0x10 : 0x90,
437		    0, 0x02);
438		break;
439	case PROBE_SET_MULTI:
440	{
441		u_int sectors, bytecount;
442
443		bytecount = 8192;	/* SATA maximum */
444		/* Fetch user bytecount from SIM. */
445		bzero(&cts, sizeof(cts));
446		xpt_setup_ccb(&cts.ccb_h, path, CAM_PRIORITY_NONE);
447		cts.ccb_h.func_code = XPT_GET_TRAN_SETTINGS;
448		cts.type = CTS_TYPE_USER_SETTINGS;
449		xpt_action((union ccb *)&cts);
450		if (path->device->transport == XPORT_ATA) {
451			if (cts.xport_specific.ata.valid & CTS_ATA_VALID_BYTECOUNT)
452				bytecount = cts.xport_specific.ata.bytecount;
453		} else {
454			if (cts.xport_specific.sata.valid & CTS_SATA_VALID_BYTECOUNT)
455				bytecount = cts.xport_specific.sata.bytecount;
456		}
457		/* Honor device capabilities. */
458		sectors = max(1, min(ident_buf->sectors_intr & 0xff,
459		    bytecount / ata_logical_sector_size(ident_buf)));
460		/* Report bytecount to SIM. */
461		bzero(&cts, sizeof(cts));
462		xpt_setup_ccb(&cts.ccb_h, path, CAM_PRIORITY_NONE);
463		cts.ccb_h.func_code = XPT_SET_TRAN_SETTINGS;
464		cts.type = CTS_TYPE_CURRENT_SETTINGS;
465		if (path->device->transport == XPORT_ATA) {
466			cts.xport_specific.ata.bytecount = sectors *
467			    ata_logical_sector_size(ident_buf);
468			cts.xport_specific.ata.valid = CTS_ATA_VALID_BYTECOUNT;
469		} else {
470			cts.xport_specific.sata.bytecount = sectors *
471			    ata_logical_sector_size(ident_buf);
472			cts.xport_specific.sata.valid = CTS_SATA_VALID_BYTECOUNT;
473		}
474		xpt_action((union ccb *)&cts);
475		/* Fetch current bytecount from SIM. */
476		bzero(&cts, sizeof(cts));
477		xpt_setup_ccb(&cts.ccb_h, path, CAM_PRIORITY_NONE);
478		cts.ccb_h.func_code = XPT_GET_TRAN_SETTINGS;
479		cts.type = CTS_TYPE_CURRENT_SETTINGS;
480		xpt_action((union ccb *)&cts);
481		if (path->device->transport == XPORT_ATA) {
482			if (cts.xport_specific.ata.valid & CTS_ATA_VALID_BYTECOUNT)
483				bytecount = cts.xport_specific.ata.bytecount;
484		} else {
485			if (cts.xport_specific.sata.valid & CTS_SATA_VALID_BYTECOUNT)
486				bytecount = cts.xport_specific.sata.bytecount;
487		}
488		sectors = bytecount / ata_logical_sector_size(ident_buf);
489
490		cam_fill_ataio(ataio,
491		    1,
492		    probedone,
493		    CAM_DIR_NONE,
494		    0,
495		    NULL,
496		    0,
497		    30*1000);
498		ata_28bit_cmd(ataio, ATA_SET_MULTI, 0, 0, sectors);
499		break;
500	}
501	case PROBE_INQUIRY:
502	{
503		u_int bytecount;
504
505		bytecount = 8192;	/* SATA maximum */
506		/* Fetch user bytecount from SIM. */
507		bzero(&cts, sizeof(cts));
508		xpt_setup_ccb(&cts.ccb_h, path, CAM_PRIORITY_NONE);
509		cts.ccb_h.func_code = XPT_GET_TRAN_SETTINGS;
510		cts.type = CTS_TYPE_USER_SETTINGS;
511		xpt_action((union ccb *)&cts);
512		if (path->device->transport == XPORT_ATA) {
513			if (cts.xport_specific.ata.valid & CTS_ATA_VALID_BYTECOUNT)
514				bytecount = cts.xport_specific.ata.bytecount;
515		} else {
516			if (cts.xport_specific.sata.valid & CTS_SATA_VALID_BYTECOUNT)
517				bytecount = cts.xport_specific.sata.bytecount;
518		}
519		/* Honor device capabilities. */
520		bytecount &= ~1;
521		bytecount = max(2, min(65534, bytecount));
522		if (ident_buf->satacapabilities != 0x0000 &&
523		    ident_buf->satacapabilities != 0xffff) {
524			bytecount = min(8192, bytecount);
525		}
526		/* Report bytecount to SIM. */
527		bzero(&cts, sizeof(cts));
528		xpt_setup_ccb(&cts.ccb_h, path, CAM_PRIORITY_NONE);
529		cts.ccb_h.func_code = XPT_SET_TRAN_SETTINGS;
530		cts.type = CTS_TYPE_CURRENT_SETTINGS;
531		if (path->device->transport == XPORT_ATA) {
532			cts.xport_specific.ata.bytecount = bytecount;
533			cts.xport_specific.ata.valid = CTS_ATA_VALID_BYTECOUNT;
534		} else {
535			cts.xport_specific.sata.bytecount = bytecount;
536			cts.xport_specific.sata.valid = CTS_SATA_VALID_BYTECOUNT;
537		}
538		xpt_action((union ccb *)&cts);
539		/* FALLTHROUGH */
540	}
541	case PROBE_FULL_INQUIRY:
542	{
543		u_int inquiry_len;
544		struct scsi_inquiry_data *inq_buf =
545		    &periph->path->device->inq_data;
546
547		if (softc->action == PROBE_INQUIRY)
548			inquiry_len = SHORT_INQUIRY_LENGTH;
549		else
550			inquiry_len = SID_ADDITIONAL_LENGTH(inq_buf);
551		/*
552		 * Some parallel SCSI devices fail to send an
553		 * ignore wide residue message when dealing with
554		 * odd length inquiry requests.  Round up to be
555		 * safe.
556		 */
557		inquiry_len = roundup2(inquiry_len, 2);
558		scsi_inquiry(csio,
559			     /*retries*/1,
560			     probedone,
561			     MSG_SIMPLE_Q_TAG,
562			     (u_int8_t *)inq_buf,
563			     inquiry_len,
564			     /*evpd*/FALSE,
565			     /*page_code*/0,
566			     SSD_MIN_SIZE,
567			     /*timeout*/60 * 1000);
568		break;
569	}
570	case PROBE_PM_PID:
571		cam_fill_ataio(ataio,
572		      1,
573		      probedone,
574		      /*flags*/CAM_DIR_NONE,
575		      0,
576		      /*data_ptr*/NULL,
577		      /*dxfer_len*/0,
578		      10 * 1000);
579		ata_pm_read_cmd(ataio, 0, 15);
580		break;
581	case PROBE_PM_PRV:
582		cam_fill_ataio(ataio,
583		      1,
584		      probedone,
585		      /*flags*/CAM_DIR_NONE,
586		      0,
587		      /*data_ptr*/NULL,
588		      /*dxfer_len*/0,
589		      10 * 1000);
590		ata_pm_read_cmd(ataio, 1, 15);
591		break;
592	case PROBE_INVALID:
593		CAM_DEBUG(path, CAM_DEBUG_INFO,
594		    ("probestart: invalid action state\n"));
595	default:
596		break;
597	}
598	xpt_action(start_ccb);
599}
600#if 0
601static void
602proberequestdefaultnegotiation(struct cam_periph *periph)
603{
604	struct ccb_trans_settings cts;
605
606	xpt_setup_ccb(&cts.ccb_h, periph->path, CAM_PRIORITY_NONE);
607	cts.ccb_h.func_code = XPT_GET_TRAN_SETTINGS;
608	cts.type = CTS_TYPE_USER_SETTINGS;
609	xpt_action((union ccb *)&cts);
610	if ((cts.ccb_h.status & CAM_STATUS_MASK) != CAM_REQ_CMP) {
611		return;
612	}
613	cts.ccb_h.func_code = XPT_SET_TRAN_SETTINGS;
614	cts.type = CTS_TYPE_CURRENT_SETTINGS;
615	xpt_action((union ccb *)&cts);
616}
617
618/*
619 * Backoff Negotiation Code- only pertinent for SPI devices.
620 */
621static int
622proberequestbackoff(struct cam_periph *periph, struct cam_ed *device)
623{
624	struct ccb_trans_settings cts;
625	struct ccb_trans_settings_spi *spi;
626
627	memset(&cts, 0, sizeof (cts));
628	xpt_setup_ccb(&cts.ccb_h, periph->path, CAM_PRIORITY_NONE);
629	cts.ccb_h.func_code = XPT_GET_TRAN_SETTINGS;
630	cts.type = CTS_TYPE_CURRENT_SETTINGS;
631	xpt_action((union ccb *)&cts);
632	if ((cts.ccb_h.status & CAM_STATUS_MASK) != CAM_REQ_CMP) {
633		if (bootverbose) {
634			xpt_print(periph->path,
635			    "failed to get current device settings\n");
636		}
637		return (0);
638	}
639	if (cts.transport != XPORT_SPI) {
640		if (bootverbose) {
641			xpt_print(periph->path, "not SPI transport\n");
642		}
643		return (0);
644	}
645	spi = &cts.xport_specific.spi;
646
647	/*
648	 * We cannot renegotiate sync rate if we don't have one.
649	 */
650	if ((spi->valid & CTS_SPI_VALID_SYNC_RATE) == 0) {
651		if (bootverbose) {
652			xpt_print(periph->path, "no sync rate known\n");
653		}
654		return (0);
655	}
656
657	/*
658	 * We'll assert that we don't have to touch PPR options- the
659	 * SIM will see what we do with period and offset and adjust
660	 * the PPR options as appropriate.
661	 */
662
663	/*
664	 * A sync rate with unknown or zero offset is nonsensical.
665	 * A sync period of zero means Async.
666	 */
667	if ((spi->valid & CTS_SPI_VALID_SYNC_OFFSET) == 0
668	 || spi->sync_offset == 0 || spi->sync_period == 0) {
669		if (bootverbose) {
670			xpt_print(periph->path, "no sync rate available\n");
671		}
672		return (0);
673	}
674
675	if (device->flags & CAM_DEV_DV_HIT_BOTTOM) {
676		CAM_DEBUG(periph->path, CAM_DEBUG_INFO,
677		    ("hit async: giving up on DV\n"));
678		return (0);
679	}
680
681
682	/*
683	 * Jump sync_period up by one, but stop at 5MHz and fall back to Async.
684	 * We don't try to remember 'last' settings to see if the SIM actually
685	 * gets into the speed we want to set. We check on the SIM telling
686	 * us that a requested speed is bad, but otherwise don't try and
687	 * check the speed due to the asynchronous and handshake nature
688	 * of speed setting.
689	 */
690	spi->valid = CTS_SPI_VALID_SYNC_RATE | CTS_SPI_VALID_SYNC_OFFSET;
691	for (;;) {
692		spi->sync_period++;
693		if (spi->sync_period >= 0xf) {
694			spi->sync_period = 0;
695			spi->sync_offset = 0;
696			CAM_DEBUG(periph->path, CAM_DEBUG_INFO,
697			    ("setting to async for DV\n"));
698			/*
699			 * Once we hit async, we don't want to try
700			 * any more settings.
701			 */
702			device->flags |= CAM_DEV_DV_HIT_BOTTOM;
703		} else if (bootverbose) {
704			CAM_DEBUG(periph->path, CAM_DEBUG_INFO,
705			    ("DV: period 0x%x\n", spi->sync_period));
706			printf("setting period to 0x%x\n", spi->sync_period);
707		}
708		cts.ccb_h.func_code = XPT_SET_TRAN_SETTINGS;
709		cts.type = CTS_TYPE_CURRENT_SETTINGS;
710		xpt_action((union ccb *)&cts);
711		if ((cts.ccb_h.status & CAM_STATUS_MASK) == CAM_REQ_CMP) {
712			break;
713		}
714		CAM_DEBUG(periph->path, CAM_DEBUG_INFO,
715		    ("DV: failed to set period 0x%x\n", spi->sync_period));
716		if (spi->sync_period == 0) {
717			return (0);
718		}
719	}
720	return (1);
721}
722#endif
723static void
724probedone(struct cam_periph *periph, union ccb *done_ccb)
725{
726	struct ccb_trans_settings cts;
727	struct ata_params *ident_buf;
728	probe_softc *softc;
729	struct cam_path *path;
730	cam_status status;
731	u_int32_t  priority;
732	u_int caps;
733	int found = 1;
734
735	CAM_DEBUG(done_ccb->ccb_h.path, CAM_DEBUG_TRACE, ("probedone\n"));
736
737	softc = (probe_softc *)periph->softc;
738	path = done_ccb->ccb_h.path;
739	priority = done_ccb->ccb_h.pinfo.priority;
740	ident_buf = &path->device->ident_data;
741
742	if ((done_ccb->ccb_h.status & CAM_STATUS_MASK) != CAM_REQ_CMP) {
743		if (softc->restart) {
744			if (bootverbose) {
745				cam_error_print(done_ccb,
746				    CAM_ESF_ALL, CAM_EPF_ALL);
747			}
748		} else if (cam_periph_error(done_ccb, 0, 0, NULL) == ERESTART)
749			return;
750		if ((done_ccb->ccb_h.status & CAM_DEV_QFRZN) != 0) {
751			/* Don't wedge the queue */
752			xpt_release_devq(done_ccb->ccb_h.path, /*count*/1,
753					 /*run_queue*/TRUE);
754		}
755		status = done_ccb->ccb_h.status & CAM_STATUS_MASK;
756		if (softc->restart) {
757			softc->faults++;
758			if ((done_ccb->ccb_h.status & CAM_STATUS_MASK) ==
759			    CAM_CMD_TIMEOUT)
760				softc->faults += 4;
761			if (softc->faults < 10)
762				goto done;
763			else
764				softc->restart = 0;
765
766		/* Old PIO2 devices may not support mode setting. */
767		} else if (softc->action == PROBE_SETMODE &&
768		    status == CAM_ATA_STATUS_ERROR &&
769		    ata_max_pmode(ident_buf) <= ATA_PIO2 &&
770		    (ident_buf->capabilities1 & ATA_SUPPORT_IORDY) == 0) {
771			goto noerror;
772
773		/*
774		 * Some old WD SATA disks report supported and enabled
775		 * device-initiated interface power management, but return
776		 * ABORT on attempt to disable it.
777		 */
778		} else if (softc->action == PROBE_SETPM &&
779		    status == CAM_ATA_STATUS_ERROR) {
780			goto noerror;
781		}
782
783		/*
784		 * If we get to this point, we got an error status back
785		 * from the inquiry and the error status doesn't require
786		 * automatically retrying the command.  Therefore, the
787		 * inquiry failed.  If we had inquiry information before
788		 * for this device, but this latest inquiry command failed,
789		 * the device has probably gone away.  If this device isn't
790		 * already marked unconfigured, notify the peripheral
791		 * drivers that this device is no more.
792		 */
793device_fail:	if ((path->device->flags & CAM_DEV_UNCONFIGURED) == 0)
794			xpt_async(AC_LOST_DEVICE, path, NULL);
795		found = 0;
796		goto done;
797	}
798noerror:
799	if (softc->restart)
800		goto done;
801	switch (softc->action) {
802	case PROBE_RESET:
803	{
804		int sign = (done_ccb->ataio.res.lba_high << 8) +
805		    done_ccb->ataio.res.lba_mid;
806		if (bootverbose)
807			xpt_print(path, "SIGNATURE: %04x\n", sign);
808		if (sign == 0x0000 &&
809		    done_ccb->ccb_h.target_id != 15) {
810			path->device->protocol = PROTO_ATA;
811			PROBE_SET_ACTION(softc, PROBE_IDENTIFY);
812		} else if (sign == 0x9669 &&
813		    done_ccb->ccb_h.target_id == 15) {
814			/* Report SIM that PM is present. */
815			bzero(&cts, sizeof(cts));
816			xpt_setup_ccb(&cts.ccb_h, path, CAM_PRIORITY_NONE);
817			cts.ccb_h.func_code = XPT_SET_TRAN_SETTINGS;
818			cts.type = CTS_TYPE_CURRENT_SETTINGS;
819			cts.xport_specific.sata.pm_present = 1;
820			cts.xport_specific.sata.valid = CTS_SATA_VALID_PM;
821			xpt_action((union ccb *)&cts);
822			path->device->protocol = PROTO_SATAPM;
823			PROBE_SET_ACTION(softc, PROBE_PM_PID);
824		} else if (sign == 0xeb14 &&
825		    done_ccb->ccb_h.target_id != 15) {
826			path->device->protocol = PROTO_SCSI;
827			PROBE_SET_ACTION(softc, PROBE_IDENTIFY);
828		} else {
829			if (done_ccb->ccb_h.target_id != 15) {
830				xpt_print(path,
831				    "Unexpected signature 0x%04x\n", sign);
832			}
833			goto device_fail;
834		}
835		xpt_release_ccb(done_ccb);
836		xpt_schedule(periph, priority);
837		return;
838	}
839	case PROBE_IDENTIFY:
840	{
841		struct ccb_pathinq cpi;
842		int16_t *ptr;
843		int changed = 1;
844
845		ident_buf = &softc->ident_data;
846		for (ptr = (int16_t *)ident_buf;
847		     ptr < (int16_t *)ident_buf + sizeof(struct ata_params)/2; ptr++) {
848			*ptr = le16toh(*ptr);
849		}
850		if (strncmp(ident_buf->model, "FX", 2) &&
851		    strncmp(ident_buf->model, "NEC", 3) &&
852		    strncmp(ident_buf->model, "Pioneer", 7) &&
853		    strncmp(ident_buf->model, "SHARP", 5)) {
854			ata_bswap(ident_buf->model, sizeof(ident_buf->model));
855			ata_bswap(ident_buf->revision, sizeof(ident_buf->revision));
856			ata_bswap(ident_buf->serial, sizeof(ident_buf->serial));
857		}
858		ata_btrim(ident_buf->model, sizeof(ident_buf->model));
859		ata_bpack(ident_buf->model, ident_buf->model, sizeof(ident_buf->model));
860		ata_btrim(ident_buf->revision, sizeof(ident_buf->revision));
861		ata_bpack(ident_buf->revision, ident_buf->revision, sizeof(ident_buf->revision));
862		ata_btrim(ident_buf->serial, sizeof(ident_buf->serial));
863		ata_bpack(ident_buf->serial, ident_buf->serial, sizeof(ident_buf->serial));
864		/* Device may need spin-up before IDENTIFY become valid. */
865		if ((ident_buf->specconf == 0x37c8 ||
866		     ident_buf->specconf == 0x738c) &&
867		    ((ident_buf->config & ATA_RESP_INCOMPLETE) ||
868		     softc->spinup == 0)) {
869			PROBE_SET_ACTION(softc, PROBE_SPINUP);
870			xpt_release_ccb(done_ccb);
871			xpt_schedule(periph, priority);
872			return;
873		}
874		ident_buf = &path->device->ident_data;
875		if ((periph->path->device->flags & CAM_DEV_UNCONFIGURED) == 0) {
876			/* Check that it is the same device. */
877			if (bcmp(softc->ident_data.model, ident_buf->model,
878			     sizeof(ident_buf->model)) ||
879			    bcmp(softc->ident_data.revision, ident_buf->revision,
880			     sizeof(ident_buf->revision)) ||
881			    bcmp(softc->ident_data.serial, ident_buf->serial,
882			     sizeof(ident_buf->serial))) {
883				/* Device changed. */
884				xpt_async(AC_LOST_DEVICE, path, NULL);
885			} else {
886				bcopy(&softc->ident_data, ident_buf, sizeof(struct ata_params));
887				changed = 0;
888			}
889		}
890		if (changed) {
891			bcopy(&softc->ident_data, ident_buf, sizeof(struct ata_params));
892			/* Clean up from previous instance of this device */
893			if (path->device->serial_num != NULL) {
894				free(path->device->serial_num, M_CAMXPT);
895				path->device->serial_num = NULL;
896				path->device->serial_num_len = 0;
897			}
898			path->device->serial_num =
899				(u_int8_t *)malloc((sizeof(ident_buf->serial) + 1),
900					   M_CAMXPT, M_NOWAIT);
901			if (path->device->serial_num != NULL) {
902				bcopy(ident_buf->serial,
903				      path->device->serial_num,
904				      sizeof(ident_buf->serial));
905				path->device->serial_num[sizeof(ident_buf->serial)]
906				    = '\0';
907				path->device->serial_num_len =
908				    strlen(path->device->serial_num);
909			}
910
911			path->device->flags |= CAM_DEV_IDENTIFY_DATA_VALID;
912		}
913		if (ident_buf->satacapabilities & ATA_SUPPORT_NCQ) {
914			path->device->mintags = path->device->maxtags =
915			    ATA_QUEUE_LEN(ident_buf->queue) + 1;
916		}
917		ata_find_quirk(path->device);
918		if (path->device->mintags != 0 &&
919		    path->bus->sim->max_tagged_dev_openings != 0) {
920			/* Check if the SIM does not want queued commands. */
921			bzero(&cpi, sizeof(cpi));
922			xpt_setup_ccb(&cpi.ccb_h, path, CAM_PRIORITY_NONE);
923			cpi.ccb_h.func_code = XPT_PATH_INQ;
924			xpt_action((union ccb *)&cpi);
925			if (cpi.ccb_h.status == CAM_REQ_CMP &&
926			    (cpi.hba_inquiry & PI_TAG_ABLE)) {
927				/* Report SIM which tags are allowed. */
928				bzero(&cts, sizeof(cts));
929				xpt_setup_ccb(&cts.ccb_h, path, CAM_PRIORITY_NONE);
930				cts.ccb_h.func_code = XPT_SET_TRAN_SETTINGS;
931				cts.type = CTS_TYPE_CURRENT_SETTINGS;
932				cts.xport_specific.sata.tags = path->device->maxtags;
933				cts.xport_specific.sata.valid = CTS_SATA_VALID_TAGS;
934				xpt_action((union ccb *)&cts);
935				/* Reconfigure queues for tagged queueing. */
936				xpt_start_tags(path);
937			}
938		}
939		ata_device_transport(path);
940		PROBE_SET_ACTION(softc, PROBE_SETMODE);
941		xpt_release_ccb(done_ccb);
942		xpt_schedule(periph, priority);
943		return;
944	}
945	case PROBE_SPINUP:
946		if (bootverbose)
947			xpt_print(path, "Spin-up done\n");
948		softc->spinup = 1;
949		PROBE_SET_ACTION(softc, PROBE_IDENTIFY);
950		xpt_release_ccb(done_ccb);
951		xpt_schedule(periph, priority);
952		return;
953	case PROBE_SETMODE:
954		if (path->device->transport != XPORT_SATA)
955			goto notsata;
956		/* Set supported bits. */
957		bzero(&cts, sizeof(cts));
958		xpt_setup_ccb(&cts.ccb_h, path, CAM_PRIORITY_NONE);
959		cts.ccb_h.func_code = XPT_GET_TRAN_SETTINGS;
960		cts.type = CTS_TYPE_CURRENT_SETTINGS;
961		xpt_action((union ccb *)&cts);
962		if (cts.xport_specific.sata.valid & CTS_SATA_VALID_CAPS)
963			caps = cts.xport_specific.sata.caps & CTS_SATA_CAPS_H;
964		else
965			caps = 0;
966		if (ident_buf->satacapabilities != 0xffff) {
967			if (ident_buf->satacapabilities & ATA_SUPPORT_IFPWRMNGTRCV)
968				caps |= CTS_SATA_CAPS_D_PMREQ;
969			if (ident_buf->satacapabilities & ATA_SUPPORT_HAPST)
970				caps |= CTS_SATA_CAPS_D_APST;
971		}
972		/* Mask unwanted bits. */
973		bzero(&cts, sizeof(cts));
974		xpt_setup_ccb(&cts.ccb_h, path, CAM_PRIORITY_NONE);
975		cts.ccb_h.func_code = XPT_GET_TRAN_SETTINGS;
976		cts.type = CTS_TYPE_USER_SETTINGS;
977		xpt_action((union ccb *)&cts);
978		if (cts.xport_specific.sata.valid & CTS_SATA_VALID_CAPS)
979			caps &= cts.xport_specific.sata.caps;
980		else
981			caps = 0;
982		/* Store result to SIM. */
983		bzero(&cts, sizeof(cts));
984		xpt_setup_ccb(&cts.ccb_h, path, CAM_PRIORITY_NONE);
985		cts.ccb_h.func_code = XPT_SET_TRAN_SETTINGS;
986		cts.type = CTS_TYPE_CURRENT_SETTINGS;
987		cts.xport_specific.sata.caps = caps;
988		cts.xport_specific.sata.valid = CTS_SATA_VALID_CAPS;
989		xpt_action((union ccb *)&cts);
990		softc->caps = caps;
991		if ((ident_buf->satasupport & ATA_SUPPORT_IFPWRMNGT) &&
992		    (!(softc->caps & CTS_SATA_CAPS_H_PMREQ)) !=
993		    (!(ident_buf->sataenabled & ATA_SUPPORT_IFPWRMNGT))) {
994			PROBE_SET_ACTION(softc, PROBE_SETPM);
995			xpt_release_ccb(done_ccb);
996			xpt_schedule(periph, priority);
997			return;
998		}
999		/* FALLTHROUGH */
1000	case PROBE_SETPM:
1001		if (ident_buf->satacapabilities != 0xffff &&
1002		    (ident_buf->satacapabilities & ATA_SUPPORT_DAPST) &&
1003		    (!(softc->caps & CTS_SATA_CAPS_H_APST)) !=
1004		    (!(ident_buf->sataenabled & ATA_ENABLED_DAPST))) {
1005			PROBE_SET_ACTION(softc, PROBE_SETAPST);
1006			xpt_release_ccb(done_ccb);
1007			xpt_schedule(periph, priority);
1008			return;
1009		}
1010		/* FALLTHROUGH */
1011	case PROBE_SETAPST:
1012		if ((ident_buf->satasupport & ATA_SUPPORT_AUTOACTIVATE) &&
1013		    (!(softc->caps & CTS_SATA_CAPS_H_DMAAA)) !=
1014		    (!(ident_buf->sataenabled & ATA_SUPPORT_AUTOACTIVATE))) {
1015			PROBE_SET_ACTION(softc, PROBE_SETDMAAA);
1016			xpt_release_ccb(done_ccb);
1017			xpt_schedule(periph, priority);
1018			return;
1019		}
1020		/* FALLTHROUGH */
1021	case PROBE_SETDMAAA:
1022notsata:
1023		if (path->device->protocol == PROTO_ATA) {
1024			PROBE_SET_ACTION(softc, PROBE_SET_MULTI);
1025		} else {
1026			PROBE_SET_ACTION(softc, PROBE_INQUIRY);
1027		}
1028		xpt_release_ccb(done_ccb);
1029		xpt_schedule(periph, priority);
1030		return;
1031	case PROBE_SET_MULTI:
1032		if (periph->path->device->flags & CAM_DEV_UNCONFIGURED) {
1033			path->device->flags &= ~CAM_DEV_UNCONFIGURED;
1034			xpt_acquire_device(path->device);
1035			done_ccb->ccb_h.func_code = XPT_GDEV_TYPE;
1036			xpt_action(done_ccb);
1037			xpt_async(AC_FOUND_DEVICE, done_ccb->ccb_h.path,
1038			    done_ccb);
1039		}
1040		break;
1041	case PROBE_INQUIRY:
1042	case PROBE_FULL_INQUIRY:
1043	{
1044		struct scsi_inquiry_data *inq_buf;
1045		u_int8_t periph_qual, len;
1046
1047		path->device->flags |= CAM_DEV_INQUIRY_DATA_VALID;
1048		inq_buf = &path->device->inq_data;
1049
1050		periph_qual = SID_QUAL(inq_buf);
1051
1052		if (periph_qual != SID_QUAL_LU_CONNECTED)
1053			break;
1054
1055		/*
1056		 * We conservatively request only
1057		 * SHORT_INQUIRY_LEN bytes of inquiry
1058		 * information during our first try
1059		 * at sending an INQUIRY. If the device
1060		 * has more information to give,
1061		 * perform a second request specifying
1062		 * the amount of information the device
1063		 * is willing to give.
1064		 */
1065		len = inq_buf->additional_length
1066		    + offsetof(struct scsi_inquiry_data, additional_length) + 1;
1067		if (softc->action == PROBE_INQUIRY
1068		    && len > SHORT_INQUIRY_LENGTH) {
1069			PROBE_SET_ACTION(softc, PROBE_FULL_INQUIRY);
1070			xpt_release_ccb(done_ccb);
1071			xpt_schedule(periph, priority);
1072			return;
1073		}
1074
1075		ata_device_transport(path);
1076		if (periph->path->device->flags & CAM_DEV_UNCONFIGURED) {
1077			path->device->flags &= ~CAM_DEV_UNCONFIGURED;
1078			xpt_acquire_device(path->device);
1079			done_ccb->ccb_h.func_code = XPT_GDEV_TYPE;
1080			xpt_action(done_ccb);
1081			xpt_async(AC_FOUND_DEVICE, done_ccb->ccb_h.path, done_ccb);
1082		}
1083		break;
1084	}
1085	case PROBE_PM_PID:
1086		if ((path->device->flags & CAM_DEV_IDENTIFY_DATA_VALID) == 0)
1087			bzero(ident_buf, sizeof(*ident_buf));
1088		softc->pm_pid = (done_ccb->ataio.res.lba_high << 24) +
1089		    (done_ccb->ataio.res.lba_mid << 16) +
1090		    (done_ccb->ataio.res.lba_low << 8) +
1091		    done_ccb->ataio.res.sector_count;
1092		((uint32_t *)ident_buf)[0] = softc->pm_pid;
1093		snprintf(ident_buf->model, sizeof(ident_buf->model),
1094		    "Port Multiplier %08x", softc->pm_pid);
1095		PROBE_SET_ACTION(softc, PROBE_PM_PRV);
1096		xpt_release_ccb(done_ccb);
1097		xpt_schedule(periph, priority);
1098		return;
1099	case PROBE_PM_PRV:
1100		softc->pm_prv = (done_ccb->ataio.res.lba_high << 24) +
1101		    (done_ccb->ataio.res.lba_mid << 16) +
1102		    (done_ccb->ataio.res.lba_low << 8) +
1103		    done_ccb->ataio.res.sector_count;
1104		((uint32_t *)ident_buf)[1] = softc->pm_prv;
1105		snprintf(ident_buf->revision, sizeof(ident_buf->revision),
1106		    "%04x", softc->pm_prv);
1107		path->device->flags |= CAM_DEV_IDENTIFY_DATA_VALID;
1108		/* Set supported bits. */
1109		bzero(&cts, sizeof(cts));
1110		xpt_setup_ccb(&cts.ccb_h, path, CAM_PRIORITY_NONE);
1111		cts.ccb_h.func_code = XPT_GET_TRAN_SETTINGS;
1112		cts.type = CTS_TYPE_CURRENT_SETTINGS;
1113		xpt_action((union ccb *)&cts);
1114		if (cts.xport_specific.sata.valid & CTS_SATA_VALID_CAPS)
1115			caps = cts.xport_specific.sata.caps & CTS_SATA_CAPS_H;
1116		else
1117			caps = 0;
1118		/* All PMPs must support PM requests. */
1119		caps |= CTS_SATA_CAPS_D_PMREQ;
1120		/* Mask unwanted bits. */
1121		bzero(&cts, sizeof(cts));
1122		xpt_setup_ccb(&cts.ccb_h, path, CAM_PRIORITY_NONE);
1123		cts.ccb_h.func_code = XPT_GET_TRAN_SETTINGS;
1124		cts.type = CTS_TYPE_USER_SETTINGS;
1125		xpt_action((union ccb *)&cts);
1126		if (cts.xport_specific.sata.valid & CTS_SATA_VALID_CAPS)
1127			caps &= cts.xport_specific.sata.caps;
1128		else
1129			caps = 0;
1130		/* Store result to SIM. */
1131		bzero(&cts, sizeof(cts));
1132		xpt_setup_ccb(&cts.ccb_h, path, CAM_PRIORITY_NONE);
1133		cts.ccb_h.func_code = XPT_SET_TRAN_SETTINGS;
1134		cts.type = CTS_TYPE_CURRENT_SETTINGS;
1135		cts.xport_specific.sata.caps = caps;
1136		cts.xport_specific.sata.valid = CTS_SATA_VALID_CAPS;
1137		xpt_action((union ccb *)&cts);
1138		softc->caps = caps;
1139		if (periph->path->device->flags & CAM_DEV_UNCONFIGURED) {
1140			path->device->flags &= ~CAM_DEV_UNCONFIGURED;
1141			xpt_acquire_device(path->device);
1142			done_ccb->ccb_h.func_code = XPT_GDEV_TYPE;
1143			xpt_action(done_ccb);
1144			xpt_async(AC_FOUND_DEVICE, done_ccb->ccb_h.path,
1145			    done_ccb);
1146		} else {
1147			done_ccb->ccb_h.func_code = XPT_GDEV_TYPE;
1148			xpt_action(done_ccb);
1149			xpt_async(AC_SCSI_AEN, done_ccb->ccb_h.path, done_ccb);
1150		}
1151		break;
1152	case PROBE_INVALID:
1153		CAM_DEBUG(done_ccb->ccb_h.path, CAM_DEBUG_INFO,
1154		    ("probedone: invalid action state\n"));
1155	default:
1156		break;
1157	}
1158done:
1159	if (softc->restart) {
1160		softc->restart = 0;
1161		xpt_release_ccb(done_ccb);
1162		probeschedule(periph);
1163		return;
1164	}
1165	xpt_release_ccb(done_ccb);
1166	while ((done_ccb = (union ccb *)TAILQ_FIRST(&softc->request_ccbs))) {
1167		TAILQ_REMOVE(&softc->request_ccbs,
1168		    &done_ccb->ccb_h, periph_links.tqe);
1169		done_ccb->ccb_h.status = found ? CAM_REQ_CMP : CAM_REQ_CMP_ERR;
1170		xpt_done(done_ccb);
1171	}
1172	cam_release_devq(periph->path,
1173	    RELSIM_RELEASE_RUNLEVEL, 0, CAM_RL_XPT + 1, FALSE);
1174	cam_periph_invalidate(periph);
1175	cam_periph_release_locked(periph);
1176}
1177
1178static void
1179probecleanup(struct cam_periph *periph)
1180{
1181	free(periph->softc, M_CAMXPT);
1182}
1183
1184static void
1185ata_find_quirk(struct cam_ed *device)
1186{
1187	struct ata_quirk_entry *quirk;
1188	caddr_t	match;
1189
1190	match = cam_quirkmatch((caddr_t)&device->ident_data,
1191			       (caddr_t)ata_quirk_table,
1192			       ata_quirk_table_size,
1193			       sizeof(*ata_quirk_table), ata_identify_match);
1194
1195	if (match == NULL)
1196		panic("xpt_find_quirk: device didn't match wildcard entry!!");
1197
1198	quirk = (struct ata_quirk_entry *)match;
1199	device->quirk = quirk;
1200	if (quirk->quirks & CAM_QUIRK_MAXTAGS)
1201		device->mintags = device->maxtags = quirk->maxtags;
1202}
1203
1204typedef struct {
1205	union	ccb *request_ccb;
1206	struct 	ccb_pathinq *cpi;
1207	int	counter;
1208} ata_scan_bus_info;
1209
1210/*
1211 * To start a scan, request_ccb is an XPT_SCAN_BUS ccb.
1212 * As the scan progresses, xpt_scan_bus is used as the
1213 * callback on completion function.
1214 */
1215static void
1216ata_scan_bus(struct cam_periph *periph, union ccb *request_ccb)
1217{
1218	struct	cam_path *path;
1219	ata_scan_bus_info *scan_info;
1220	union	ccb *work_ccb, *reset_ccb;
1221	cam_status status;
1222
1223	CAM_DEBUG(request_ccb->ccb_h.path, CAM_DEBUG_TRACE,
1224		  ("xpt_scan_bus\n"));
1225	switch (request_ccb->ccb_h.func_code) {
1226	case XPT_SCAN_BUS:
1227	case XPT_SCAN_TGT:
1228		/* Find out the characteristics of the bus */
1229		work_ccb = xpt_alloc_ccb_nowait();
1230		if (work_ccb == NULL) {
1231			request_ccb->ccb_h.status = CAM_RESRC_UNAVAIL;
1232			xpt_done(request_ccb);
1233			return;
1234		}
1235		xpt_setup_ccb(&work_ccb->ccb_h, request_ccb->ccb_h.path,
1236			      request_ccb->ccb_h.pinfo.priority);
1237		work_ccb->ccb_h.func_code = XPT_PATH_INQ;
1238		xpt_action(work_ccb);
1239		if (work_ccb->ccb_h.status != CAM_REQ_CMP) {
1240			request_ccb->ccb_h.status = work_ccb->ccb_h.status;
1241			xpt_free_ccb(work_ccb);
1242			xpt_done(request_ccb);
1243			return;
1244		}
1245
1246		/* We may need to reset bus first, if we haven't done it yet. */
1247		if ((work_ccb->cpi.hba_inquiry &
1248		    (PI_WIDE_32|PI_WIDE_16|PI_SDTR_ABLE)) &&
1249		    !(work_ccb->cpi.hba_misc & PIM_NOBUSRESET) &&
1250		    !timevalisset(&request_ccb->ccb_h.path->bus->last_reset)) {
1251			reset_ccb = xpt_alloc_ccb_nowait();
1252			if (reset_ccb == NULL) {
1253				request_ccb->ccb_h.status = CAM_RESRC_UNAVAIL;
1254				xpt_free_ccb(work_ccb);
1255				xpt_done(request_ccb);
1256				return;
1257			}
1258			xpt_setup_ccb(&reset_ccb->ccb_h, request_ccb->ccb_h.path,
1259			      CAM_PRIORITY_NONE);
1260			reset_ccb->ccb_h.func_code = XPT_RESET_BUS;
1261			xpt_action(reset_ccb);
1262			if (reset_ccb->ccb_h.status != CAM_REQ_CMP) {
1263				request_ccb->ccb_h.status = reset_ccb->ccb_h.status;
1264				xpt_free_ccb(reset_ccb);
1265				xpt_free_ccb(work_ccb);
1266				xpt_done(request_ccb);
1267				return;
1268			}
1269			xpt_free_ccb(reset_ccb);
1270		}
1271
1272		/* Save some state for use while we probe for devices */
1273		scan_info = (ata_scan_bus_info *)
1274		    malloc(sizeof(ata_scan_bus_info), M_CAMXPT, M_NOWAIT);
1275		if (scan_info == NULL) {
1276			request_ccb->ccb_h.status = CAM_RESRC_UNAVAIL;
1277			xpt_free_ccb(work_ccb);
1278			xpt_done(request_ccb);
1279			return;
1280		}
1281		scan_info->request_ccb = request_ccb;
1282		scan_info->cpi = &work_ccb->cpi;
1283		/* If PM supported, probe it first. */
1284		if (scan_info->cpi->hba_inquiry & PI_SATAPM)
1285			scan_info->counter = scan_info->cpi->max_target;
1286		else
1287			scan_info->counter = 0;
1288
1289		work_ccb = xpt_alloc_ccb_nowait();
1290		if (work_ccb == NULL) {
1291			free(scan_info, M_CAMXPT);
1292			request_ccb->ccb_h.status = CAM_RESRC_UNAVAIL;
1293			xpt_done(request_ccb);
1294			break;
1295		}
1296		goto scan_next;
1297	case XPT_SCAN_LUN:
1298		work_ccb = request_ccb;
1299		/* Reuse the same CCB to query if a device was really found */
1300		scan_info = (ata_scan_bus_info *)work_ccb->ccb_h.ppriv_ptr0;
1301		/* If there is PMP... */
1302		if ((scan_info->cpi->hba_inquiry & PI_SATAPM) &&
1303		    (scan_info->counter == scan_info->cpi->max_target)) {
1304			if (work_ccb->ccb_h.status == CAM_REQ_CMP) {
1305				/* everything else will be probed by it */
1306				/* Free the current request path- we're done with it. */
1307				xpt_free_path(work_ccb->ccb_h.path);
1308				goto done;
1309			} else {
1310				struct ccb_trans_settings cts;
1311
1312				/* Report SIM that PM is absent. */
1313				bzero(&cts, sizeof(cts));
1314				xpt_setup_ccb(&cts.ccb_h,
1315				    work_ccb->ccb_h.path, CAM_PRIORITY_NONE);
1316				cts.ccb_h.func_code = XPT_SET_TRAN_SETTINGS;
1317				cts.type = CTS_TYPE_CURRENT_SETTINGS;
1318				cts.xport_specific.sata.pm_present = 0;
1319				cts.xport_specific.sata.valid = CTS_SATA_VALID_PM;
1320				xpt_action((union ccb *)&cts);
1321			}
1322		}
1323		/* Free the current request path- we're done with it. */
1324		xpt_free_path(work_ccb->ccb_h.path);
1325		if (scan_info->counter ==
1326		    ((scan_info->cpi->hba_inquiry & PI_SATAPM) ?
1327		    0 : scan_info->cpi->max_target)) {
1328done:
1329			xpt_free_ccb(work_ccb);
1330			xpt_free_ccb((union ccb *)scan_info->cpi);
1331			request_ccb = scan_info->request_ccb;
1332			free(scan_info, M_CAMXPT);
1333			request_ccb->ccb_h.status = CAM_REQ_CMP;
1334			xpt_done(request_ccb);
1335			break;
1336		}
1337		/* Take next device. Wrap from max (PMP) to 0. */
1338		scan_info->counter = (scan_info->counter + 1 ) %
1339		    (scan_info->cpi->max_target + 1);
1340scan_next:
1341		status = xpt_create_path(&path, xpt_periph,
1342		    scan_info->request_ccb->ccb_h.path_id,
1343		    scan_info->counter, 0);
1344		if (status != CAM_REQ_CMP) {
1345			printf("xpt_scan_bus: xpt_create_path failed"
1346			    " with status %#x, bus scan halted\n",
1347			    status);
1348			xpt_free_ccb(work_ccb);
1349			xpt_free_ccb((union ccb *)scan_info->cpi);
1350			request_ccb = scan_info->request_ccb;
1351			free(scan_info, M_CAMXPT);
1352			request_ccb->ccb_h.status = status;
1353			xpt_done(request_ccb);
1354			break;
1355		}
1356		xpt_setup_ccb(&work_ccb->ccb_h, path,
1357		    scan_info->request_ccb->ccb_h.pinfo.priority);
1358		work_ccb->ccb_h.func_code = XPT_SCAN_LUN;
1359		work_ccb->ccb_h.cbfcnp = ata_scan_bus;
1360		work_ccb->ccb_h.ppriv_ptr0 = scan_info;
1361		work_ccb->crcn.flags = scan_info->request_ccb->crcn.flags;
1362		xpt_action(work_ccb);
1363		break;
1364	default:
1365		break;
1366	}
1367}
1368
1369static void
1370ata_scan_lun(struct cam_periph *periph, struct cam_path *path,
1371	     cam_flags flags, union ccb *request_ccb)
1372{
1373	struct ccb_pathinq cpi;
1374	cam_status status;
1375	struct cam_path *new_path;
1376	struct cam_periph *old_periph;
1377
1378	CAM_DEBUG(path, CAM_DEBUG_TRACE, ("xpt_scan_lun\n"));
1379
1380	xpt_setup_ccb(&cpi.ccb_h, path, CAM_PRIORITY_NONE);
1381	cpi.ccb_h.func_code = XPT_PATH_INQ;
1382	xpt_action((union ccb *)&cpi);
1383
1384	if (cpi.ccb_h.status != CAM_REQ_CMP) {
1385		if (request_ccb != NULL) {
1386			request_ccb->ccb_h.status = cpi.ccb_h.status;
1387			xpt_done(request_ccb);
1388		}
1389		return;
1390	}
1391
1392	if (request_ccb == NULL) {
1393		request_ccb = malloc(sizeof(union ccb), M_CAMXPT, M_NOWAIT);
1394		if (request_ccb == NULL) {
1395			xpt_print(path, "xpt_scan_lun: can't allocate CCB, "
1396			    "can't continue\n");
1397			return;
1398		}
1399		new_path = malloc(sizeof(*new_path), M_CAMXPT, M_NOWAIT);
1400		if (new_path == NULL) {
1401			xpt_print(path, "xpt_scan_lun: can't allocate path, "
1402			    "can't continue\n");
1403			free(request_ccb, M_CAMXPT);
1404			return;
1405		}
1406		status = xpt_compile_path(new_path, xpt_periph,
1407					  path->bus->path_id,
1408					  path->target->target_id,
1409					  path->device->lun_id);
1410
1411		if (status != CAM_REQ_CMP) {
1412			xpt_print(path, "xpt_scan_lun: can't compile path, "
1413			    "can't continue\n");
1414			free(request_ccb, M_CAMXPT);
1415			free(new_path, M_CAMXPT);
1416			return;
1417		}
1418		xpt_setup_ccb(&request_ccb->ccb_h, new_path, CAM_PRIORITY_XPT);
1419		request_ccb->ccb_h.cbfcnp = xptscandone;
1420		request_ccb->ccb_h.func_code = XPT_SCAN_LUN;
1421		request_ccb->crcn.flags = flags;
1422	}
1423
1424	if ((old_periph = cam_periph_find(path, "aprobe")) != NULL) {
1425		probe_softc *softc;
1426
1427		softc = (probe_softc *)old_periph->softc;
1428		TAILQ_INSERT_TAIL(&softc->request_ccbs, &request_ccb->ccb_h,
1429				  periph_links.tqe);
1430		softc->restart = 1;
1431	} else {
1432		status = cam_periph_alloc(proberegister, NULL, probecleanup,
1433					  probestart, "aprobe",
1434					  CAM_PERIPH_BIO,
1435					  request_ccb->ccb_h.path, NULL, 0,
1436					  request_ccb);
1437
1438		if (status != CAM_REQ_CMP) {
1439			xpt_print(path, "xpt_scan_lun: cam_alloc_periph "
1440			    "returned an error, can't continue probe\n");
1441			request_ccb->ccb_h.status = status;
1442			xpt_done(request_ccb);
1443		}
1444	}
1445}
1446
1447static void
1448xptscandone(struct cam_periph *periph, union ccb *done_ccb)
1449{
1450	xpt_release_path(done_ccb->ccb_h.path);
1451	free(done_ccb->ccb_h.path, M_CAMXPT);
1452	free(done_ccb, M_CAMXPT);
1453}
1454
1455static struct cam_ed *
1456ata_alloc_device(struct cam_eb *bus, struct cam_et *target, lun_id_t lun_id)
1457{
1458	struct cam_path path;
1459	struct ata_quirk_entry *quirk;
1460	struct cam_ed *device;
1461	struct cam_ed *cur_device;
1462
1463	device = xpt_alloc_device(bus, target, lun_id);
1464	if (device == NULL)
1465		return (NULL);
1466
1467	/*
1468	 * Take the default quirk entry until we have inquiry
1469	 * data and can determine a better quirk to use.
1470	 */
1471	quirk = &ata_quirk_table[ata_quirk_table_size - 1];
1472	device->quirk = (void *)quirk;
1473	device->mintags = 0;
1474	device->maxtags = 0;
1475	bzero(&device->inq_data, sizeof(device->inq_data));
1476	device->inq_flags = 0;
1477	device->queue_flags = 0;
1478	device->serial_num = NULL;
1479	device->serial_num_len = 0;
1480
1481	/*
1482	 * XXX should be limited by number of CCBs this bus can
1483	 * do.
1484	 */
1485	bus->sim->max_ccbs += device->ccbq.devq_openings;
1486	/* Insertion sort into our target's device list */
1487	cur_device = TAILQ_FIRST(&target->ed_entries);
1488	while (cur_device != NULL && cur_device->lun_id < lun_id)
1489		cur_device = TAILQ_NEXT(cur_device, links);
1490	if (cur_device != NULL) {
1491		TAILQ_INSERT_BEFORE(cur_device, device, links);
1492	} else {
1493		TAILQ_INSERT_TAIL(&target->ed_entries, device, links);
1494	}
1495	target->generation++;
1496	if (lun_id != CAM_LUN_WILDCARD) {
1497		xpt_compile_path(&path,
1498				 NULL,
1499				 bus->path_id,
1500				 target->target_id,
1501				 lun_id);
1502		ata_device_transport(&path);
1503		xpt_release_path(&path);
1504	}
1505
1506	return (device);
1507}
1508
1509static void
1510ata_device_transport(struct cam_path *path)
1511{
1512	struct ccb_pathinq cpi;
1513	struct ccb_trans_settings cts;
1514	struct scsi_inquiry_data *inq_buf = NULL;
1515	struct ata_params *ident_buf = NULL;
1516
1517	/* Get transport information from the SIM */
1518	xpt_setup_ccb(&cpi.ccb_h, path, CAM_PRIORITY_NONE);
1519	cpi.ccb_h.func_code = XPT_PATH_INQ;
1520	xpt_action((union ccb *)&cpi);
1521
1522	path->device->transport = cpi.transport;
1523	if ((path->device->flags & CAM_DEV_INQUIRY_DATA_VALID) != 0)
1524		inq_buf = &path->device->inq_data;
1525	if ((path->device->flags & CAM_DEV_IDENTIFY_DATA_VALID) != 0)
1526		ident_buf = &path->device->ident_data;
1527	if (path->device->protocol == PROTO_ATA) {
1528		path->device->protocol_version = ident_buf ?
1529		    ata_version(ident_buf->version_major) : cpi.protocol_version;
1530	} else if (path->device->protocol == PROTO_SCSI) {
1531		path->device->protocol_version = inq_buf ?
1532		    SID_ANSI_REV(inq_buf) : cpi.protocol_version;
1533	}
1534	path->device->transport_version = ident_buf ?
1535	    ata_version(ident_buf->version_major) : cpi.transport_version;
1536
1537	/* Tell the controller what we think */
1538	xpt_setup_ccb(&cts.ccb_h, path, CAM_PRIORITY_NONE);
1539	cts.ccb_h.func_code = XPT_SET_TRAN_SETTINGS;
1540	cts.type = CTS_TYPE_CURRENT_SETTINGS;
1541	cts.transport = path->device->transport;
1542	cts.transport_version = path->device->transport_version;
1543	cts.protocol = path->device->protocol;
1544	cts.protocol_version = path->device->protocol_version;
1545	cts.proto_specific.valid = 0;
1546	if (ident_buf) {
1547		if (path->device->transport == XPORT_ATA) {
1548			cts.xport_specific.ata.atapi =
1549			    ((ident_buf->config & ATA_PROTO_MASK) == ATA_PROTO_ATAPI_16) ? 16 :
1550			    ((ident_buf->config & ATA_PROTO_MASK) == ATA_PROTO_ATAPI_12) ? 12 : 0;
1551			cts.xport_specific.ata.valid = CTS_ATA_VALID_ATAPI;
1552		} else {
1553			cts.xport_specific.sata.atapi =
1554			    ((ident_buf->config & ATA_PROTO_MASK) == ATA_PROTO_ATAPI_16) ? 16 :
1555			    ((ident_buf->config & ATA_PROTO_MASK) == ATA_PROTO_ATAPI_12) ? 12 : 0;
1556			cts.xport_specific.sata.valid = CTS_SATA_VALID_ATAPI;
1557		}
1558	} else
1559		cts.xport_specific.valid = 0;
1560	xpt_action((union ccb *)&cts);
1561}
1562
1563static void
1564ata_action(union ccb *start_ccb)
1565{
1566
1567	switch (start_ccb->ccb_h.func_code) {
1568	case XPT_SET_TRAN_SETTINGS:
1569	{
1570		ata_set_transfer_settings(&start_ccb->cts,
1571					   start_ccb->ccb_h.path->device,
1572					   /*async_update*/FALSE);
1573		break;
1574	}
1575	case XPT_SCAN_BUS:
1576	case XPT_SCAN_TGT:
1577		ata_scan_bus(start_ccb->ccb_h.path->periph, start_ccb);
1578		break;
1579	case XPT_SCAN_LUN:
1580		ata_scan_lun(start_ccb->ccb_h.path->periph,
1581			      start_ccb->ccb_h.path, start_ccb->crcn.flags,
1582			      start_ccb);
1583		break;
1584	case XPT_GET_TRAN_SETTINGS:
1585	{
1586		struct cam_sim *sim;
1587
1588		sim = start_ccb->ccb_h.path->bus->sim;
1589		(*(sim->sim_action))(sim, start_ccb);
1590		break;
1591	}
1592	case XPT_SCSI_IO:
1593	{
1594		struct cam_ed *device;
1595		u_int	maxlen = 0;
1596
1597		device = start_ccb->ccb_h.path->device;
1598		if (device->protocol == PROTO_SCSI &&
1599		    (device->flags & CAM_DEV_IDENTIFY_DATA_VALID)) {
1600			uint16_t p =
1601			    device->ident_data.config & ATA_PROTO_MASK;
1602
1603			maxlen = (p == ATA_PROTO_ATAPI_16) ? 16 :
1604			    (p == ATA_PROTO_ATAPI_12) ? 12 : 0;
1605		}
1606		if (start_ccb->csio.cdb_len > maxlen) {
1607			start_ccb->ccb_h.status = CAM_REQ_INVALID;
1608			xpt_done(start_ccb);
1609			break;
1610		}
1611		/* FALLTHROUGH */
1612	}
1613	default:
1614		xpt_action_default(start_ccb);
1615		break;
1616	}
1617}
1618
1619static void
1620ata_set_transfer_settings(struct ccb_trans_settings *cts, struct cam_ed *device,
1621			   int async_update)
1622{
1623	struct	ccb_pathinq cpi;
1624	struct	ccb_trans_settings cur_cts;
1625	struct	ccb_trans_settings_scsi *scsi;
1626	struct	ccb_trans_settings_scsi *cur_scsi;
1627	struct	cam_sim *sim;
1628	struct	scsi_inquiry_data *inq_data;
1629
1630	if (device == NULL) {
1631		cts->ccb_h.status = CAM_PATH_INVALID;
1632		xpt_done((union ccb *)cts);
1633		return;
1634	}
1635
1636	if (cts->protocol == PROTO_UNKNOWN
1637	 || cts->protocol == PROTO_UNSPECIFIED) {
1638		cts->protocol = device->protocol;
1639		cts->protocol_version = device->protocol_version;
1640	}
1641
1642	if (cts->protocol_version == PROTO_VERSION_UNKNOWN
1643	 || cts->protocol_version == PROTO_VERSION_UNSPECIFIED)
1644		cts->protocol_version = device->protocol_version;
1645
1646	if (cts->protocol != device->protocol) {
1647		xpt_print(cts->ccb_h.path, "Uninitialized Protocol %x:%x?\n",
1648		       cts->protocol, device->protocol);
1649		cts->protocol = device->protocol;
1650	}
1651
1652	if (cts->protocol_version > device->protocol_version) {
1653		if (bootverbose) {
1654			xpt_print(cts->ccb_h.path, "Down reving Protocol "
1655			    "Version from %d to %d?\n", cts->protocol_version,
1656			    device->protocol_version);
1657		}
1658		cts->protocol_version = device->protocol_version;
1659	}
1660
1661	if (cts->transport == XPORT_UNKNOWN
1662	 || cts->transport == XPORT_UNSPECIFIED) {
1663		cts->transport = device->transport;
1664		cts->transport_version = device->transport_version;
1665	}
1666
1667	if (cts->transport_version == XPORT_VERSION_UNKNOWN
1668	 || cts->transport_version == XPORT_VERSION_UNSPECIFIED)
1669		cts->transport_version = device->transport_version;
1670
1671	if (cts->transport != device->transport) {
1672		xpt_print(cts->ccb_h.path, "Uninitialized Transport %x:%x?\n",
1673		    cts->transport, device->transport);
1674		cts->transport = device->transport;
1675	}
1676
1677	if (cts->transport_version > device->transport_version) {
1678		if (bootverbose) {
1679			xpt_print(cts->ccb_h.path, "Down reving Transport "
1680			    "Version from %d to %d?\n", cts->transport_version,
1681			    device->transport_version);
1682		}
1683		cts->transport_version = device->transport_version;
1684	}
1685
1686	sim = cts->ccb_h.path->bus->sim;
1687
1688	/*
1689	 * Nothing more of interest to do unless
1690	 * this is a device connected via the
1691	 * SCSI protocol.
1692	 */
1693	if (cts->protocol != PROTO_SCSI) {
1694		if (async_update == FALSE)
1695			(*(sim->sim_action))(sim, (union ccb *)cts);
1696		return;
1697	}
1698
1699	inq_data = &device->inq_data;
1700	scsi = &cts->proto_specific.scsi;
1701	xpt_setup_ccb(&cpi.ccb_h, cts->ccb_h.path, CAM_PRIORITY_NONE);
1702	cpi.ccb_h.func_code = XPT_PATH_INQ;
1703	xpt_action((union ccb *)&cpi);
1704
1705	/* SCSI specific sanity checking */
1706	if ((cpi.hba_inquiry & PI_TAG_ABLE) == 0
1707	 || (INQ_DATA_TQ_ENABLED(inq_data)) == 0
1708	 || (device->queue_flags & SCP_QUEUE_DQUE) != 0
1709	 || (device->mintags == 0)) {
1710		/*
1711		 * Can't tag on hardware that doesn't support tags,
1712		 * doesn't have it enabled, or has broken tag support.
1713		 */
1714		scsi->flags &= ~CTS_SCSI_FLAGS_TAG_ENB;
1715	}
1716
1717	if (async_update == FALSE) {
1718		/*
1719		 * Perform sanity checking against what the
1720		 * controller and device can do.
1721		 */
1722		xpt_setup_ccb(&cur_cts.ccb_h, cts->ccb_h.path, CAM_PRIORITY_NONE);
1723		cur_cts.ccb_h.func_code = XPT_GET_TRAN_SETTINGS;
1724		cur_cts.type = cts->type;
1725		xpt_action((union ccb *)&cur_cts);
1726		if ((cur_cts.ccb_h.status & CAM_STATUS_MASK) != CAM_REQ_CMP) {
1727			return;
1728		}
1729		cur_scsi = &cur_cts.proto_specific.scsi;
1730		if ((scsi->valid & CTS_SCSI_VALID_TQ) == 0) {
1731			scsi->flags &= ~CTS_SCSI_FLAGS_TAG_ENB;
1732			scsi->flags |= cur_scsi->flags & CTS_SCSI_FLAGS_TAG_ENB;
1733		}
1734		if ((cur_scsi->valid & CTS_SCSI_VALID_TQ) == 0)
1735			scsi->flags &= ~CTS_SCSI_FLAGS_TAG_ENB;
1736	}
1737
1738	if (cts->type == CTS_TYPE_CURRENT_SETTINGS
1739	 && (scsi->valid & CTS_SCSI_VALID_TQ) != 0) {
1740		int device_tagenb;
1741
1742		/*
1743		 * If we are transitioning from tags to no-tags or
1744		 * vice-versa, we need to carefully freeze and restart
1745		 * the queue so that we don't overlap tagged and non-tagged
1746		 * commands.  We also temporarily stop tags if there is
1747		 * a change in transfer negotiation settings to allow
1748		 * "tag-less" negotiation.
1749		 */
1750		if ((device->flags & CAM_DEV_TAG_AFTER_COUNT) != 0
1751		 || (device->inq_flags & SID_CmdQue) != 0)
1752			device_tagenb = TRUE;
1753		else
1754			device_tagenb = FALSE;
1755
1756		if (((scsi->flags & CTS_SCSI_FLAGS_TAG_ENB) != 0
1757		  && device_tagenb == FALSE)
1758		 || ((scsi->flags & CTS_SCSI_FLAGS_TAG_ENB) == 0
1759		  && device_tagenb == TRUE)) {
1760
1761			if ((scsi->flags & CTS_SCSI_FLAGS_TAG_ENB) != 0) {
1762				/*
1763				 * Delay change to use tags until after a
1764				 * few commands have gone to this device so
1765				 * the controller has time to perform transfer
1766				 * negotiations without tagged messages getting
1767				 * in the way.
1768				 */
1769				device->tag_delay_count = CAM_TAG_DELAY_COUNT;
1770				device->flags |= CAM_DEV_TAG_AFTER_COUNT;
1771			} else {
1772				xpt_stop_tags(cts->ccb_h.path);
1773			}
1774		}
1775	}
1776	if (async_update == FALSE)
1777		(*(sim->sim_action))(sim, (union ccb *)cts);
1778}
1779
1780/*
1781 * Handle any per-device event notifications that require action by the XPT.
1782 */
1783static void
1784ata_dev_async(u_int32_t async_code, struct cam_eb *bus, struct cam_et *target,
1785	      struct cam_ed *device, void *async_arg)
1786{
1787	cam_status status;
1788	struct cam_path newpath;
1789
1790	/*
1791	 * We only need to handle events for real devices.
1792	 */
1793	if (target->target_id == CAM_TARGET_WILDCARD
1794	 || device->lun_id == CAM_LUN_WILDCARD)
1795		return;
1796
1797	/*
1798	 * We need our own path with wildcards expanded to
1799	 * handle certain types of events.
1800	 */
1801	if ((async_code == AC_SENT_BDR)
1802	 || (async_code == AC_BUS_RESET)
1803	 || (async_code == AC_INQ_CHANGED))
1804		status = xpt_compile_path(&newpath, NULL,
1805					  bus->path_id,
1806					  target->target_id,
1807					  device->lun_id);
1808	else
1809		status = CAM_REQ_CMP_ERR;
1810
1811	if (status == CAM_REQ_CMP) {
1812		if (async_code == AC_INQ_CHANGED) {
1813			/*
1814			 * We've sent a start unit command, or
1815			 * something similar to a device that
1816			 * may have caused its inquiry data to
1817			 * change. So we re-scan the device to
1818			 * refresh the inquiry data for it.
1819			 */
1820			ata_scan_lun(newpath.periph, &newpath,
1821				     CAM_EXPECT_INQ_CHANGE, NULL);
1822		} else {
1823			/* We need to reinitialize device after reset. */
1824			ata_scan_lun(newpath.periph, &newpath,
1825				     0, NULL);
1826		}
1827		xpt_release_path(&newpath);
1828	} else if (async_code == AC_LOST_DEVICE &&
1829	    (device->flags & CAM_DEV_UNCONFIGURED) == 0) {
1830		device->flags |= CAM_DEV_UNCONFIGURED;
1831		xpt_release_device(device);
1832	} else if (async_code == AC_TRANSFER_NEG) {
1833		struct ccb_trans_settings *settings;
1834
1835		settings = (struct ccb_trans_settings *)async_arg;
1836		ata_set_transfer_settings(settings, device,
1837					  /*async_update*/TRUE);
1838	}
1839}
1840
1841static void
1842ata_announce_periph(struct cam_periph *periph)
1843{
1844	struct	ccb_pathinq cpi;
1845	struct	ccb_trans_settings cts;
1846	struct	cam_path *path = periph->path;
1847	u_int	speed;
1848	u_int	mb;
1849
1850	mtx_assert(periph->sim->mtx, MA_OWNED);
1851
1852	xpt_setup_ccb(&cts.ccb_h, path, CAM_PRIORITY_NORMAL);
1853	cts.ccb_h.func_code = XPT_GET_TRAN_SETTINGS;
1854	cts.type = CTS_TYPE_CURRENT_SETTINGS;
1855	xpt_action((union ccb*)&cts);
1856	if ((cts.ccb_h.status & CAM_STATUS_MASK) != CAM_REQ_CMP)
1857		return;
1858	/* Ask the SIM for its base transfer speed */
1859	xpt_setup_ccb(&cpi.ccb_h, path, CAM_PRIORITY_NORMAL);
1860	cpi.ccb_h.func_code = XPT_PATH_INQ;
1861	xpt_action((union ccb *)&cpi);
1862	/* Report connection speed */
1863	speed = cpi.base_transfer_speed;
1864	if (cts.ccb_h.status == CAM_REQ_CMP && cts.transport == XPORT_ATA) {
1865		struct	ccb_trans_settings_ata *ata =
1866		    &cts.xport_specific.ata;
1867
1868		if (ata->valid & CTS_ATA_VALID_MODE)
1869			speed = ata_mode2speed(ata->mode);
1870	}
1871	if (cts.ccb_h.status == CAM_REQ_CMP && cts.transport == XPORT_SATA) {
1872		struct	ccb_trans_settings_sata *sata =
1873		    &cts.xport_specific.sata;
1874
1875		if (sata->valid & CTS_SATA_VALID_REVISION)
1876			speed = ata_revision2speed(sata->revision);
1877	}
1878	mb = speed / 1000;
1879	if (mb > 0)
1880		printf("%s%d: %d.%03dMB/s transfers",
1881		       periph->periph_name, periph->unit_number,
1882		       mb, speed % 1000);
1883	else
1884		printf("%s%d: %dKB/s transfers", periph->periph_name,
1885		       periph->unit_number, speed);
1886	/* Report additional information about connection */
1887	if (cts.ccb_h.status == CAM_REQ_CMP && cts.transport == XPORT_ATA) {
1888		struct ccb_trans_settings_ata *ata =
1889		    &cts.xport_specific.ata;
1890
1891		printf(" (");
1892		if (ata->valid & CTS_ATA_VALID_MODE)
1893			printf("%s, ", ata_mode2string(ata->mode));
1894		if ((ata->valid & CTS_ATA_VALID_ATAPI) && ata->atapi != 0)
1895			printf("ATAPI %dbytes, ", ata->atapi);
1896		if (ata->valid & CTS_ATA_VALID_BYTECOUNT)
1897			printf("PIO %dbytes", ata->bytecount);
1898		printf(")");
1899	}
1900	if (cts.ccb_h.status == CAM_REQ_CMP && cts.transport == XPORT_SATA) {
1901		struct ccb_trans_settings_sata *sata =
1902		    &cts.xport_specific.sata;
1903
1904		printf(" (");
1905		if (sata->valid & CTS_SATA_VALID_REVISION)
1906			printf("SATA %d.x, ", sata->revision);
1907		else
1908			printf("SATA, ");
1909		if (sata->valid & CTS_SATA_VALID_MODE)
1910			printf("%s, ", ata_mode2string(sata->mode));
1911		if ((sata->valid & CTS_ATA_VALID_ATAPI) && sata->atapi != 0)
1912			printf("ATAPI %dbytes, ", sata->atapi);
1913		if (sata->valid & CTS_SATA_VALID_BYTECOUNT)
1914			printf("PIO %dbytes", sata->bytecount);
1915		printf(")");
1916	}
1917	printf("\n");
1918}
1919
1920