mfi.c revision 224039
1/*-
2 * Copyright (c) 2006 IronPort Systems
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 * 2. Redistributions in binary form must reproduce the above copyright
11 *    notice, this list of conditions and the following disclaimer in the
12 *    documentation and/or other materials provided with the distribution.
13 *
14 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24 * SUCH DAMAGE.
25 */
26/*-
27 * Copyright (c) 2007 LSI Corp.
28 * Copyright (c) 2007 Rajesh Prabhakaran.
29 * All rights reserved.
30 *
31 * Redistribution and use in source and binary forms, with or without
32 * modification, are permitted provided that the following conditions
33 * are met:
34 * 1. Redistributions of source code must retain the above copyright
35 *    notice, this list of conditions and the following disclaimer.
36 * 2. Redistributions in binary form must reproduce the above copyright
37 *    notice, this list of conditions and the following disclaimer in the
38 *    documentation and/or other materials provided with the distribution.
39 *
40 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
41 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
42 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
43 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
44 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
45 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
46 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
47 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
48 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
49 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
50 * SUCH DAMAGE.
51 */
52
53#include <sys/cdefs.h>
54__FBSDID("$FreeBSD: head/sys/dev/mfi/mfi.c 224039 2011-07-14 20:11:27Z jhb $");
55
56#include "opt_mfi.h"
57
58#include <sys/param.h>
59#include <sys/systm.h>
60#include <sys/sysctl.h>
61#include <sys/malloc.h>
62#include <sys/kernel.h>
63#include <sys/poll.h>
64#include <sys/selinfo.h>
65#include <sys/bus.h>
66#include <sys/conf.h>
67#include <sys/eventhandler.h>
68#include <sys/rman.h>
69#include <sys/bus_dma.h>
70#include <sys/bio.h>
71#include <sys/ioccom.h>
72#include <sys/uio.h>
73#include <sys/proc.h>
74#include <sys/signalvar.h>
75
76#include <machine/bus.h>
77#include <machine/resource.h>
78
79#include <dev/mfi/mfireg.h>
80#include <dev/mfi/mfi_ioctl.h>
81#include <dev/mfi/mfivar.h>
82
83static int	mfi_alloc_commands(struct mfi_softc *);
84static int	mfi_comms_init(struct mfi_softc *);
85static int	mfi_wait_command(struct mfi_softc *, struct mfi_command *);
86static int	mfi_get_controller_info(struct mfi_softc *);
87static int	mfi_get_log_state(struct mfi_softc *,
88		    struct mfi_evt_log_state **);
89static int	mfi_parse_entries(struct mfi_softc *, int, int);
90static int	mfi_dcmd_command(struct mfi_softc *, struct mfi_command **,
91		    uint32_t, void **, size_t);
92static void	mfi_data_cb(void *, bus_dma_segment_t *, int, int);
93static void	mfi_startup(void *arg);
94static void	mfi_intr(void *arg);
95static void	mfi_ldprobe(struct mfi_softc *sc);
96static int	mfi_aen_register(struct mfi_softc *sc, int seq, int locale);
97static void	mfi_aen_complete(struct mfi_command *);
98static int	mfi_aen_setup(struct mfi_softc *, uint32_t);
99static int	mfi_add_ld(struct mfi_softc *sc, int);
100static void	mfi_add_ld_complete(struct mfi_command *);
101static struct mfi_command * mfi_bio_command(struct mfi_softc *);
102static void	mfi_bio_complete(struct mfi_command *);
103static int	mfi_mapcmd(struct mfi_softc *, struct mfi_command *);
104static int	mfi_send_frame(struct mfi_softc *, struct mfi_command *);
105static void	mfi_complete(struct mfi_softc *, struct mfi_command *);
106static int	mfi_abort(struct mfi_softc *, struct mfi_command *);
107static int	mfi_linux_ioctl_int(struct cdev *, u_long, caddr_t, int, struct thread *);
108static void	mfi_timeout(void *);
109static int	mfi_user_command(struct mfi_softc *,
110		    struct mfi_ioc_passthru *);
111static void 	mfi_enable_intr_xscale(struct mfi_softc *sc);
112static void 	mfi_enable_intr_ppc(struct mfi_softc *sc);
113static int32_t 	mfi_read_fw_status_xscale(struct mfi_softc *sc);
114static int32_t 	mfi_read_fw_status_ppc(struct mfi_softc *sc);
115static int 	mfi_check_clear_intr_xscale(struct mfi_softc *sc);
116static int 	mfi_check_clear_intr_ppc(struct mfi_softc *sc);
117static void 	mfi_issue_cmd_xscale(struct mfi_softc *sc,uint32_t bus_add,uint32_t frame_cnt);
118static void 	mfi_issue_cmd_ppc(struct mfi_softc *sc,uint32_t bus_add,uint32_t frame_cnt);
119
120SYSCTL_NODE(_hw, OID_AUTO, mfi, CTLFLAG_RD, 0, "MFI driver parameters");
121static int	mfi_event_locale = MFI_EVT_LOCALE_ALL;
122TUNABLE_INT("hw.mfi.event_locale", &mfi_event_locale);
123SYSCTL_INT(_hw_mfi, OID_AUTO, event_locale, CTLFLAG_RW, &mfi_event_locale,
124            0, "event message locale");
125
126static int	mfi_event_class = MFI_EVT_CLASS_INFO;
127TUNABLE_INT("hw.mfi.event_class", &mfi_event_class);
128SYSCTL_INT(_hw_mfi, OID_AUTO, event_class, CTLFLAG_RW, &mfi_event_class,
129          0, "event message class");
130
131static int	mfi_max_cmds = 128;
132TUNABLE_INT("hw.mfi.max_cmds", &mfi_max_cmds);
133SYSCTL_INT(_hw_mfi, OID_AUTO, max_cmds, CTLFLAG_RD, &mfi_max_cmds,
134	   0, "Max commands");
135
136/* Management interface */
137static d_open_t		mfi_open;
138static d_close_t	mfi_close;
139static d_ioctl_t	mfi_ioctl;
140static d_poll_t		mfi_poll;
141
142static struct cdevsw mfi_cdevsw = {
143	.d_version = 	D_VERSION,
144	.d_flags =	0,
145	.d_open = 	mfi_open,
146	.d_close =	mfi_close,
147	.d_ioctl =	mfi_ioctl,
148	.d_poll =	mfi_poll,
149	.d_name =	"mfi",
150};
151
152MALLOC_DEFINE(M_MFIBUF, "mfibuf", "Buffers for the MFI driver");
153
154#define MFI_INQ_LENGTH SHORT_INQUIRY_LENGTH
155
156static void
157mfi_enable_intr_xscale(struct mfi_softc *sc)
158{
159	MFI_WRITE4(sc, MFI_OMSK, 0x01);
160}
161
162static void
163mfi_enable_intr_ppc(struct mfi_softc *sc)
164{
165	MFI_WRITE4(sc, MFI_ODCR0, 0xFFFFFFFF);
166	if (sc->mfi_flags & MFI_FLAGS_1078) {
167		MFI_WRITE4(sc, MFI_OMSK, ~MFI_1078_EIM);
168	} else if (sc->mfi_flags & MFI_FLAGS_GEN2) {
169		MFI_WRITE4(sc, MFI_OMSK, ~MFI_GEN2_EIM);
170	}
171}
172
173static int32_t
174mfi_read_fw_status_xscale(struct mfi_softc *sc)
175{
176	return MFI_READ4(sc, MFI_OMSG0);
177}
178
179static int32_t
180mfi_read_fw_status_ppc(struct mfi_softc *sc)
181{
182	return MFI_READ4(sc, MFI_OSP0);
183}
184
185static int
186mfi_check_clear_intr_xscale(struct mfi_softc *sc)
187{
188	int32_t status;
189
190	status = MFI_READ4(sc, MFI_OSTS);
191	if ((status & MFI_OSTS_INTR_VALID) == 0)
192		return 1;
193
194	MFI_WRITE4(sc, MFI_OSTS, status);
195	return 0;
196}
197
198static int
199mfi_check_clear_intr_ppc(struct mfi_softc *sc)
200{
201	int32_t status;
202
203	status = MFI_READ4(sc, MFI_OSTS);
204	if (sc->mfi_flags & MFI_FLAGS_1078) {
205		if (!(status & MFI_1078_RM)) {
206			return 1;
207		}
208	} else if (sc->mfi_flags & MFI_FLAGS_GEN2) {
209		if (!(status & MFI_GEN2_RM)) {
210			return 1;
211		}
212	}
213
214	MFI_WRITE4(sc, MFI_ODCR0, status);
215	return 0;
216}
217
218static void
219mfi_issue_cmd_xscale(struct mfi_softc *sc,uint32_t bus_add,uint32_t frame_cnt)
220{
221	MFI_WRITE4(sc, MFI_IQP,(bus_add >>3)|frame_cnt);
222}
223
224static void
225mfi_issue_cmd_ppc(struct mfi_softc *sc,uint32_t bus_add,uint32_t frame_cnt)
226{
227	MFI_WRITE4(sc, MFI_IQP, (bus_add |frame_cnt <<1)|1 );
228}
229
230static int
231mfi_transition_firmware(struct mfi_softc *sc)
232{
233	uint32_t fw_state, cur_state;
234	int max_wait, i;
235
236	fw_state = sc->mfi_read_fw_status(sc)& MFI_FWSTATE_MASK;
237	while (fw_state != MFI_FWSTATE_READY) {
238		if (bootverbose)
239			device_printf(sc->mfi_dev, "Waiting for firmware to "
240			"become ready\n");
241		cur_state = fw_state;
242		switch (fw_state) {
243		case MFI_FWSTATE_FAULT:
244			device_printf(sc->mfi_dev, "Firmware fault\n");
245			return (ENXIO);
246		case MFI_FWSTATE_WAIT_HANDSHAKE:
247			MFI_WRITE4(sc, MFI_IDB, MFI_FWINIT_CLEAR_HANDSHAKE);
248			max_wait = 2;
249			break;
250		case MFI_FWSTATE_OPERATIONAL:
251			MFI_WRITE4(sc, MFI_IDB, MFI_FWINIT_READY);
252			max_wait = 10;
253			break;
254		case MFI_FWSTATE_UNDEFINED:
255		case MFI_FWSTATE_BB_INIT:
256			max_wait = 2;
257			break;
258		case MFI_FWSTATE_FW_INIT:
259		case MFI_FWSTATE_DEVICE_SCAN:
260		case MFI_FWSTATE_FLUSH_CACHE:
261			max_wait = 20;
262			break;
263		default:
264			device_printf(sc->mfi_dev,"Unknown firmware state %d\n",
265			    fw_state);
266			return (ENXIO);
267		}
268		for (i = 0; i < (max_wait * 10); i++) {
269			fw_state = sc->mfi_read_fw_status(sc) & MFI_FWSTATE_MASK;
270			if (fw_state == cur_state)
271				DELAY(100000);
272			else
273				break;
274		}
275		if (fw_state == cur_state) {
276			device_printf(sc->mfi_dev, "firmware stuck in state "
277			    "%#x\n", fw_state);
278			return (ENXIO);
279		}
280	}
281	return (0);
282}
283
284static void
285mfi_addr32_cb(void *arg, bus_dma_segment_t *segs, int nsegs, int error)
286{
287	uint32_t *addr;
288
289	addr = arg;
290	*addr = segs[0].ds_addr;
291}
292
293int
294mfi_attach(struct mfi_softc *sc)
295{
296	uint32_t status;
297	int error, commsz, framessz, sensesz;
298	int frames, unit, max_fw_sge;
299
300	device_printf(sc->mfi_dev, "Megaraid SAS driver Ver 3.00 \n");
301
302	mtx_init(&sc->mfi_io_lock, "MFI I/O lock", NULL, MTX_DEF);
303	sx_init(&sc->mfi_config_lock, "MFI config");
304	TAILQ_INIT(&sc->mfi_ld_tqh);
305	TAILQ_INIT(&sc->mfi_aen_pids);
306	TAILQ_INIT(&sc->mfi_cam_ccbq);
307
308	mfi_initq_free(sc);
309	mfi_initq_ready(sc);
310	mfi_initq_busy(sc);
311	mfi_initq_bio(sc);
312
313	if (sc->mfi_flags & MFI_FLAGS_1064R) {
314		sc->mfi_enable_intr = mfi_enable_intr_xscale;
315		sc->mfi_read_fw_status = mfi_read_fw_status_xscale;
316		sc->mfi_check_clear_intr = mfi_check_clear_intr_xscale;
317		sc->mfi_issue_cmd = mfi_issue_cmd_xscale;
318	}
319	else {
320		sc->mfi_enable_intr =  mfi_enable_intr_ppc;
321 		sc->mfi_read_fw_status = mfi_read_fw_status_ppc;
322		sc->mfi_check_clear_intr = mfi_check_clear_intr_ppc;
323		sc->mfi_issue_cmd = mfi_issue_cmd_ppc;
324	}
325
326
327	/* Before we get too far, see if the firmware is working */
328	if ((error = mfi_transition_firmware(sc)) != 0) {
329		device_printf(sc->mfi_dev, "Firmware not in READY state, "
330		    "error %d\n", error);
331		return (ENXIO);
332	}
333
334	/*
335	 * Get information needed for sizing the contiguous memory for the
336	 * frame pool.  Size down the sgl parameter since we know that
337	 * we will never need more than what's required for MAXPHYS.
338	 * It would be nice if these constants were available at runtime
339	 * instead of compile time.
340	 */
341	status = sc->mfi_read_fw_status(sc);
342	sc->mfi_max_fw_cmds = status & MFI_FWSTATE_MAXCMD_MASK;
343	max_fw_sge = (status & MFI_FWSTATE_MAXSGL_MASK) >> 16;
344	sc->mfi_max_sge = min(max_fw_sge, ((MFI_MAXPHYS / PAGE_SIZE) + 1));
345
346	/*
347	 * Create the dma tag for data buffers.  Used both for block I/O
348	 * and for various internal data queries.
349	 */
350	if (bus_dma_tag_create( sc->mfi_parent_dmat,	/* parent */
351				1, 0,			/* algnmnt, boundary */
352				BUS_SPACE_MAXADDR,	/* lowaddr */
353				BUS_SPACE_MAXADDR,	/* highaddr */
354				NULL, NULL,		/* filter, filterarg */
355				BUS_SPACE_MAXSIZE_32BIT,/* maxsize */
356				sc->mfi_max_sge,	/* nsegments */
357				BUS_SPACE_MAXSIZE_32BIT,/* maxsegsize */
358				BUS_DMA_ALLOCNOW,	/* flags */
359				busdma_lock_mutex,	/* lockfunc */
360				&sc->mfi_io_lock,	/* lockfuncarg */
361				&sc->mfi_buffer_dmat)) {
362		device_printf(sc->mfi_dev, "Cannot allocate buffer DMA tag\n");
363		return (ENOMEM);
364	}
365
366	/*
367	 * Allocate DMA memory for the comms queues.  Keep it under 4GB for
368	 * efficiency.  The mfi_hwcomms struct includes space for 1 reply queue
369	 * entry, so the calculated size here will be will be 1 more than
370	 * mfi_max_fw_cmds.  This is apparently a requirement of the hardware.
371	 */
372	commsz = (sizeof(uint32_t) * sc->mfi_max_fw_cmds) +
373	    sizeof(struct mfi_hwcomms);
374	if (bus_dma_tag_create( sc->mfi_parent_dmat,	/* parent */
375				1, 0,			/* algnmnt, boundary */
376				BUS_SPACE_MAXADDR_32BIT,/* lowaddr */
377				BUS_SPACE_MAXADDR,	/* highaddr */
378				NULL, NULL,		/* filter, filterarg */
379				commsz,			/* maxsize */
380				1,			/* msegments */
381				commsz,			/* maxsegsize */
382				0,			/* flags */
383				NULL, NULL,		/* lockfunc, lockarg */
384				&sc->mfi_comms_dmat)) {
385		device_printf(sc->mfi_dev, "Cannot allocate comms DMA tag\n");
386		return (ENOMEM);
387	}
388	if (bus_dmamem_alloc(sc->mfi_comms_dmat, (void **)&sc->mfi_comms,
389	    BUS_DMA_NOWAIT, &sc->mfi_comms_dmamap)) {
390		device_printf(sc->mfi_dev, "Cannot allocate comms memory\n");
391		return (ENOMEM);
392	}
393	bzero(sc->mfi_comms, commsz);
394	bus_dmamap_load(sc->mfi_comms_dmat, sc->mfi_comms_dmamap,
395	    sc->mfi_comms, commsz, mfi_addr32_cb, &sc->mfi_comms_busaddr, 0);
396
397	/*
398	 * Allocate DMA memory for the command frames.  Keep them in the
399	 * lower 4GB for efficiency.  Calculate the size of the commands at
400	 * the same time; each command is one 64 byte frame plus a set of
401         * additional frames for holding sg lists or other data.
402	 * The assumption here is that the SG list will start at the second
403	 * frame and not use the unused bytes in the first frame.  While this
404	 * isn't technically correct, it simplifies the calculation and allows
405	 * for command frames that might be larger than an mfi_io_frame.
406	 */
407	if (sizeof(bus_addr_t) == 8) {
408		sc->mfi_sge_size = sizeof(struct mfi_sg64);
409		sc->mfi_flags |= MFI_FLAGS_SG64;
410	} else {
411		sc->mfi_sge_size = sizeof(struct mfi_sg32);
412	}
413	frames = (sc->mfi_sge_size * sc->mfi_max_sge - 1) / MFI_FRAME_SIZE + 2;
414	sc->mfi_cmd_size = frames * MFI_FRAME_SIZE;
415	framessz = sc->mfi_cmd_size * sc->mfi_max_fw_cmds;
416	if (bus_dma_tag_create( sc->mfi_parent_dmat,	/* parent */
417				64, 0,			/* algnmnt, boundary */
418				BUS_SPACE_MAXADDR_32BIT,/* lowaddr */
419				BUS_SPACE_MAXADDR,	/* highaddr */
420				NULL, NULL,		/* filter, filterarg */
421				framessz,		/* maxsize */
422				1,			/* nsegments */
423				framessz,		/* maxsegsize */
424				0,			/* flags */
425				NULL, NULL,		/* lockfunc, lockarg */
426				&sc->mfi_frames_dmat)) {
427		device_printf(sc->mfi_dev, "Cannot allocate frame DMA tag\n");
428		return (ENOMEM);
429	}
430	if (bus_dmamem_alloc(sc->mfi_frames_dmat, (void **)&sc->mfi_frames,
431	    BUS_DMA_NOWAIT, &sc->mfi_frames_dmamap)) {
432		device_printf(sc->mfi_dev, "Cannot allocate frames memory\n");
433		return (ENOMEM);
434	}
435	bzero(sc->mfi_frames, framessz);
436	bus_dmamap_load(sc->mfi_frames_dmat, sc->mfi_frames_dmamap,
437	    sc->mfi_frames, framessz, mfi_addr32_cb, &sc->mfi_frames_busaddr,0);
438
439	/*
440	 * Allocate DMA memory for the frame sense data.  Keep them in the
441	 * lower 4GB for efficiency
442	 */
443	sensesz = sc->mfi_max_fw_cmds * MFI_SENSE_LEN;
444	if (bus_dma_tag_create( sc->mfi_parent_dmat,	/* parent */
445				4, 0,			/* algnmnt, boundary */
446				BUS_SPACE_MAXADDR_32BIT,/* lowaddr */
447				BUS_SPACE_MAXADDR,	/* highaddr */
448				NULL, NULL,		/* filter, filterarg */
449				sensesz,		/* maxsize */
450				1,			/* nsegments */
451				sensesz,		/* maxsegsize */
452				0,			/* flags */
453				NULL, NULL,		/* lockfunc, lockarg */
454				&sc->mfi_sense_dmat)) {
455		device_printf(sc->mfi_dev, "Cannot allocate sense DMA tag\n");
456		return (ENOMEM);
457	}
458	if (bus_dmamem_alloc(sc->mfi_sense_dmat, (void **)&sc->mfi_sense,
459	    BUS_DMA_NOWAIT, &sc->mfi_sense_dmamap)) {
460		device_printf(sc->mfi_dev, "Cannot allocate sense memory\n");
461		return (ENOMEM);
462	}
463	bus_dmamap_load(sc->mfi_sense_dmat, sc->mfi_sense_dmamap,
464	    sc->mfi_sense, sensesz, mfi_addr32_cb, &sc->mfi_sense_busaddr, 0);
465
466	if ((error = mfi_alloc_commands(sc)) != 0)
467		return (error);
468
469	if ((error = mfi_comms_init(sc)) != 0)
470		return (error);
471
472	if ((error = mfi_get_controller_info(sc)) != 0)
473		return (error);
474
475	mtx_lock(&sc->mfi_io_lock);
476	if ((error = mfi_aen_setup(sc, 0), 0) != 0) {
477		mtx_unlock(&sc->mfi_io_lock);
478		return (error);
479	}
480	mtx_unlock(&sc->mfi_io_lock);
481
482	/*
483	 * Set up the interrupt handler.  XXX This should happen in
484	 * mfi_pci.c
485	 */
486	sc->mfi_irq_rid = 0;
487	if ((sc->mfi_irq = bus_alloc_resource_any(sc->mfi_dev, SYS_RES_IRQ,
488	    &sc->mfi_irq_rid, RF_SHAREABLE | RF_ACTIVE)) == NULL) {
489		device_printf(sc->mfi_dev, "Cannot allocate interrupt\n");
490		return (EINVAL);
491	}
492	if (bus_setup_intr(sc->mfi_dev, sc->mfi_irq, INTR_MPSAFE|INTR_TYPE_BIO,
493	    NULL, mfi_intr, sc, &sc->mfi_intr)) {
494		device_printf(sc->mfi_dev, "Cannot set up interrupt\n");
495		return (EINVAL);
496	}
497
498	/* Register a config hook to probe the bus for arrays */
499	sc->mfi_ich.ich_func = mfi_startup;
500	sc->mfi_ich.ich_arg = sc;
501	if (config_intrhook_establish(&sc->mfi_ich) != 0) {
502		device_printf(sc->mfi_dev, "Cannot establish configuration "
503		    "hook\n");
504		return (EINVAL);
505	}
506
507	/*
508	 * Register a shutdown handler.
509	 */
510	if ((sc->mfi_eh = EVENTHANDLER_REGISTER(shutdown_final, mfi_shutdown,
511	    sc, SHUTDOWN_PRI_DEFAULT)) == NULL) {
512		device_printf(sc->mfi_dev, "Warning: shutdown event "
513		    "registration failed\n");
514	}
515
516	/*
517	 * Create the control device for doing management
518	 */
519	unit = device_get_unit(sc->mfi_dev);
520	sc->mfi_cdev = make_dev(&mfi_cdevsw, unit, UID_ROOT, GID_OPERATOR,
521	    0640, "mfi%d", unit);
522	if (unit == 0)
523		make_dev_alias(sc->mfi_cdev, "megaraid_sas_ioctl_node");
524	if (sc->mfi_cdev != NULL)
525		sc->mfi_cdev->si_drv1 = sc;
526	SYSCTL_ADD_INT(device_get_sysctl_ctx(sc->mfi_dev),
527	    SYSCTL_CHILDREN(device_get_sysctl_tree(sc->mfi_dev)),
528	    OID_AUTO, "delete_busy_volumes", CTLFLAG_RW,
529	    &sc->mfi_delete_busy_volumes, 0, "Allow removal of busy volumes");
530	SYSCTL_ADD_INT(device_get_sysctl_ctx(sc->mfi_dev),
531	    SYSCTL_CHILDREN(device_get_sysctl_tree(sc->mfi_dev)),
532	    OID_AUTO, "keep_deleted_volumes", CTLFLAG_RW,
533	    &sc->mfi_keep_deleted_volumes, 0,
534	    "Don't detach the mfid device for a busy volume that is deleted");
535
536	device_add_child(sc->mfi_dev, "mfip", -1);
537	bus_generic_attach(sc->mfi_dev);
538
539	/* Start the timeout watchdog */
540	callout_init(&sc->mfi_watchdog_callout, CALLOUT_MPSAFE);
541	callout_reset(&sc->mfi_watchdog_callout, MFI_CMD_TIMEOUT * hz,
542	    mfi_timeout, sc);
543
544	return (0);
545}
546
547static int
548mfi_alloc_commands(struct mfi_softc *sc)
549{
550	struct mfi_command *cm;
551	int i, ncmds;
552
553	/*
554	 * XXX Should we allocate all the commands up front, or allocate on
555	 * demand later like 'aac' does?
556	 */
557	ncmds = MIN(mfi_max_cmds, sc->mfi_max_fw_cmds);
558	if (bootverbose)
559		device_printf(sc->mfi_dev, "Max fw cmds= %d, sizing driver "
560		   "pool to %d\n", sc->mfi_max_fw_cmds, ncmds);
561
562	sc->mfi_commands = malloc(sizeof(struct mfi_command) * ncmds, M_MFIBUF,
563	    M_WAITOK | M_ZERO);
564
565	for (i = 0; i < ncmds; i++) {
566		cm = &sc->mfi_commands[i];
567		cm->cm_frame = (union mfi_frame *)((uintptr_t)sc->mfi_frames +
568		    sc->mfi_cmd_size * i);
569		cm->cm_frame_busaddr = sc->mfi_frames_busaddr +
570		    sc->mfi_cmd_size * i;
571		cm->cm_frame->header.context = i;
572		cm->cm_sense = &sc->mfi_sense[i];
573		cm->cm_sense_busaddr= sc->mfi_sense_busaddr + MFI_SENSE_LEN * i;
574		cm->cm_sc = sc;
575		cm->cm_index = i;
576		if (bus_dmamap_create(sc->mfi_buffer_dmat, 0,
577		    &cm->cm_dmamap) == 0)
578			mfi_release_command(cm);
579		else
580			break;
581		sc->mfi_total_cmds++;
582	}
583
584	return (0);
585}
586
587void
588mfi_release_command(struct mfi_command *cm)
589{
590	struct mfi_frame_header *hdr;
591	uint32_t *hdr_data;
592
593	/*
594	 * Zero out the important fields of the frame, but make sure the
595	 * context field is preserved.  For efficiency, handle the fields
596	 * as 32 bit words.  Clear out the first S/G entry too for safety.
597	 */
598	hdr = &cm->cm_frame->header;
599	if (cm->cm_data != NULL && hdr->sg_count) {
600		cm->cm_sg->sg32[0].len = 0;
601		cm->cm_sg->sg32[0].addr = 0;
602	}
603
604	hdr_data = (uint32_t *)cm->cm_frame;
605	hdr_data[0] = 0;	/* cmd, sense_len, cmd_status, scsi_status */
606	hdr_data[1] = 0;	/* target_id, lun_id, cdb_len, sg_count */
607	hdr_data[4] = 0;	/* flags, timeout */
608	hdr_data[5] = 0;	/* data_len */
609
610	cm->cm_extra_frames = 0;
611	cm->cm_flags = 0;
612	cm->cm_complete = NULL;
613	cm->cm_private = NULL;
614	cm->cm_data = NULL;
615	cm->cm_sg = 0;
616	cm->cm_total_frame_size = 0;
617
618	mfi_enqueue_free(cm);
619}
620
621static int
622mfi_dcmd_command(struct mfi_softc *sc, struct mfi_command **cmp, uint32_t opcode,
623    void **bufp, size_t bufsize)
624{
625	struct mfi_command *cm;
626	struct mfi_dcmd_frame *dcmd;
627	void *buf = NULL;
628
629	mtx_assert(&sc->mfi_io_lock, MA_OWNED);
630
631	cm = mfi_dequeue_free(sc);
632	if (cm == NULL)
633		return (EBUSY);
634
635	if ((bufsize > 0) && (bufp != NULL)) {
636		if (*bufp == NULL) {
637			buf = malloc(bufsize, M_MFIBUF, M_NOWAIT|M_ZERO);
638			if (buf == NULL) {
639				mfi_release_command(cm);
640				return (ENOMEM);
641			}
642			*bufp = buf;
643		} else {
644			buf = *bufp;
645		}
646	}
647
648	dcmd =  &cm->cm_frame->dcmd;
649	bzero(dcmd->mbox, MFI_MBOX_SIZE);
650	dcmd->header.cmd = MFI_CMD_DCMD;
651	dcmd->header.timeout = 0;
652	dcmd->header.flags = 0;
653	dcmd->header.data_len = bufsize;
654	dcmd->opcode = opcode;
655	cm->cm_sg = &dcmd->sgl;
656	cm->cm_total_frame_size = MFI_DCMD_FRAME_SIZE;
657	cm->cm_flags = 0;
658	cm->cm_data = buf;
659	cm->cm_private = buf;
660	cm->cm_len = bufsize;
661
662	*cmp = cm;
663	if ((bufp != NULL) && (*bufp == NULL) && (buf != NULL))
664		*bufp = buf;
665	return (0);
666}
667
668static int
669mfi_comms_init(struct mfi_softc *sc)
670{
671	struct mfi_command *cm;
672	struct mfi_init_frame *init;
673	struct mfi_init_qinfo *qinfo;
674	int error;
675
676	mtx_lock(&sc->mfi_io_lock);
677	if ((cm = mfi_dequeue_free(sc)) == NULL)
678		return (EBUSY);
679
680	/*
681	 * Abuse the SG list area of the frame to hold the init_qinfo
682	 * object;
683	 */
684	init = &cm->cm_frame->init;
685	qinfo = (struct mfi_init_qinfo *)((uintptr_t)init + MFI_FRAME_SIZE);
686
687	bzero(qinfo, sizeof(struct mfi_init_qinfo));
688	qinfo->rq_entries = sc->mfi_max_fw_cmds + 1;
689	qinfo->rq_addr_lo = sc->mfi_comms_busaddr +
690	    offsetof(struct mfi_hwcomms, hw_reply_q);
691	qinfo->pi_addr_lo = sc->mfi_comms_busaddr +
692	    offsetof(struct mfi_hwcomms, hw_pi);
693	qinfo->ci_addr_lo = sc->mfi_comms_busaddr +
694	    offsetof(struct mfi_hwcomms, hw_ci);
695
696	init->header.cmd = MFI_CMD_INIT;
697	init->header.data_len = sizeof(struct mfi_init_qinfo);
698	init->qinfo_new_addr_lo = cm->cm_frame_busaddr + MFI_FRAME_SIZE;
699	cm->cm_data = NULL;
700	cm->cm_flags = MFI_CMD_POLLED;
701
702	if ((error = mfi_mapcmd(sc, cm)) != 0) {
703		device_printf(sc->mfi_dev, "failed to send init command\n");
704		mtx_unlock(&sc->mfi_io_lock);
705		return (error);
706	}
707	mfi_release_command(cm);
708	mtx_unlock(&sc->mfi_io_lock);
709
710	return (0);
711}
712
713static int
714mfi_get_controller_info(struct mfi_softc *sc)
715{
716	struct mfi_command *cm = NULL;
717	struct mfi_ctrl_info *ci = NULL;
718	uint32_t max_sectors_1, max_sectors_2;
719	int error;
720
721	mtx_lock(&sc->mfi_io_lock);
722	error = mfi_dcmd_command(sc, &cm, MFI_DCMD_CTRL_GETINFO,
723	    (void **)&ci, sizeof(*ci));
724	if (error)
725		goto out;
726	cm->cm_flags = MFI_CMD_DATAIN | MFI_CMD_POLLED;
727
728	if ((error = mfi_mapcmd(sc, cm)) != 0) {
729		device_printf(sc->mfi_dev, "Failed to get controller info\n");
730		sc->mfi_max_io = (sc->mfi_max_sge - 1) * PAGE_SIZE /
731		    MFI_SECTOR_LEN;
732		error = 0;
733		goto out;
734	}
735
736	bus_dmamap_sync(sc->mfi_buffer_dmat, cm->cm_dmamap,
737	    BUS_DMASYNC_POSTREAD);
738	bus_dmamap_unload(sc->mfi_buffer_dmat, cm->cm_dmamap);
739
740	max_sectors_1 = (1 << ci->stripe_sz_ops.min) * ci->max_strips_per_io;
741	max_sectors_2 = ci->max_request_size;
742	sc->mfi_max_io = min(max_sectors_1, max_sectors_2);
743
744out:
745	if (ci)
746		free(ci, M_MFIBUF);
747	if (cm)
748		mfi_release_command(cm);
749	mtx_unlock(&sc->mfi_io_lock);
750	return (error);
751}
752
753static int
754mfi_get_log_state(struct mfi_softc *sc, struct mfi_evt_log_state **log_state)
755{
756	struct mfi_command *cm = NULL;
757	int error;
758
759	error = mfi_dcmd_command(sc, &cm, MFI_DCMD_CTRL_EVENT_GETINFO,
760	    (void **)log_state, sizeof(**log_state));
761	if (error)
762		goto out;
763	cm->cm_flags = MFI_CMD_DATAIN | MFI_CMD_POLLED;
764
765	if ((error = mfi_mapcmd(sc, cm)) != 0) {
766		device_printf(sc->mfi_dev, "Failed to get log state\n");
767		goto out;
768	}
769
770	bus_dmamap_sync(sc->mfi_buffer_dmat, cm->cm_dmamap,
771	    BUS_DMASYNC_POSTREAD);
772	bus_dmamap_unload(sc->mfi_buffer_dmat, cm->cm_dmamap);
773
774out:
775	if (cm)
776		mfi_release_command(cm);
777
778	return (error);
779}
780
781static int
782mfi_aen_setup(struct mfi_softc *sc, uint32_t seq_start)
783{
784	struct mfi_evt_log_state *log_state = NULL;
785	union mfi_evt class_locale;
786	int error = 0;
787	uint32_t seq;
788
789	class_locale.members.reserved = 0;
790	class_locale.members.locale = mfi_event_locale;
791	class_locale.members.evt_class  = mfi_event_class;
792
793	if (seq_start == 0) {
794		error = mfi_get_log_state(sc, &log_state);
795		if (error) {
796			if (log_state)
797				free(log_state, M_MFIBUF);
798			return (error);
799		}
800
801		/*
802		 * Walk through any events that fired since the last
803		 * shutdown.
804		 */
805		mfi_parse_entries(sc, log_state->shutdown_seq_num,
806		    log_state->newest_seq_num);
807		seq = log_state->newest_seq_num;
808	} else
809		seq = seq_start;
810	mfi_aen_register(sc, seq, class_locale.word);
811	free(log_state, M_MFIBUF);
812
813	return 0;
814}
815
816static int
817mfi_wait_command(struct mfi_softc *sc, struct mfi_command *cm)
818{
819
820	mtx_assert(&sc->mfi_io_lock, MA_OWNED);
821	cm->cm_complete = NULL;
822
823
824	/*
825	 * MegaCli can issue a DCMD of 0.  In this case do nothing
826	 * and return 0 to it as status
827	 */
828	if (cm->cm_frame->dcmd.opcode == 0) {
829		cm->cm_frame->header.cmd_status = MFI_STAT_OK;
830		cm->cm_error = 0;
831		return (cm->cm_error);
832	}
833	mfi_enqueue_ready(cm);
834	mfi_startio(sc);
835	if ((cm->cm_flags & MFI_CMD_COMPLETED) == 0)
836		msleep(cm, &sc->mfi_io_lock, PRIBIO, "mfiwait", 0);
837	return (cm->cm_error);
838}
839
840void
841mfi_free(struct mfi_softc *sc)
842{
843	struct mfi_command *cm;
844	int i;
845
846	callout_drain(&sc->mfi_watchdog_callout);
847
848	if (sc->mfi_cdev != NULL)
849		destroy_dev(sc->mfi_cdev);
850
851	if (sc->mfi_total_cmds != 0) {
852		for (i = 0; i < sc->mfi_total_cmds; i++) {
853			cm = &sc->mfi_commands[i];
854			bus_dmamap_destroy(sc->mfi_buffer_dmat, cm->cm_dmamap);
855		}
856		free(sc->mfi_commands, M_MFIBUF);
857	}
858
859	if (sc->mfi_intr)
860		bus_teardown_intr(sc->mfi_dev, sc->mfi_irq, sc->mfi_intr);
861	if (sc->mfi_irq != NULL)
862		bus_release_resource(sc->mfi_dev, SYS_RES_IRQ, sc->mfi_irq_rid,
863		    sc->mfi_irq);
864
865	if (sc->mfi_sense_busaddr != 0)
866		bus_dmamap_unload(sc->mfi_sense_dmat, sc->mfi_sense_dmamap);
867	if (sc->mfi_sense != NULL)
868		bus_dmamem_free(sc->mfi_sense_dmat, sc->mfi_sense,
869		    sc->mfi_sense_dmamap);
870	if (sc->mfi_sense_dmat != NULL)
871		bus_dma_tag_destroy(sc->mfi_sense_dmat);
872
873	if (sc->mfi_frames_busaddr != 0)
874		bus_dmamap_unload(sc->mfi_frames_dmat, sc->mfi_frames_dmamap);
875	if (sc->mfi_frames != NULL)
876		bus_dmamem_free(sc->mfi_frames_dmat, sc->mfi_frames,
877		    sc->mfi_frames_dmamap);
878	if (sc->mfi_frames_dmat != NULL)
879		bus_dma_tag_destroy(sc->mfi_frames_dmat);
880
881	if (sc->mfi_comms_busaddr != 0)
882		bus_dmamap_unload(sc->mfi_comms_dmat, sc->mfi_comms_dmamap);
883	if (sc->mfi_comms != NULL)
884		bus_dmamem_free(sc->mfi_comms_dmat, sc->mfi_comms,
885		    sc->mfi_comms_dmamap);
886	if (sc->mfi_comms_dmat != NULL)
887		bus_dma_tag_destroy(sc->mfi_comms_dmat);
888
889	if (sc->mfi_buffer_dmat != NULL)
890		bus_dma_tag_destroy(sc->mfi_buffer_dmat);
891	if (sc->mfi_parent_dmat != NULL)
892		bus_dma_tag_destroy(sc->mfi_parent_dmat);
893
894	if (mtx_initialized(&sc->mfi_io_lock)) {
895		mtx_destroy(&sc->mfi_io_lock);
896		sx_destroy(&sc->mfi_config_lock);
897	}
898
899	return;
900}
901
902static void
903mfi_startup(void *arg)
904{
905	struct mfi_softc *sc;
906
907	sc = (struct mfi_softc *)arg;
908
909	config_intrhook_disestablish(&sc->mfi_ich);
910
911	sc->mfi_enable_intr(sc);
912	sx_xlock(&sc->mfi_config_lock);
913	mtx_lock(&sc->mfi_io_lock);
914	mfi_ldprobe(sc);
915	mtx_unlock(&sc->mfi_io_lock);
916	sx_xunlock(&sc->mfi_config_lock);
917}
918
919static void
920mfi_intr(void *arg)
921{
922	struct mfi_softc *sc;
923	struct mfi_command *cm;
924	uint32_t pi, ci, context;
925
926	sc = (struct mfi_softc *)arg;
927
928	if (sc->mfi_check_clear_intr(sc))
929		return;
930
931	pi = sc->mfi_comms->hw_pi;
932	ci = sc->mfi_comms->hw_ci;
933	mtx_lock(&sc->mfi_io_lock);
934	while (ci != pi) {
935		context = sc->mfi_comms->hw_reply_q[ci];
936		if (context < sc->mfi_max_fw_cmds) {
937			cm = &sc->mfi_commands[context];
938			mfi_remove_busy(cm);
939			cm->cm_error = 0;
940			mfi_complete(sc, cm);
941		}
942		if (++ci == (sc->mfi_max_fw_cmds + 1)) {
943			ci = 0;
944		}
945	}
946
947	sc->mfi_comms->hw_ci = ci;
948
949	/* Give defered I/O a chance to run */
950	if (sc->mfi_flags & MFI_FLAGS_QFRZN)
951		sc->mfi_flags &= ~MFI_FLAGS_QFRZN;
952	mfi_startio(sc);
953	mtx_unlock(&sc->mfi_io_lock);
954
955	return;
956}
957
958int
959mfi_shutdown(struct mfi_softc *sc)
960{
961	struct mfi_dcmd_frame *dcmd;
962	struct mfi_command *cm;
963	int error;
964
965	mtx_lock(&sc->mfi_io_lock);
966	error = mfi_dcmd_command(sc, &cm, MFI_DCMD_CTRL_SHUTDOWN, NULL, 0);
967	if (error) {
968		mtx_unlock(&sc->mfi_io_lock);
969		return (error);
970	}
971
972	if (sc->mfi_aen_cm != NULL)
973		mfi_abort(sc, sc->mfi_aen_cm);
974
975	dcmd = &cm->cm_frame->dcmd;
976	dcmd->header.flags = MFI_FRAME_DIR_NONE;
977	cm->cm_flags = MFI_CMD_POLLED;
978	cm->cm_data = NULL;
979
980	if ((error = mfi_mapcmd(sc, cm)) != 0) {
981		device_printf(sc->mfi_dev, "Failed to shutdown controller\n");
982	}
983
984	mfi_release_command(cm);
985	mtx_unlock(&sc->mfi_io_lock);
986	return (error);
987}
988
989static void
990mfi_ldprobe(struct mfi_softc *sc)
991{
992	struct mfi_frame_header *hdr;
993	struct mfi_command *cm = NULL;
994	struct mfi_ld_list *list = NULL;
995	struct mfi_disk *ld;
996	int error, i;
997
998	sx_assert(&sc->mfi_config_lock, SA_XLOCKED);
999	mtx_assert(&sc->mfi_io_lock, MA_OWNED);
1000
1001	error = mfi_dcmd_command(sc, &cm, MFI_DCMD_LD_GET_LIST,
1002	    (void **)&list, sizeof(*list));
1003	if (error)
1004		goto out;
1005
1006	cm->cm_flags = MFI_CMD_DATAIN;
1007	if (mfi_wait_command(sc, cm) != 0) {
1008		device_printf(sc->mfi_dev, "Failed to get device listing\n");
1009		goto out;
1010	}
1011
1012	hdr = &cm->cm_frame->header;
1013	if (hdr->cmd_status != MFI_STAT_OK) {
1014		device_printf(sc->mfi_dev, "MFI_DCMD_LD_GET_LIST failed %x\n",
1015		    hdr->cmd_status);
1016		goto out;
1017	}
1018
1019	for (i = 0; i < list->ld_count; i++) {
1020		TAILQ_FOREACH(ld, &sc->mfi_ld_tqh, ld_link) {
1021			if (ld->ld_id == list->ld_list[i].ld.v.target_id)
1022				goto skip_add;
1023		}
1024		mfi_add_ld(sc, list->ld_list[i].ld.v.target_id);
1025	skip_add:;
1026	}
1027out:
1028	if (list)
1029		free(list, M_MFIBUF);
1030	if (cm)
1031		mfi_release_command(cm);
1032
1033	return;
1034}
1035
1036/*
1037 * The timestamp is the number of seconds since 00:00 Jan 1, 2000.  If
1038 * the bits in 24-31 are all set, then it is the number of seconds since
1039 * boot.
1040 */
1041static const char *
1042format_timestamp(uint32_t timestamp)
1043{
1044	static char buffer[32];
1045
1046	if ((timestamp & 0xff000000) == 0xff000000)
1047		snprintf(buffer, sizeof(buffer), "boot + %us", timestamp &
1048		    0x00ffffff);
1049	else
1050		snprintf(buffer, sizeof(buffer), "%us", timestamp);
1051	return (buffer);
1052}
1053
1054static const char *
1055format_class(int8_t class)
1056{
1057	static char buffer[6];
1058
1059	switch (class) {
1060	case MFI_EVT_CLASS_DEBUG:
1061		return ("debug");
1062	case MFI_EVT_CLASS_PROGRESS:
1063		return ("progress");
1064	case MFI_EVT_CLASS_INFO:
1065		return ("info");
1066	case MFI_EVT_CLASS_WARNING:
1067		return ("WARN");
1068	case MFI_EVT_CLASS_CRITICAL:
1069		return ("CRIT");
1070	case MFI_EVT_CLASS_FATAL:
1071		return ("FATAL");
1072	case MFI_EVT_CLASS_DEAD:
1073		return ("DEAD");
1074	default:
1075		snprintf(buffer, sizeof(buffer), "%d", class);
1076		return (buffer);
1077	}
1078}
1079
1080static void
1081mfi_decode_evt(struct mfi_softc *sc, struct mfi_evt_detail *detail)
1082{
1083
1084	device_printf(sc->mfi_dev, "%d (%s/0x%04x/%s) - %s\n", detail->seq,
1085	    format_timestamp(detail->time), detail->evt_class.members.locale,
1086	    format_class(detail->evt_class.members.evt_class), detail->description);
1087}
1088
1089static int
1090mfi_aen_register(struct mfi_softc *sc, int seq, int locale)
1091{
1092	struct mfi_command *cm;
1093	struct mfi_dcmd_frame *dcmd;
1094	union mfi_evt current_aen, prior_aen;
1095	struct mfi_evt_detail *ed = NULL;
1096	int error = 0;
1097
1098	current_aen.word = locale;
1099	if (sc->mfi_aen_cm != NULL) {
1100		prior_aen.word =
1101		    ((uint32_t *)&sc->mfi_aen_cm->cm_frame->dcmd.mbox)[1];
1102		if (prior_aen.members.evt_class <= current_aen.members.evt_class &&
1103		    !((prior_aen.members.locale & current_aen.members.locale)
1104		    ^current_aen.members.locale)) {
1105			return (0);
1106		} else {
1107			prior_aen.members.locale |= current_aen.members.locale;
1108			if (prior_aen.members.evt_class
1109			    < current_aen.members.evt_class)
1110				current_aen.members.evt_class =
1111				    prior_aen.members.evt_class;
1112			mfi_abort(sc, sc->mfi_aen_cm);
1113		}
1114	}
1115
1116	error = mfi_dcmd_command(sc, &cm, MFI_DCMD_CTRL_EVENT_WAIT,
1117	    (void **)&ed, sizeof(*ed));
1118	if (error) {
1119		goto out;
1120	}
1121
1122	dcmd = &cm->cm_frame->dcmd;
1123	((uint32_t *)&dcmd->mbox)[0] = seq;
1124	((uint32_t *)&dcmd->mbox)[1] = locale;
1125	cm->cm_flags = MFI_CMD_DATAIN;
1126	cm->cm_complete = mfi_aen_complete;
1127
1128	sc->mfi_aen_cm = cm;
1129
1130	mfi_enqueue_ready(cm);
1131	mfi_startio(sc);
1132
1133out:
1134	return (error);
1135}
1136
1137static void
1138mfi_aen_complete(struct mfi_command *cm)
1139{
1140	struct mfi_frame_header *hdr;
1141	struct mfi_softc *sc;
1142	struct mfi_evt_detail *detail;
1143	struct mfi_aen *mfi_aen_entry, *tmp;
1144	int seq = 0, aborted = 0;
1145
1146	sc = cm->cm_sc;
1147	hdr = &cm->cm_frame->header;
1148
1149	if (sc->mfi_aen_cm == NULL)
1150		return;
1151
1152	if (sc->mfi_aen_cm->cm_aen_abort ||
1153	    hdr->cmd_status == MFI_STAT_INVALID_STATUS) {
1154		sc->mfi_aen_cm->cm_aen_abort = 0;
1155		aborted = 1;
1156	} else {
1157		sc->mfi_aen_triggered = 1;
1158		if (sc->mfi_poll_waiting) {
1159			sc->mfi_poll_waiting = 0;
1160			selwakeup(&sc->mfi_select);
1161		}
1162		detail = cm->cm_data;
1163		/*
1164		 * XXX If this function is too expensive or is recursive, then
1165		 * events should be put onto a queue and processed later.
1166		 */
1167		mfi_decode_evt(sc, detail);
1168		seq = detail->seq + 1;
1169		TAILQ_FOREACH_SAFE(mfi_aen_entry, &sc->mfi_aen_pids, aen_link, tmp) {
1170			TAILQ_REMOVE(&sc->mfi_aen_pids, mfi_aen_entry,
1171			    aen_link);
1172			PROC_LOCK(mfi_aen_entry->p);
1173			psignal(mfi_aen_entry->p, SIGIO);
1174			PROC_UNLOCK(mfi_aen_entry->p);
1175			free(mfi_aen_entry, M_MFIBUF);
1176		}
1177	}
1178
1179	free(cm->cm_data, M_MFIBUF);
1180	sc->mfi_aen_cm = NULL;
1181	wakeup(&sc->mfi_aen_cm);
1182	mfi_release_command(cm);
1183
1184	/* set it up again so the driver can catch more events */
1185	if (!aborted) {
1186		mfi_aen_setup(sc, seq);
1187	}
1188}
1189
1190#define MAX_EVENTS 15
1191
1192static int
1193mfi_parse_entries(struct mfi_softc *sc, int start_seq, int stop_seq)
1194{
1195	struct mfi_command *cm;
1196	struct mfi_dcmd_frame *dcmd;
1197	struct mfi_evt_list *el;
1198	union mfi_evt class_locale;
1199	int error, i, seq, size;
1200
1201	class_locale.members.reserved = 0;
1202	class_locale.members.locale = mfi_event_locale;
1203	class_locale.members.evt_class  = mfi_event_class;
1204
1205	size = sizeof(struct mfi_evt_list) + sizeof(struct mfi_evt_detail)
1206		* (MAX_EVENTS - 1);
1207	el = malloc(size, M_MFIBUF, M_NOWAIT | M_ZERO);
1208	if (el == NULL)
1209		return (ENOMEM);
1210
1211	for (seq = start_seq;;) {
1212		if ((cm = mfi_dequeue_free(sc)) == NULL) {
1213			free(el, M_MFIBUF);
1214			return (EBUSY);
1215		}
1216
1217		dcmd = &cm->cm_frame->dcmd;
1218		bzero(dcmd->mbox, MFI_MBOX_SIZE);
1219		dcmd->header.cmd = MFI_CMD_DCMD;
1220		dcmd->header.timeout = 0;
1221		dcmd->header.data_len = size;
1222		dcmd->opcode = MFI_DCMD_CTRL_EVENT_GET;
1223		((uint32_t *)&dcmd->mbox)[0] = seq;
1224		((uint32_t *)&dcmd->mbox)[1] = class_locale.word;
1225		cm->cm_sg = &dcmd->sgl;
1226		cm->cm_total_frame_size = MFI_DCMD_FRAME_SIZE;
1227		cm->cm_flags = MFI_CMD_DATAIN | MFI_CMD_POLLED;
1228		cm->cm_data = el;
1229		cm->cm_len = size;
1230
1231		if ((error = mfi_mapcmd(sc, cm)) != 0) {
1232			device_printf(sc->mfi_dev,
1233			    "Failed to get controller entries\n");
1234			mfi_release_command(cm);
1235			break;
1236		}
1237
1238		bus_dmamap_sync(sc->mfi_buffer_dmat, cm->cm_dmamap,
1239		    BUS_DMASYNC_POSTREAD);
1240		bus_dmamap_unload(sc->mfi_buffer_dmat, cm->cm_dmamap);
1241
1242		if (dcmd->header.cmd_status == MFI_STAT_NOT_FOUND) {
1243			mfi_release_command(cm);
1244			break;
1245		}
1246		if (dcmd->header.cmd_status != MFI_STAT_OK) {
1247			device_printf(sc->mfi_dev,
1248			    "Error %d fetching controller entries\n",
1249			    dcmd->header.cmd_status);
1250			mfi_release_command(cm);
1251			break;
1252		}
1253		mfi_release_command(cm);
1254
1255		for (i = 0; i < el->count; i++) {
1256			/*
1257			 * If this event is newer than 'stop_seq' then
1258			 * break out of the loop.  Note that the log
1259			 * is a circular buffer so we have to handle
1260			 * the case that our stop point is earlier in
1261			 * the buffer than our start point.
1262			 */
1263			if (el->event[i].seq >= stop_seq) {
1264				if (start_seq <= stop_seq)
1265					break;
1266				else if (el->event[i].seq < start_seq)
1267					break;
1268			}
1269			mfi_decode_evt(sc, &el->event[i]);
1270		}
1271		seq = el->event[el->count - 1].seq + 1;
1272	}
1273
1274	free(el, M_MFIBUF);
1275	return (0);
1276}
1277
1278static int
1279mfi_add_ld(struct mfi_softc *sc, int id)
1280{
1281	struct mfi_command *cm;
1282	struct mfi_dcmd_frame *dcmd = NULL;
1283	struct mfi_ld_info *ld_info = NULL;
1284	int error;
1285
1286	mtx_assert(&sc->mfi_io_lock, MA_OWNED);
1287
1288	error = mfi_dcmd_command(sc, &cm, MFI_DCMD_LD_GET_INFO,
1289	    (void **)&ld_info, sizeof(*ld_info));
1290	if (error) {
1291		device_printf(sc->mfi_dev,
1292		    "Failed to allocate for MFI_DCMD_LD_GET_INFO %d\n", error);
1293		if (ld_info)
1294			free(ld_info, M_MFIBUF);
1295		return (error);
1296	}
1297	cm->cm_flags = MFI_CMD_DATAIN;
1298	dcmd = &cm->cm_frame->dcmd;
1299	dcmd->mbox[0] = id;
1300	if (mfi_wait_command(sc, cm) != 0) {
1301		device_printf(sc->mfi_dev,
1302		    "Failed to get logical drive: %d\n", id);
1303		free(ld_info, M_MFIBUF);
1304		return (0);
1305	}
1306
1307	mfi_add_ld_complete(cm);
1308	return (0);
1309}
1310
1311static void
1312mfi_add_ld_complete(struct mfi_command *cm)
1313{
1314	struct mfi_frame_header *hdr;
1315	struct mfi_ld_info *ld_info;
1316	struct mfi_softc *sc;
1317	device_t child;
1318
1319	sc = cm->cm_sc;
1320	hdr = &cm->cm_frame->header;
1321	ld_info = cm->cm_private;
1322
1323	if (hdr->cmd_status != MFI_STAT_OK) {
1324		free(ld_info, M_MFIBUF);
1325		mfi_release_command(cm);
1326		return;
1327	}
1328	mfi_release_command(cm);
1329
1330	mtx_unlock(&sc->mfi_io_lock);
1331	mtx_lock(&Giant);
1332	if ((child = device_add_child(sc->mfi_dev, "mfid", -1)) == NULL) {
1333		device_printf(sc->mfi_dev, "Failed to add logical disk\n");
1334		free(ld_info, M_MFIBUF);
1335		mtx_unlock(&Giant);
1336		mtx_lock(&sc->mfi_io_lock);
1337		return;
1338	}
1339
1340	device_set_ivars(child, ld_info);
1341	device_set_desc(child, "MFI Logical Disk");
1342	bus_generic_attach(sc->mfi_dev);
1343	mtx_unlock(&Giant);
1344	mtx_lock(&sc->mfi_io_lock);
1345}
1346
1347static struct mfi_command *
1348mfi_bio_command(struct mfi_softc *sc)
1349{
1350	struct mfi_io_frame *io;
1351	struct mfi_command *cm;
1352	struct bio *bio;
1353	int flags, blkcount;
1354
1355	if ((cm = mfi_dequeue_free(sc)) == NULL)
1356		return (NULL);
1357
1358	if ((bio = mfi_dequeue_bio(sc)) == NULL) {
1359		mfi_release_command(cm);
1360		return (NULL);
1361	}
1362
1363	io = &cm->cm_frame->io;
1364	switch (bio->bio_cmd & 0x03) {
1365	case BIO_READ:
1366		io->header.cmd = MFI_CMD_LD_READ;
1367		flags = MFI_CMD_DATAIN;
1368		break;
1369	case BIO_WRITE:
1370		io->header.cmd = MFI_CMD_LD_WRITE;
1371		flags = MFI_CMD_DATAOUT;
1372		break;
1373	default:
1374		panic("Invalid bio command");
1375	}
1376
1377	/* Cheat with the sector length to avoid a non-constant division */
1378	blkcount = (bio->bio_bcount + MFI_SECTOR_LEN - 1) / MFI_SECTOR_LEN;
1379	io->header.target_id = (uintptr_t)bio->bio_driver1;
1380	io->header.timeout = 0;
1381	io->header.flags = 0;
1382	io->header.sense_len = MFI_SENSE_LEN;
1383	io->header.data_len = blkcount;
1384	io->sense_addr_lo = cm->cm_sense_busaddr;
1385	io->sense_addr_hi = 0;
1386	io->lba_hi = (bio->bio_pblkno & 0xffffffff00000000) >> 32;
1387	io->lba_lo = bio->bio_pblkno & 0xffffffff;
1388	cm->cm_complete = mfi_bio_complete;
1389	cm->cm_private = bio;
1390	cm->cm_data = bio->bio_data;
1391	cm->cm_len = bio->bio_bcount;
1392	cm->cm_sg = &io->sgl;
1393	cm->cm_total_frame_size = MFI_IO_FRAME_SIZE;
1394	cm->cm_flags = flags;
1395	return (cm);
1396}
1397
1398static void
1399mfi_bio_complete(struct mfi_command *cm)
1400{
1401	struct bio *bio;
1402	struct mfi_frame_header *hdr;
1403	struct mfi_softc *sc;
1404
1405	bio = cm->cm_private;
1406	hdr = &cm->cm_frame->header;
1407	sc = cm->cm_sc;
1408
1409	if ((hdr->cmd_status != MFI_STAT_OK) || (hdr->scsi_status != 0)) {
1410		bio->bio_flags |= BIO_ERROR;
1411		bio->bio_error = EIO;
1412		device_printf(sc->mfi_dev, "I/O error, status= %d "
1413		    "scsi_status= %d\n", hdr->cmd_status, hdr->scsi_status);
1414		mfi_print_sense(cm->cm_sc, cm->cm_sense);
1415	} else if (cm->cm_error != 0) {
1416		bio->bio_flags |= BIO_ERROR;
1417	}
1418
1419	mfi_release_command(cm);
1420	mfi_disk_complete(bio);
1421}
1422
1423void
1424mfi_startio(struct mfi_softc *sc)
1425{
1426	struct mfi_command *cm;
1427	struct ccb_hdr *ccbh;
1428
1429	for (;;) {
1430		/* Don't bother if we're short on resources */
1431		if (sc->mfi_flags & MFI_FLAGS_QFRZN)
1432			break;
1433
1434		/* Try a command that has already been prepared */
1435		cm = mfi_dequeue_ready(sc);
1436
1437		if (cm == NULL) {
1438			if ((ccbh = TAILQ_FIRST(&sc->mfi_cam_ccbq)) != NULL)
1439				cm = sc->mfi_cam_start(ccbh);
1440		}
1441
1442		/* Nope, so look for work on the bioq */
1443		if (cm == NULL)
1444			cm = mfi_bio_command(sc);
1445
1446		/* No work available, so exit */
1447		if (cm == NULL)
1448			break;
1449
1450		/* Send the command to the controller */
1451		if (mfi_mapcmd(sc, cm) != 0) {
1452			mfi_requeue_ready(cm);
1453			break;
1454		}
1455	}
1456}
1457
1458static int
1459mfi_mapcmd(struct mfi_softc *sc, struct mfi_command *cm)
1460{
1461	int error, polled;
1462
1463	mtx_assert(&sc->mfi_io_lock, MA_OWNED);
1464
1465	if (cm->cm_data != NULL) {
1466		polled = (cm->cm_flags & MFI_CMD_POLLED) ? BUS_DMA_NOWAIT : 0;
1467		error = bus_dmamap_load(sc->mfi_buffer_dmat, cm->cm_dmamap,
1468		    cm->cm_data, cm->cm_len, mfi_data_cb, cm, polled);
1469		if (error == EINPROGRESS) {
1470			sc->mfi_flags |= MFI_FLAGS_QFRZN;
1471			return (0);
1472		}
1473	} else {
1474		error = mfi_send_frame(sc, cm);
1475	}
1476
1477	return (error);
1478}
1479
1480static void
1481mfi_data_cb(void *arg, bus_dma_segment_t *segs, int nsegs, int error)
1482{
1483	struct mfi_frame_header *hdr;
1484	struct mfi_command *cm;
1485	union mfi_sgl *sgl;
1486	struct mfi_softc *sc;
1487	int i, dir;
1488
1489	cm = (struct mfi_command *)arg;
1490	sc = cm->cm_sc;
1491	hdr = &cm->cm_frame->header;
1492	sgl = cm->cm_sg;
1493
1494	if (error) {
1495		printf("error %d in callback\n", error);
1496		cm->cm_error = error;
1497		mfi_complete(sc, cm);
1498		return;
1499	}
1500
1501	if ((sc->mfi_flags & MFI_FLAGS_SG64) == 0) {
1502		for (i = 0; i < nsegs; i++) {
1503			sgl->sg32[i].addr = segs[i].ds_addr;
1504			sgl->sg32[i].len = segs[i].ds_len;
1505		}
1506	} else {
1507		for (i = 0; i < nsegs; i++) {
1508			sgl->sg64[i].addr = segs[i].ds_addr;
1509			sgl->sg64[i].len = segs[i].ds_len;
1510		}
1511		hdr->flags |= MFI_FRAME_SGL64;
1512	}
1513	hdr->sg_count = nsegs;
1514
1515	dir = 0;
1516	if (cm->cm_flags & MFI_CMD_DATAIN) {
1517		dir |= BUS_DMASYNC_PREREAD;
1518		hdr->flags |= MFI_FRAME_DIR_READ;
1519	}
1520	if (cm->cm_flags & MFI_CMD_DATAOUT) {
1521		dir |= BUS_DMASYNC_PREWRITE;
1522		hdr->flags |= MFI_FRAME_DIR_WRITE;
1523	}
1524	bus_dmamap_sync(sc->mfi_buffer_dmat, cm->cm_dmamap, dir);
1525	cm->cm_flags |= MFI_CMD_MAPPED;
1526
1527	/*
1528	 * Instead of calculating the total number of frames in the
1529	 * compound frame, it's already assumed that there will be at
1530	 * least 1 frame, so don't compensate for the modulo of the
1531	 * following division.
1532	 */
1533	cm->cm_total_frame_size += (sc->mfi_sge_size * nsegs);
1534	cm->cm_extra_frames = (cm->cm_total_frame_size - 1) / MFI_FRAME_SIZE;
1535
1536	mfi_send_frame(sc, cm);
1537
1538	return;
1539}
1540
1541static int
1542mfi_send_frame(struct mfi_softc *sc, struct mfi_command *cm)
1543{
1544	struct mfi_frame_header *hdr;
1545	int tm = MFI_POLL_TIMEOUT_SECS * 1000;
1546
1547	hdr = &cm->cm_frame->header;
1548
1549	if ((cm->cm_flags & MFI_CMD_POLLED) == 0) {
1550		cm->cm_timestamp = time_uptime;
1551		mfi_enqueue_busy(cm);
1552	} else {
1553		hdr->cmd_status = MFI_STAT_INVALID_STATUS;
1554		hdr->flags |= MFI_FRAME_DONT_POST_IN_REPLY_QUEUE;
1555	}
1556
1557	/*
1558	 * The bus address of the command is aligned on a 64 byte boundary,
1559	 * leaving the least 6 bits as zero.  For whatever reason, the
1560	 * hardware wants the address shifted right by three, leaving just
1561	 * 3 zero bits.  These three bits are then used as a prefetching
1562	 * hint for the hardware to predict how many frames need to be
1563	 * fetched across the bus.  If a command has more than 8 frames
1564	 * then the 3 bits are set to 0x7 and the firmware uses other
1565	 * information in the command to determine the total amount to fetch.
1566	 * However, FreeBSD doesn't support I/O larger than 128K, so 8 frames
1567	 * is enough for both 32bit and 64bit systems.
1568	 */
1569	if (cm->cm_extra_frames > 7)
1570		cm->cm_extra_frames = 7;
1571
1572	sc->mfi_issue_cmd(sc,cm->cm_frame_busaddr,cm->cm_extra_frames);
1573
1574	if ((cm->cm_flags & MFI_CMD_POLLED) == 0)
1575		return (0);
1576
1577	/* This is a polled command, so busy-wait for it to complete. */
1578	while (hdr->cmd_status == MFI_STAT_INVALID_STATUS) {
1579		DELAY(1000);
1580		tm -= 1;
1581		if (tm <= 0)
1582			break;
1583	}
1584
1585	if (hdr->cmd_status == MFI_STAT_INVALID_STATUS) {
1586		device_printf(sc->mfi_dev, "Frame %p timed out "
1587			      "command 0x%X\n", hdr, cm->cm_frame->dcmd.opcode);
1588		return (ETIMEDOUT);
1589	}
1590
1591	return (0);
1592}
1593
1594static void
1595mfi_complete(struct mfi_softc *sc, struct mfi_command *cm)
1596{
1597	int dir;
1598
1599	if ((cm->cm_flags & MFI_CMD_MAPPED) != 0) {
1600		dir = 0;
1601		if (cm->cm_flags & MFI_CMD_DATAIN)
1602			dir |= BUS_DMASYNC_POSTREAD;
1603		if (cm->cm_flags & MFI_CMD_DATAOUT)
1604			dir |= BUS_DMASYNC_POSTWRITE;
1605
1606		bus_dmamap_sync(sc->mfi_buffer_dmat, cm->cm_dmamap, dir);
1607		bus_dmamap_unload(sc->mfi_buffer_dmat, cm->cm_dmamap);
1608		cm->cm_flags &= ~MFI_CMD_MAPPED;
1609	}
1610
1611	cm->cm_flags |= MFI_CMD_COMPLETED;
1612
1613	if (cm->cm_complete != NULL)
1614		cm->cm_complete(cm);
1615	else
1616		wakeup(cm);
1617}
1618
1619static int
1620mfi_abort(struct mfi_softc *sc, struct mfi_command *cm_abort)
1621{
1622	struct mfi_command *cm;
1623	struct mfi_abort_frame *abort;
1624	int i = 0;
1625
1626	mtx_assert(&sc->mfi_io_lock, MA_OWNED);
1627
1628	if ((cm = mfi_dequeue_free(sc)) == NULL) {
1629		return (EBUSY);
1630	}
1631
1632	abort = &cm->cm_frame->abort;
1633	abort->header.cmd = MFI_CMD_ABORT;
1634	abort->header.flags = 0;
1635	abort->abort_context = cm_abort->cm_frame->header.context;
1636	abort->abort_mfi_addr_lo = cm_abort->cm_frame_busaddr;
1637	abort->abort_mfi_addr_hi = 0;
1638	cm->cm_data = NULL;
1639	cm->cm_flags = MFI_CMD_POLLED;
1640
1641	sc->mfi_aen_cm->cm_aen_abort = 1;
1642	mfi_mapcmd(sc, cm);
1643	mfi_release_command(cm);
1644
1645	while (i < 5 && sc->mfi_aen_cm != NULL) {
1646		msleep(&sc->mfi_aen_cm, &sc->mfi_io_lock, 0, "mfiabort", 5 * hz);
1647		i++;
1648	}
1649
1650	return (0);
1651}
1652
1653int
1654mfi_dump_blocks(struct mfi_softc *sc, int id, uint64_t lba, void *virt, int len)
1655{
1656	struct mfi_command *cm;
1657	struct mfi_io_frame *io;
1658	int error;
1659
1660	if ((cm = mfi_dequeue_free(sc)) == NULL)
1661		return (EBUSY);
1662
1663	io = &cm->cm_frame->io;
1664	io->header.cmd = MFI_CMD_LD_WRITE;
1665	io->header.target_id = id;
1666	io->header.timeout = 0;
1667	io->header.flags = 0;
1668	io->header.sense_len = MFI_SENSE_LEN;
1669	io->header.data_len = (len + MFI_SECTOR_LEN - 1) / MFI_SECTOR_LEN;
1670	io->sense_addr_lo = cm->cm_sense_busaddr;
1671	io->sense_addr_hi = 0;
1672	io->lba_hi = (lba & 0xffffffff00000000) >> 32;
1673	io->lba_lo = lba & 0xffffffff;
1674	cm->cm_data = virt;
1675	cm->cm_len = len;
1676	cm->cm_sg = &io->sgl;
1677	cm->cm_total_frame_size = MFI_IO_FRAME_SIZE;
1678	cm->cm_flags = MFI_CMD_POLLED | MFI_CMD_DATAOUT;
1679
1680	error = mfi_mapcmd(sc, cm);
1681	bus_dmamap_sync(sc->mfi_buffer_dmat, cm->cm_dmamap,
1682	    BUS_DMASYNC_POSTWRITE);
1683	bus_dmamap_unload(sc->mfi_buffer_dmat, cm->cm_dmamap);
1684	mfi_release_command(cm);
1685
1686	return (error);
1687}
1688
1689static int
1690mfi_open(struct cdev *dev, int flags, int fmt, struct thread *td)
1691{
1692	struct mfi_softc *sc;
1693	int error;
1694
1695	sc = dev->si_drv1;
1696
1697	mtx_lock(&sc->mfi_io_lock);
1698	if (sc->mfi_detaching)
1699		error = ENXIO;
1700	else {
1701		sc->mfi_flags |= MFI_FLAGS_OPEN;
1702		error = 0;
1703	}
1704	mtx_unlock(&sc->mfi_io_lock);
1705
1706	return (error);
1707}
1708
1709static int
1710mfi_close(struct cdev *dev, int flags, int fmt, struct thread *td)
1711{
1712	struct mfi_softc *sc;
1713	struct mfi_aen *mfi_aen_entry, *tmp;
1714
1715	sc = dev->si_drv1;
1716
1717	mtx_lock(&sc->mfi_io_lock);
1718	sc->mfi_flags &= ~MFI_FLAGS_OPEN;
1719
1720	TAILQ_FOREACH_SAFE(mfi_aen_entry, &sc->mfi_aen_pids, aen_link, tmp) {
1721		if (mfi_aen_entry->p == curproc) {
1722			TAILQ_REMOVE(&sc->mfi_aen_pids, mfi_aen_entry,
1723			    aen_link);
1724			free(mfi_aen_entry, M_MFIBUF);
1725		}
1726	}
1727	mtx_unlock(&sc->mfi_io_lock);
1728	return (0);
1729}
1730
1731static int
1732mfi_config_lock(struct mfi_softc *sc, uint32_t opcode)
1733{
1734
1735	switch (opcode) {
1736	case MFI_DCMD_LD_DELETE:
1737	case MFI_DCMD_CFG_ADD:
1738	case MFI_DCMD_CFG_CLEAR:
1739		sx_xlock(&sc->mfi_config_lock);
1740		return (1);
1741	default:
1742		return (0);
1743	}
1744}
1745
1746static void
1747mfi_config_unlock(struct mfi_softc *sc, int locked)
1748{
1749
1750	if (locked)
1751		sx_xunlock(&sc->mfi_config_lock);
1752}
1753
1754/* Perform pre-issue checks on commands from userland and possibly veto them. */
1755static int
1756mfi_check_command_pre(struct mfi_softc *sc, struct mfi_command *cm)
1757{
1758	struct mfi_disk *ld, *ld2;
1759	int error;
1760
1761	mtx_assert(&sc->mfi_io_lock, MA_OWNED);
1762	error = 0;
1763	switch (cm->cm_frame->dcmd.opcode) {
1764	case MFI_DCMD_LD_DELETE:
1765		TAILQ_FOREACH(ld, &sc->mfi_ld_tqh, ld_link) {
1766			if (ld->ld_id == cm->cm_frame->dcmd.mbox[0])
1767				break;
1768		}
1769		if (ld == NULL)
1770			error = ENOENT;
1771		else
1772			error = mfi_disk_disable(ld);
1773		break;
1774	case MFI_DCMD_CFG_CLEAR:
1775		TAILQ_FOREACH(ld, &sc->mfi_ld_tqh, ld_link) {
1776			error = mfi_disk_disable(ld);
1777			if (error)
1778				break;
1779		}
1780		if (error) {
1781			TAILQ_FOREACH(ld2, &sc->mfi_ld_tqh, ld_link) {
1782				if (ld2 == ld)
1783					break;
1784				mfi_disk_enable(ld2);
1785			}
1786		}
1787		break;
1788	default:
1789		break;
1790	}
1791	return (error);
1792}
1793
1794/* Perform post-issue checks on commands from userland. */
1795static void
1796mfi_check_command_post(struct mfi_softc *sc, struct mfi_command *cm)
1797{
1798	struct mfi_disk *ld, *ldn;
1799
1800	switch (cm->cm_frame->dcmd.opcode) {
1801	case MFI_DCMD_LD_DELETE:
1802		TAILQ_FOREACH(ld, &sc->mfi_ld_tqh, ld_link) {
1803			if (ld->ld_id == cm->cm_frame->dcmd.mbox[0])
1804				break;
1805		}
1806		KASSERT(ld != NULL, ("volume dissappeared"));
1807		if (cm->cm_frame->header.cmd_status == MFI_STAT_OK) {
1808			mtx_unlock(&sc->mfi_io_lock);
1809			mtx_lock(&Giant);
1810			device_delete_child(sc->mfi_dev, ld->ld_dev);
1811			mtx_unlock(&Giant);
1812			mtx_lock(&sc->mfi_io_lock);
1813		} else
1814			mfi_disk_enable(ld);
1815		break;
1816	case MFI_DCMD_CFG_CLEAR:
1817		if (cm->cm_frame->header.cmd_status == MFI_STAT_OK) {
1818			mtx_unlock(&sc->mfi_io_lock);
1819			mtx_lock(&Giant);
1820			TAILQ_FOREACH_SAFE(ld, &sc->mfi_ld_tqh, ld_link, ldn) {
1821				device_delete_child(sc->mfi_dev, ld->ld_dev);
1822			}
1823			mtx_unlock(&Giant);
1824			mtx_lock(&sc->mfi_io_lock);
1825		} else {
1826			TAILQ_FOREACH(ld, &sc->mfi_ld_tqh, ld_link)
1827				mfi_disk_enable(ld);
1828		}
1829		break;
1830	case MFI_DCMD_CFG_ADD:
1831		mfi_ldprobe(sc);
1832		break;
1833	case MFI_DCMD_CFG_FOREIGN_IMPORT:
1834		mfi_ldprobe(sc);
1835		break;
1836	}
1837}
1838
1839static int
1840mfi_user_command(struct mfi_softc *sc, struct mfi_ioc_passthru *ioc)
1841{
1842	struct mfi_command *cm;
1843	struct mfi_dcmd_frame *dcmd;
1844	void *ioc_buf = NULL;
1845	uint32_t context;
1846	int error = 0, locked;
1847
1848
1849	if (ioc->buf_size > 0) {
1850		ioc_buf = malloc(ioc->buf_size, M_MFIBUF, M_WAITOK);
1851		if (ioc_buf == NULL) {
1852			return (ENOMEM);
1853		}
1854		error = copyin(ioc->buf, ioc_buf, ioc->buf_size);
1855		if (error) {
1856			device_printf(sc->mfi_dev, "failed to copyin\n");
1857			free(ioc_buf, M_MFIBUF);
1858			return (error);
1859		}
1860	}
1861
1862	locked = mfi_config_lock(sc, ioc->ioc_frame.opcode);
1863
1864	mtx_lock(&sc->mfi_io_lock);
1865	while ((cm = mfi_dequeue_free(sc)) == NULL)
1866		msleep(mfi_user_command, &sc->mfi_io_lock, 0, "mfiioc", hz);
1867
1868	/* Save context for later */
1869	context = cm->cm_frame->header.context;
1870
1871	dcmd = &cm->cm_frame->dcmd;
1872	bcopy(&ioc->ioc_frame, dcmd, sizeof(struct mfi_dcmd_frame));
1873
1874	cm->cm_sg = &dcmd->sgl;
1875	cm->cm_total_frame_size = MFI_DCMD_FRAME_SIZE;
1876	cm->cm_data = ioc_buf;
1877	cm->cm_len = ioc->buf_size;
1878
1879	/* restore context */
1880	cm->cm_frame->header.context = context;
1881
1882	/* Cheat since we don't know if we're writing or reading */
1883	cm->cm_flags = MFI_CMD_DATAIN | MFI_CMD_DATAOUT;
1884
1885	error = mfi_check_command_pre(sc, cm);
1886	if (error)
1887		goto out;
1888
1889	error = mfi_wait_command(sc, cm);
1890	if (error) {
1891		device_printf(sc->mfi_dev, "ioctl failed %d\n", error);
1892		goto out;
1893	}
1894	bcopy(dcmd, &ioc->ioc_frame, sizeof(struct mfi_dcmd_frame));
1895	mfi_check_command_post(sc, cm);
1896out:
1897	mfi_release_command(cm);
1898	mtx_unlock(&sc->mfi_io_lock);
1899	mfi_config_unlock(sc, locked);
1900	if (ioc->buf_size > 0)
1901		error = copyout(ioc_buf, ioc->buf, ioc->buf_size);
1902	if (ioc_buf)
1903		free(ioc_buf, M_MFIBUF);
1904	return (error);
1905}
1906
1907#ifdef __amd64__
1908#define	PTRIN(p)		((void *)(uintptr_t)(p))
1909#else
1910#define	PTRIN(p)		(p)
1911#endif
1912
1913static int
1914mfi_ioctl(struct cdev *dev, u_long cmd, caddr_t arg, int flag, struct thread *td)
1915{
1916	struct mfi_softc *sc;
1917	union mfi_statrequest *ms;
1918	struct mfi_ioc_packet *ioc;
1919#ifdef __amd64__
1920	struct mfi_ioc_packet32 *ioc32;
1921#endif
1922	struct mfi_ioc_aen *aen;
1923	struct mfi_command *cm = NULL;
1924	uint32_t context;
1925	union mfi_sense_ptr sense_ptr;
1926	uint8_t *data = NULL, *temp;
1927	int i;
1928	struct mfi_ioc_passthru *iop = (struct mfi_ioc_passthru *)arg;
1929#ifdef __amd64__
1930	struct mfi_ioc_passthru32 *iop32 = (struct mfi_ioc_passthru32 *)arg;
1931	struct mfi_ioc_passthru iop_swab;
1932#endif
1933	int error, locked;
1934
1935	sc = dev->si_drv1;
1936	error = 0;
1937
1938	switch (cmd) {
1939	case MFIIO_STATS:
1940		ms = (union mfi_statrequest *)arg;
1941		switch (ms->ms_item) {
1942		case MFIQ_FREE:
1943		case MFIQ_BIO:
1944		case MFIQ_READY:
1945		case MFIQ_BUSY:
1946			bcopy(&sc->mfi_qstat[ms->ms_item], &ms->ms_qstat,
1947			    sizeof(struct mfi_qstat));
1948			break;
1949		default:
1950			error = ENOIOCTL;
1951			break;
1952		}
1953		break;
1954	case MFIIO_QUERY_DISK:
1955	{
1956		struct mfi_query_disk *qd;
1957		struct mfi_disk *ld;
1958
1959		qd = (struct mfi_query_disk *)arg;
1960		mtx_lock(&sc->mfi_io_lock);
1961		TAILQ_FOREACH(ld, &sc->mfi_ld_tqh, ld_link) {
1962			if (ld->ld_id == qd->array_id)
1963				break;
1964		}
1965		if (ld == NULL) {
1966			qd->present = 0;
1967			mtx_unlock(&sc->mfi_io_lock);
1968			return (0);
1969		}
1970		qd->present = 1;
1971		if (ld->ld_flags & MFI_DISK_FLAGS_OPEN)
1972			qd->open = 1;
1973		bzero(qd->devname, SPECNAMELEN + 1);
1974		snprintf(qd->devname, SPECNAMELEN, "mfid%d", ld->ld_unit);
1975		mtx_unlock(&sc->mfi_io_lock);
1976		break;
1977	}
1978	case MFI_CMD:
1979#ifdef __amd64__
1980	case MFI_CMD32:
1981#endif
1982		{
1983		devclass_t devclass;
1984		ioc = (struct mfi_ioc_packet *)arg;
1985		int adapter;
1986
1987		adapter = ioc->mfi_adapter_no;
1988		if (device_get_unit(sc->mfi_dev) == 0 && adapter != 0) {
1989			devclass = devclass_find("mfi");
1990			sc = devclass_get_softc(devclass, adapter);
1991		}
1992		mtx_lock(&sc->mfi_io_lock);
1993		if ((cm = mfi_dequeue_free(sc)) == NULL) {
1994			mtx_unlock(&sc->mfi_io_lock);
1995			return (EBUSY);
1996		}
1997		mtx_unlock(&sc->mfi_io_lock);
1998		locked = 0;
1999
2000		/*
2001		 * save off original context since copying from user
2002		 * will clobber some data
2003		 */
2004		context = cm->cm_frame->header.context;
2005
2006		bcopy(ioc->mfi_frame.raw, cm->cm_frame,
2007		    2 * MFI_DCMD_FRAME_SIZE);  /* this isn't quite right */
2008		cm->cm_total_frame_size = (sizeof(union mfi_sgl)
2009		    * ioc->mfi_sge_count) + ioc->mfi_sgl_off;
2010		if (ioc->mfi_sge_count) {
2011			cm->cm_sg =
2012			    (union mfi_sgl *)&cm->cm_frame->bytes[ioc->mfi_sgl_off];
2013		}
2014		cm->cm_flags = 0;
2015		if (cm->cm_frame->header.flags & MFI_FRAME_DATAIN)
2016			cm->cm_flags |= MFI_CMD_DATAIN;
2017		if (cm->cm_frame->header.flags & MFI_FRAME_DATAOUT)
2018			cm->cm_flags |= MFI_CMD_DATAOUT;
2019		/* Legacy app shim */
2020		if (cm->cm_flags == 0)
2021			cm->cm_flags |= MFI_CMD_DATAIN | MFI_CMD_DATAOUT;
2022		cm->cm_len = cm->cm_frame->header.data_len;
2023		if (cm->cm_len &&
2024		    (cm->cm_flags & (MFI_CMD_DATAIN | MFI_CMD_DATAOUT))) {
2025			cm->cm_data = data = malloc(cm->cm_len, M_MFIBUF,
2026			    M_WAITOK | M_ZERO);
2027			if (cm->cm_data == NULL) {
2028				device_printf(sc->mfi_dev, "Malloc failed\n");
2029				goto out;
2030			}
2031		} else {
2032			cm->cm_data = 0;
2033		}
2034
2035		/* restore header context */
2036		cm->cm_frame->header.context = context;
2037
2038		temp = data;
2039		if (cm->cm_flags & MFI_CMD_DATAOUT) {
2040			for (i = 0; i < ioc->mfi_sge_count; i++) {
2041#ifdef __amd64__
2042				if (cmd == MFI_CMD) {
2043					/* Native */
2044					error = copyin(ioc->mfi_sgl[i].iov_base,
2045					       temp,
2046					       ioc->mfi_sgl[i].iov_len);
2047				} else {
2048					void *temp_convert;
2049					/* 32bit */
2050					ioc32 = (struct mfi_ioc_packet32 *)ioc;
2051					temp_convert =
2052					    PTRIN(ioc32->mfi_sgl[i].iov_base);
2053					error = copyin(temp_convert,
2054					       temp,
2055					       ioc32->mfi_sgl[i].iov_len);
2056				}
2057#else
2058				error = copyin(ioc->mfi_sgl[i].iov_base,
2059				       temp,
2060				       ioc->mfi_sgl[i].iov_len);
2061#endif
2062				if (error != 0) {
2063					device_printf(sc->mfi_dev,
2064					    "Copy in failed\n");
2065					goto out;
2066				}
2067				temp = &temp[ioc->mfi_sgl[i].iov_len];
2068			}
2069		}
2070
2071		if (cm->cm_frame->header.cmd == MFI_CMD_DCMD)
2072			locked = mfi_config_lock(sc, cm->cm_frame->dcmd.opcode);
2073
2074		if (cm->cm_frame->header.cmd == MFI_CMD_PD_SCSI_IO) {
2075			cm->cm_frame->pass.sense_addr_lo = cm->cm_sense_busaddr;
2076			cm->cm_frame->pass.sense_addr_hi = 0;
2077		}
2078
2079		mtx_lock(&sc->mfi_io_lock);
2080		error = mfi_check_command_pre(sc, cm);
2081		if (error) {
2082			mtx_unlock(&sc->mfi_io_lock);
2083			goto out;
2084		}
2085
2086		if ((error = mfi_wait_command(sc, cm)) != 0) {
2087			device_printf(sc->mfi_dev,
2088			    "Controller polled failed\n");
2089			mtx_unlock(&sc->mfi_io_lock);
2090			goto out;
2091		}
2092
2093		mfi_check_command_post(sc, cm);
2094		mtx_unlock(&sc->mfi_io_lock);
2095
2096		temp = data;
2097		if (cm->cm_flags & MFI_CMD_DATAIN) {
2098			for (i = 0; i < ioc->mfi_sge_count; i++) {
2099#ifdef __amd64__
2100				if (cmd == MFI_CMD) {
2101					/* Native */
2102					error = copyout(temp,
2103						ioc->mfi_sgl[i].iov_base,
2104						ioc->mfi_sgl[i].iov_len);
2105				} else {
2106					void *temp_convert;
2107					/* 32bit */
2108					ioc32 = (struct mfi_ioc_packet32 *)ioc;
2109					temp_convert =
2110					    PTRIN(ioc32->mfi_sgl[i].iov_base);
2111					error = copyout(temp,
2112						temp_convert,
2113						ioc32->mfi_sgl[i].iov_len);
2114				}
2115#else
2116				error = copyout(temp,
2117					ioc->mfi_sgl[i].iov_base,
2118					ioc->mfi_sgl[i].iov_len);
2119#endif
2120				if (error != 0) {
2121					device_printf(sc->mfi_dev,
2122					    "Copy out failed\n");
2123					goto out;
2124				}
2125				temp = &temp[ioc->mfi_sgl[i].iov_len];
2126			}
2127		}
2128
2129		if (ioc->mfi_sense_len) {
2130			/* get user-space sense ptr then copy out sense */
2131			bcopy(&((struct mfi_ioc_packet*)arg)
2132			    ->mfi_frame.raw[ioc->mfi_sense_off],
2133			    &sense_ptr.sense_ptr_data[0],
2134			    sizeof(sense_ptr.sense_ptr_data));
2135#ifdef __amd64__
2136			if (cmd != MFI_CMD) {
2137				/*
2138				 * not 64bit native so zero out any address
2139				 * over 32bit */
2140				sense_ptr.addr.high = 0;
2141			}
2142#endif
2143			error = copyout(cm->cm_sense, sense_ptr.user_space,
2144			    ioc->mfi_sense_len);
2145			if (error != 0) {
2146				device_printf(sc->mfi_dev,
2147				    "Copy out failed\n");
2148				goto out;
2149			}
2150		}
2151
2152		ioc->mfi_frame.hdr.cmd_status = cm->cm_frame->header.cmd_status;
2153out:
2154		mfi_config_unlock(sc, locked);
2155		if (data)
2156			free(data, M_MFIBUF);
2157		if (cm) {
2158			mtx_lock(&sc->mfi_io_lock);
2159			mfi_release_command(cm);
2160			mtx_unlock(&sc->mfi_io_lock);
2161		}
2162
2163		break;
2164		}
2165	case MFI_SET_AEN:
2166		aen = (struct mfi_ioc_aen *)arg;
2167		error = mfi_aen_register(sc, aen->aen_seq_num,
2168		    aen->aen_class_locale);
2169
2170		break;
2171	case MFI_LINUX_CMD_2: /* Firmware Linux ioctl shim */
2172		{
2173			devclass_t devclass;
2174			struct mfi_linux_ioc_packet l_ioc;
2175			int adapter;
2176
2177			devclass = devclass_find("mfi");
2178			if (devclass == NULL)
2179				return (ENOENT);
2180
2181			error = copyin(arg, &l_ioc, sizeof(l_ioc));
2182			if (error)
2183				return (error);
2184			adapter = l_ioc.lioc_adapter_no;
2185			sc = devclass_get_softc(devclass, adapter);
2186			if (sc == NULL)
2187				return (ENOENT);
2188			return (mfi_linux_ioctl_int(sc->mfi_cdev,
2189			    cmd, arg, flag, td));
2190			break;
2191		}
2192	case MFI_LINUX_SET_AEN_2: /* AEN Linux ioctl shim */
2193		{
2194			devclass_t devclass;
2195			struct mfi_linux_ioc_aen l_aen;
2196			int adapter;
2197
2198			devclass = devclass_find("mfi");
2199			if (devclass == NULL)
2200				return (ENOENT);
2201
2202			error = copyin(arg, &l_aen, sizeof(l_aen));
2203			if (error)
2204				return (error);
2205			adapter = l_aen.laen_adapter_no;
2206			sc = devclass_get_softc(devclass, adapter);
2207			if (sc == NULL)
2208				return (ENOENT);
2209			return (mfi_linux_ioctl_int(sc->mfi_cdev,
2210			    cmd, arg, flag, td));
2211			break;
2212		}
2213#ifdef __amd64__
2214	case MFIIO_PASSTHRU32:
2215		iop_swab.ioc_frame	= iop32->ioc_frame;
2216		iop_swab.buf_size	= iop32->buf_size;
2217		iop_swab.buf		= PTRIN(iop32->buf);
2218		iop			= &iop_swab;
2219		/* FALLTHROUGH */
2220#endif
2221	case MFIIO_PASSTHRU:
2222		error = mfi_user_command(sc, iop);
2223#ifdef __amd64__
2224		if (cmd == MFIIO_PASSTHRU32)
2225			iop32->ioc_frame = iop_swab.ioc_frame;
2226#endif
2227		break;
2228	default:
2229		device_printf(sc->mfi_dev, "IOCTL 0x%lx not handled\n", cmd);
2230		error = ENOENT;
2231		break;
2232	}
2233
2234	return (error);
2235}
2236
2237static int
2238mfi_linux_ioctl_int(struct cdev *dev, u_long cmd, caddr_t arg, int flag, struct thread *td)
2239{
2240	struct mfi_softc *sc;
2241	struct mfi_linux_ioc_packet l_ioc;
2242	struct mfi_linux_ioc_aen l_aen;
2243	struct mfi_command *cm = NULL;
2244	struct mfi_aen *mfi_aen_entry;
2245	union mfi_sense_ptr sense_ptr;
2246	uint32_t context;
2247	uint8_t *data = NULL, *temp;
2248	int i;
2249	int error, locked;
2250
2251	sc = dev->si_drv1;
2252	error = 0;
2253	switch (cmd) {
2254	case MFI_LINUX_CMD_2: /* Firmware Linux ioctl shim */
2255		error = copyin(arg, &l_ioc, sizeof(l_ioc));
2256		if (error != 0)
2257			return (error);
2258
2259		if (l_ioc.lioc_sge_count > MAX_LINUX_IOCTL_SGE) {
2260			return (EINVAL);
2261		}
2262
2263		mtx_lock(&sc->mfi_io_lock);
2264		if ((cm = mfi_dequeue_free(sc)) == NULL) {
2265			mtx_unlock(&sc->mfi_io_lock);
2266			return (EBUSY);
2267		}
2268		mtx_unlock(&sc->mfi_io_lock);
2269		locked = 0;
2270
2271		/*
2272		 * save off original context since copying from user
2273		 * will clobber some data
2274		 */
2275		context = cm->cm_frame->header.context;
2276
2277		bcopy(l_ioc.lioc_frame.raw, cm->cm_frame,
2278		      2 * MFI_DCMD_FRAME_SIZE);	/* this isn't quite right */
2279		cm->cm_total_frame_size = (sizeof(union mfi_sgl)
2280		      * l_ioc.lioc_sge_count) + l_ioc.lioc_sgl_off;
2281		if (l_ioc.lioc_sge_count)
2282			cm->cm_sg =
2283			    (union mfi_sgl *)&cm->cm_frame->bytes[l_ioc.lioc_sgl_off];
2284		cm->cm_flags = 0;
2285		if (cm->cm_frame->header.flags & MFI_FRAME_DATAIN)
2286			cm->cm_flags |= MFI_CMD_DATAIN;
2287		if (cm->cm_frame->header.flags & MFI_FRAME_DATAOUT)
2288			cm->cm_flags |= MFI_CMD_DATAOUT;
2289		cm->cm_len = cm->cm_frame->header.data_len;
2290		if (cm->cm_len &&
2291		      (cm->cm_flags & (MFI_CMD_DATAIN | MFI_CMD_DATAOUT))) {
2292			cm->cm_data = data = malloc(cm->cm_len, M_MFIBUF,
2293			    M_WAITOK | M_ZERO);
2294			if (cm->cm_data == NULL) {
2295				device_printf(sc->mfi_dev, "Malloc failed\n");
2296				goto out;
2297			}
2298		} else {
2299			cm->cm_data = 0;
2300		}
2301
2302		/* restore header context */
2303		cm->cm_frame->header.context = context;
2304
2305		temp = data;
2306		if (cm->cm_flags & MFI_CMD_DATAOUT) {
2307			for (i = 0; i < l_ioc.lioc_sge_count; i++) {
2308				error = copyin(PTRIN(l_ioc.lioc_sgl[i].iov_base),
2309				       temp,
2310				       l_ioc.lioc_sgl[i].iov_len);
2311				if (error != 0) {
2312					device_printf(sc->mfi_dev,
2313					    "Copy in failed\n");
2314					goto out;
2315				}
2316				temp = &temp[l_ioc.lioc_sgl[i].iov_len];
2317			}
2318		}
2319
2320		if (cm->cm_frame->header.cmd == MFI_CMD_DCMD)
2321			locked = mfi_config_lock(sc, cm->cm_frame->dcmd.opcode);
2322
2323		if (cm->cm_frame->header.cmd == MFI_CMD_PD_SCSI_IO) {
2324			cm->cm_frame->pass.sense_addr_lo = cm->cm_sense_busaddr;
2325			cm->cm_frame->pass.sense_addr_hi = 0;
2326		}
2327
2328		mtx_lock(&sc->mfi_io_lock);
2329		error = mfi_check_command_pre(sc, cm);
2330		if (error) {
2331			mtx_unlock(&sc->mfi_io_lock);
2332			goto out;
2333		}
2334
2335		if ((error = mfi_wait_command(sc, cm)) != 0) {
2336			device_printf(sc->mfi_dev,
2337			    "Controller polled failed\n");
2338			mtx_unlock(&sc->mfi_io_lock);
2339			goto out;
2340		}
2341
2342		mfi_check_command_post(sc, cm);
2343		mtx_unlock(&sc->mfi_io_lock);
2344
2345		temp = data;
2346		if (cm->cm_flags & MFI_CMD_DATAIN) {
2347			for (i = 0; i < l_ioc.lioc_sge_count; i++) {
2348				error = copyout(temp,
2349					PTRIN(l_ioc.lioc_sgl[i].iov_base),
2350					l_ioc.lioc_sgl[i].iov_len);
2351				if (error != 0) {
2352					device_printf(sc->mfi_dev,
2353					    "Copy out failed\n");
2354					goto out;
2355				}
2356				temp = &temp[l_ioc.lioc_sgl[i].iov_len];
2357			}
2358		}
2359
2360		if (l_ioc.lioc_sense_len) {
2361			/* get user-space sense ptr then copy out sense */
2362			bcopy(&((struct mfi_linux_ioc_packet*)arg)
2363                            ->lioc_frame.raw[l_ioc.lioc_sense_off],
2364			    &sense_ptr.sense_ptr_data[0],
2365			    sizeof(sense_ptr.sense_ptr_data));
2366#ifdef __amd64__
2367			/*
2368			 * only 32bit Linux support so zero out any
2369			 * address over 32bit
2370			 */
2371			sense_ptr.addr.high = 0;
2372#endif
2373			error = copyout(cm->cm_sense, sense_ptr.user_space,
2374			    l_ioc.lioc_sense_len);
2375			if (error != 0) {
2376				device_printf(sc->mfi_dev,
2377				    "Copy out failed\n");
2378				goto out;
2379			}
2380		}
2381
2382		error = copyout(&cm->cm_frame->header.cmd_status,
2383			&((struct mfi_linux_ioc_packet*)arg)
2384			->lioc_frame.hdr.cmd_status,
2385			1);
2386		if (error != 0) {
2387			device_printf(sc->mfi_dev,
2388				      "Copy out failed\n");
2389			goto out;
2390		}
2391
2392out:
2393		mfi_config_unlock(sc, locked);
2394		if (data)
2395			free(data, M_MFIBUF);
2396		if (cm) {
2397			mtx_lock(&sc->mfi_io_lock);
2398			mfi_release_command(cm);
2399			mtx_unlock(&sc->mfi_io_lock);
2400		}
2401
2402		return (error);
2403	case MFI_LINUX_SET_AEN_2: /* AEN Linux ioctl shim */
2404		error = copyin(arg, &l_aen, sizeof(l_aen));
2405		if (error != 0)
2406			return (error);
2407		printf("AEN IMPLEMENTED for pid %d\n", curproc->p_pid);
2408		mfi_aen_entry = malloc(sizeof(struct mfi_aen), M_MFIBUF,
2409		    M_WAITOK);
2410		mtx_lock(&sc->mfi_io_lock);
2411		if (mfi_aen_entry != NULL) {
2412			mfi_aen_entry->p = curproc;
2413			TAILQ_INSERT_TAIL(&sc->mfi_aen_pids, mfi_aen_entry,
2414			    aen_link);
2415		}
2416		error = mfi_aen_register(sc, l_aen.laen_seq_num,
2417		    l_aen.laen_class_locale);
2418
2419		if (error != 0) {
2420			TAILQ_REMOVE(&sc->mfi_aen_pids, mfi_aen_entry,
2421			    aen_link);
2422			free(mfi_aen_entry, M_MFIBUF);
2423		}
2424		mtx_unlock(&sc->mfi_io_lock);
2425
2426		return (error);
2427	default:
2428		device_printf(sc->mfi_dev, "IOCTL 0x%lx not handled\n", cmd);
2429		error = ENOENT;
2430		break;
2431	}
2432
2433	return (error);
2434}
2435
2436static int
2437mfi_poll(struct cdev *dev, int poll_events, struct thread *td)
2438{
2439	struct mfi_softc *sc;
2440	int revents = 0;
2441
2442	sc = dev->si_drv1;
2443
2444	if (poll_events & (POLLIN | POLLRDNORM)) {
2445		if (sc->mfi_aen_triggered != 0) {
2446			revents |= poll_events & (POLLIN | POLLRDNORM);
2447			sc->mfi_aen_triggered = 0;
2448		}
2449		if (sc->mfi_aen_triggered == 0 && sc->mfi_aen_cm == NULL) {
2450			revents |= POLLERR;
2451		}
2452	}
2453
2454	if (revents == 0) {
2455		if (poll_events & (POLLIN | POLLRDNORM)) {
2456			sc->mfi_poll_waiting = 1;
2457			selrecord(td, &sc->mfi_select);
2458		}
2459	}
2460
2461	return revents;
2462}
2463
2464
2465static void
2466mfi_dump_all(void)
2467{
2468	struct mfi_softc *sc;
2469	struct mfi_command *cm;
2470	devclass_t dc;
2471	time_t deadline;
2472	int timedout;
2473	int i;
2474
2475	dc = devclass_find("mfi");
2476	if (dc == NULL) {
2477		printf("No mfi dev class\n");
2478		return;
2479	}
2480
2481	for (i = 0; ; i++) {
2482		sc = devclass_get_softc(dc, i);
2483		if (sc == NULL)
2484			break;
2485		device_printf(sc->mfi_dev, "Dumping\n\n");
2486		timedout = 0;
2487		deadline = time_uptime - MFI_CMD_TIMEOUT;
2488		mtx_lock(&sc->mfi_io_lock);
2489		TAILQ_FOREACH(cm, &sc->mfi_busy, cm_link) {
2490			if (cm->cm_timestamp < deadline) {
2491				device_printf(sc->mfi_dev,
2492				    "COMMAND %p TIMEOUT AFTER %d SECONDS\n", cm,
2493				    (int)(time_uptime - cm->cm_timestamp));
2494				MFI_PRINT_CMD(cm);
2495				timedout++;
2496			}
2497		}
2498
2499#if 0
2500		if (timedout)
2501			MFI_DUMP_CMDS(SC);
2502#endif
2503
2504		mtx_unlock(&sc->mfi_io_lock);
2505	}
2506
2507	return;
2508}
2509
2510static void
2511mfi_timeout(void *data)
2512{
2513	struct mfi_softc *sc = (struct mfi_softc *)data;
2514	struct mfi_command *cm;
2515	time_t deadline;
2516	int timedout = 0;
2517
2518	deadline = time_uptime - MFI_CMD_TIMEOUT;
2519	mtx_lock(&sc->mfi_io_lock);
2520	TAILQ_FOREACH(cm, &sc->mfi_busy, cm_link) {
2521		if (sc->mfi_aen_cm == cm)
2522			continue;
2523		if ((sc->mfi_aen_cm != cm) && (cm->cm_timestamp < deadline)) {
2524			device_printf(sc->mfi_dev,
2525			    "COMMAND %p TIMEOUT AFTER %d SECONDS\n", cm,
2526			    (int)(time_uptime - cm->cm_timestamp));
2527			MFI_PRINT_CMD(cm);
2528			MFI_VALIDATE_CMD(sc, cm);
2529			timedout++;
2530		}
2531	}
2532
2533#if 0
2534	if (timedout)
2535		MFI_DUMP_CMDS(SC);
2536#endif
2537
2538	mtx_unlock(&sc->mfi_io_lock);
2539
2540	callout_reset(&sc->mfi_watchdog_callout, MFI_CMD_TIMEOUT * hz,
2541	    mfi_timeout, sc);
2542
2543	if (0)
2544		mfi_dump_all();
2545	return;
2546}
2547