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