xref: /dragonfly/sys/dev/raid/ips/ips.c (revision 25a2db75)
1 /*-
2  * Written by: David Jeffery
3  * Copyright (c) 2002 Adaptec Inc.
4  * All rights reserved.
5  *
6  * Redistribution and use in source and binary forms, with or without
7  * modification, are permitted provided that the following conditions
8  * are met:
9  * 1. Redistributions of source code must retain the above copyright
10  *    notice, this list of conditions and the following disclaimer.
11  * 2. Redistributions in binary form must reproduce the above copyright
12  *    notice, this list of conditions and the following disclaimer in the
13  *    documentation and/or other materials provided with the distribution.
14  *
15  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
16  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
19  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
21  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
25  * SUCH DAMAGE.
26  *
27  * $FreeBSD: src/sys/dev/ips/ips.c,v 1.12 2004/05/30 04:01:29 scottl Exp $
28  */
29 
30 #include <dev/raid/ips/ips.h>
31 #include <sys/stat.h>
32 #include <sys/time.h>
33 #include <sys/thread2.h>
34 #include <sys/udev.h>
35 #include <machine/clock.h>
36 
37 static d_open_t ips_open;
38 static d_close_t ips_close;
39 static d_ioctl_t ips_ioctl;
40 
41 MALLOC_DEFINE(M_IPSBUF, "ipsbuf", "IPS driver buffer");
42 
43 static struct dev_ops ips_ops = {
44 	{ "ips", 0, D_DISK },
45 	.d_open	= 	ips_open,
46 	.d_close =	ips_close,
47 	.d_ioctl =	ips_ioctl,
48 };
49 
50 static const char *ips_adapter_name[] = {
51 	"N/A",
52 	"ServeRAID (copperhead)",
53 	"ServeRAID II (copperhead refresh)",
54 	"ServeRAID onboard (copperhead)",
55 	"ServeRAID onboard (copperhead)",
56 	"ServeRAID 3H (clarinet)",
57 	"ServeRAID 3L (clarinet lite)",
58 	"ServeRAID 4H (trombone)",
59 	"ServeRAID 4M (morpheus)",
60 	"ServeRAID 4L (morpheus lite)",
61 	"ServeRAID 4Mx (neo)",
62 	"ServeRAID 4Lx (neo lite)",
63 	"ServeRAID 5i II (sarasota)",
64 	"ServeRAID 5i (sarasota)",
65 	"ServeRAID 6M (marco)",
66 	"ServeRAID 6i (sebring)",
67 	"ServeRAID 7t",
68 	"ServeRAID 7k",
69 	"ServeRAID 7M",
70 };
71 
72 
73 static int
74 ips_open(struct dev_open_args *ap)
75 {
76 	cdev_t dev = ap->a_head.a_dev;
77 	ips_softc_t *sc = dev->si_drv1;
78 
79 	sc->state |= IPS_DEV_OPEN;
80 	return 0;
81 }
82 
83 static int
84 ips_close(struct dev_close_args *ap)
85 {
86 	cdev_t dev = ap->a_head.a_dev;
87 	ips_softc_t *sc = dev->si_drv1;
88 
89 	sc->state &= ~IPS_DEV_OPEN;
90 	return 0;
91 }
92 
93 static int
94 ips_ioctl(struct dev_ioctl_args *ap)
95 {
96 	ips_softc_t *sc;
97 
98 	sc = ap->a_head.a_dev->si_drv1;
99 	return ips_ioctl_request(sc, ap->a_cmd, ap->a_data, ap->a_fflag);
100 }
101 
102 static void
103 ips_cmd_dmaload(void *cmdptr, bus_dma_segment_t *segments, int segnum,
104     int error)
105 {
106 	ips_command_t *command = cmdptr;
107 
108 	PRINTF(10, "ips: in ips_cmd_dmaload\n");
109 	if (!error)
110 		command->command_phys_addr = segments[0].ds_addr;
111 
112 }
113 
114 /* is locking needed? what locking guarentees are there on removal? */
115 static int
116 ips_cmdqueue_free(ips_softc_t *sc)
117 {
118 	int i, error = -1;
119 	ips_command_t *command;
120 
121 	crit_enter();
122 	if (sc->used_commands == 0) {
123 		for (i = 0; i < sc->max_cmds; i++) {
124 			command = &sc->commandarray[i];
125 			if (command->command_phys_addr == 0)
126 				continue;
127 			bus_dmamap_unload(sc->command_dmatag,
128 			    command->command_dmamap);
129 			bus_dmamem_free(sc->command_dmatag,
130 			    command->command_buffer,
131 			    command->command_dmamap);
132 			if (command->data_dmamap != NULL)
133 				bus_dmamap_destroy(command->data_dmatag,
134 				    command->data_dmamap);
135 		}
136 		error = 0;
137 		sc->state |= IPS_OFFLINE;
138 	}
139 	sc->staticcmd = NULL;
140 	kfree(sc->commandarray, M_IPSBUF);
141 	crit_exit();
142 	return error;
143 }
144 
145 /*
146  * Places all ips command structs on the free command queue.
147  * The first slot is used exclusively for static commands
148  * No locking as if someone else tries to access this during init,
149  * we have bigger problems
150  */
151 static int
152 ips_cmdqueue_init(ips_softc_t *sc)
153 {
154 	int i;
155 	ips_command_t *command;
156 
157 	sc->commandarray = kmalloc(sizeof(sc->commandarray[0]) * sc->max_cmds,
158 	    M_IPSBUF, M_INTWAIT | M_ZERO);
159 	SLIST_INIT(&sc->free_cmd_list);
160 	for (i = 0; i < sc->max_cmds; i++) {
161 		command = &sc->commandarray[i];
162 		command->id = i;
163 		command->sc = sc;
164 		if (bus_dmamem_alloc(sc->command_dmatag,
165 		    &command->command_buffer, BUS_DMA_NOWAIT,
166 		    &command->command_dmamap))
167 			goto error;
168 		bus_dmamap_load(sc->command_dmatag, command->command_dmamap,
169 		    command->command_buffer, IPS_COMMAND_LEN, ips_cmd_dmaload,
170 		    command, BUS_DMA_NOWAIT);
171 		if (command->command_phys_addr == 0) {
172 			bus_dmamem_free(sc->command_dmatag,
173 			    command->command_buffer, command->command_dmamap);
174 			goto error;
175 		}
176 
177 		if (i == 0)
178 			sc->staticcmd = command;
179 		else {
180 			command->data_dmatag = sc->sg_dmatag;
181 			if (bus_dmamap_create(command->data_dmatag, 0,
182 			    &command->data_dmamap))
183 				goto error;
184 			SLIST_INSERT_HEAD(&sc->free_cmd_list, command, next);
185 		}
186 	}
187 	sc->state &= ~IPS_OFFLINE;
188 	return 0;
189 error:
190 	ips_cmdqueue_free(sc);
191 	return ENOMEM;
192 }
193 
194 /*
195  * returns a free command struct if one is available.
196  * It also blanks out anything that may be a wild pointer/value.
197  * Also, command buffers are not freed.  They are
198  * small so they are saved and kept dmamapped and loaded.
199  */
200 int
201 ips_get_free_cmd(ips_softc_t *sc, ips_command_t **cmd, unsigned long flags)
202 {
203 	ips_command_t *command = NULL;
204 	int error = 0;
205 
206 	crit_enter();
207 	if (sc->state & IPS_OFFLINE) {
208 		error = EIO;
209 		goto bail;
210 	}
211 	if ((flags & IPS_STATIC_FLAG) != 0) {
212 		if (sc->state & IPS_STATIC_BUSY) {
213 			error = EAGAIN;
214 			goto bail;
215 		}
216 		command = sc->staticcmd;
217 		sc->state |= IPS_STATIC_BUSY;
218 	} else {
219 		command = SLIST_FIRST(&sc->free_cmd_list);
220 		if (!command || (sc->state & IPS_TIMEOUT)) {
221 			error = EBUSY;
222 			goto bail;
223 		}
224 		SLIST_REMOVE_HEAD(&sc->free_cmd_list, next);
225 		sc->used_commands++;
226 	}
227 bail:
228 	crit_exit();
229 	if (error != 0)
230 		return error;
231 
232 	bzero(&command->status, (char *)(command + 1) - (char *)(&command->status));
233 	bzero(command->command_buffer, IPS_COMMAND_LEN);
234 	*cmd = command;
235 	return 0;
236 }
237 
238 /* adds a command back to the free command queue */
239 void
240 ips_insert_free_cmd(ips_softc_t *sc, ips_command_t *command)
241 {
242 	crit_enter();
243 	if (command == sc->staticcmd)
244 		sc->state &= ~IPS_STATIC_BUSY;
245 	else {
246 		SLIST_INSERT_HEAD(&sc->free_cmd_list, command, next);
247 		sc->used_commands--;
248 	}
249 	crit_exit();
250 }
251 
252 static const char *
253 ips_diskdev_statename(u_int8_t state)
254 {
255 	static char statebuf[20];
256 
257 	switch(state) {
258 	case IPS_LD_OFFLINE:
259 		return("OFFLINE");
260 		break;
261 	case IPS_LD_OKAY:
262 		return("OK");
263 		break;
264 	case IPS_LD_DEGRADED:
265 		return("DEGRADED");
266 		break;
267 	case IPS_LD_FREE:
268 		return("FREE");
269 		break;
270 	case IPS_LD_SYS:
271 		return("SYS");
272 		break;
273 	case IPS_LD_CRS:
274 		return("CRS");
275 		break;
276 	}
277 	ksprintf(statebuf, "UNKNOWN(0x%02x)", state);
278 	return (statebuf);
279 }
280 
281 static int
282 ips_diskdev_init(ips_softc_t *sc)
283 {
284 	int i;
285 
286 	for (i = 0; i < IPS_MAX_NUM_DRIVES; i++) {
287 		if (sc->drives[i].state == IPS_LD_FREE)
288 			continue;
289 		device_printf(sc->dev,
290 		    "Logical Drive %d: RAID%d sectors: %u, state %s\n", i,
291 		    sc->drives[i].raid_lvl, sc->drives[i].sector_count,
292 		    ips_diskdev_statename(sc->drives[i].state));
293 		if (sc->drives[i].state == IPS_LD_OKAY ||
294 		    sc->drives[i].state == IPS_LD_DEGRADED) {
295 			sc->diskdev[i] = device_add_child(sc->dev, NULL, -1);
296 			device_set_ivars(sc->diskdev[i], (void *)(uintptr_t)i);
297 		}
298 	}
299 	if (bus_generic_attach(sc->dev))
300 		device_printf(sc->dev, "Attaching bus failed\n");
301 	return 0;
302 }
303 
304 static int
305 ips_diskdev_free(ips_softc_t *sc)
306 {
307 	int i;
308 	int error = 0;
309 
310 	for (i = 0; i < IPS_MAX_NUM_DRIVES; i++) {
311 		if (sc->diskdev[i] != NULL) {
312 			error = device_delete_child(sc->dev, sc->diskdev[i]);
313 			if (error)
314 				return error;
315 		}
316 	}
317 	bus_generic_detach(sc->dev);
318 	return 0;
319 }
320 
321 /*
322  * ips_timeout is periodically called to make sure no commands sent
323  * to the card have become stuck.  If it finds a stuck command, it
324  * sets a flag so the driver won't start any more commands and then
325  * is periodically called to see if all outstanding commands have
326  * either finished or timed out.  Once timed out, an attempt to
327  * reinitialize the card is made.  If that fails, the driver gives
328  * up and declares the card dead.
329  */
330 static void
331 ips_timeout(void *arg)
332 {
333 	ips_command_t *command;
334 	ips_softc_t *sc = arg;
335 	int i, state = 0;
336 
337 	lockmgr(&sc->queue_lock, LK_EXCLUSIVE|LK_RETRY);
338 	command = &sc->commandarray[0];
339 	for (i = 0; i < sc->max_cmds; i++) {
340 		if (!command[i].timeout)
341 			continue;
342 		command[i].timeout--;
343 		if (command[i].timeout == 0) {
344 			if (!(sc->state & IPS_TIMEOUT)) {
345 				sc->state |= IPS_TIMEOUT;
346 				device_printf(sc->dev, "WARNING: command timeout. Adapter is in toaster mode, resetting to known state\n");
347 			}
348 			command[i].status.value = IPS_ERROR_STATUS;
349 			command[i].callback(&command[i]);
350 			/* hmm, this should be enough cleanup */
351 		} else
352 			state = 1;
353 	}
354 	if (!state && (sc->state & IPS_TIMEOUT)) {
355 		if (sc->ips_adapter_reinit(sc, 1)) {
356 			device_printf(sc->dev, "AIEE! adapter reset failed, "
357 			    "giving up and going home! Have a nice day.\n");
358 			sc->state |= IPS_OFFLINE;
359 			sc->state &= ~IPS_TIMEOUT;
360 			/*
361 			 * Grr, I hate this solution. I run waiting commands
362 			 * one at a time and error them out just before they
363 			 * would go to the card. This sucks.
364 			 */
365 		} else
366 			sc->state &= ~IPS_TIMEOUT;
367 	}
368 	if (sc->state != IPS_OFFLINE)
369 		callout_reset(&sc->timer, 10 * hz, ips_timeout, sc);
370 	lockmgr(&sc->queue_lock, LK_RELEASE);
371 }
372 
373 /* check card and initialize it */
374 int
375 ips_adapter_init(ips_softc_t *sc)
376 {
377 	int i;
378 	cdev_t dev;
379 
380 	DEVICE_PRINTF(1, sc->dev, "initializing\n");
381 	if (bus_dma_tag_create(	/* parent    */	sc->adapter_dmatag,
382 				/* alignemnt */	1,
383 				/* boundary  */	0,
384 				/* lowaddr   */	BUS_SPACE_MAXADDR_32BIT,
385 				/* highaddr  */	BUS_SPACE_MAXADDR,
386 				/* filter    */	NULL,
387 				/* filterarg */	NULL,
388 				/* maxsize   */	IPS_COMMAND_LEN +
389 						    IPS_MAX_SG_LEN,
390 				/* numsegs   */	1,
391 				/* maxsegsize*/	IPS_COMMAND_LEN +
392 						    IPS_MAX_SG_LEN,
393 				/* flags     */	0,
394 				&sc->command_dmatag) != 0) {
395 		device_printf(sc->dev, "can't alloc command dma tag\n");
396 		goto error;
397 	}
398 	if (bus_dma_tag_create(	/* parent    */	sc->adapter_dmatag,
399 				/* alignemnt */	1,
400 				/* boundary  */	0,
401 				/* lowaddr   */	BUS_SPACE_MAXADDR_32BIT,
402 				/* highaddr  */	BUS_SPACE_MAXADDR,
403 				/* filter    */	NULL,
404 				/* filterarg */	NULL,
405 				/* maxsize   */	IPS_MAX_IOBUF_SIZE,
406 				/* numsegs   */	IPS_MAX_SG_ELEMENTS,
407 				/* maxsegsize*/	IPS_MAX_IOBUF_SIZE,
408 				/* flags     */	0,
409 				&sc->sg_dmatag) != 0) {
410 		device_printf(sc->dev, "can't alloc SG dma tag\n");
411 		goto error;
412 	}
413 	/*
414 	 * create one command buffer until we know how many commands this card
415 	 * can handle
416 	 */
417 	sc->max_cmds = 1;
418 	ips_cmdqueue_init(sc);
419 	callout_init(&sc->timer);
420 	if (sc->ips_adapter_reinit(sc, 0))
421 		goto error;
422 	/* initialize ffdc values */
423 	microtime(&sc->ffdc_resettime);
424 	sc->ffdc_resetcount = 1;
425 	if ((i = ips_ffdc_reset(sc)) != 0) {
426 		device_printf(sc->dev,
427 		    "failed to send ffdc reset to device (%d)\n", i);
428 		goto error;
429 	}
430 	if ((i = ips_get_adapter_info(sc)) != 0) {
431 		device_printf(sc->dev, "failed to get adapter configuration "
432 		    "data from device (%d)\n", i);
433 		goto error;
434 	}
435 	/* no error check as failure doesn't matter */
436 	ips_update_nvram(sc);
437 	if (sc->adapter_type > 0 && sc->adapter_type <= IPS_ADAPTER_MAX_T) {
438 		device_printf(sc->dev, "adapter type: %s\n",
439 		    ips_adapter_name[sc->adapter_type]);
440 	}
441 	if ((i = ips_get_drive_info(sc)) != 0) {
442 		device_printf(sc->dev, "failed to get drive "
443 		    "configuration data from device (%d)\n", i);
444 		goto error;
445 	}
446 	ips_cmdqueue_free(sc);
447 	if (sc->adapter_info.max_concurrent_cmds)
448 		sc->max_cmds = min(128, sc->adapter_info.max_concurrent_cmds);
449 	else
450 		sc->max_cmds = 32;
451 	if (ips_cmdqueue_init(sc)) {
452 		device_printf(sc->dev,
453 		    "failed to initialize command buffers\n");
454 		goto error;
455 	}
456 	dev = make_dev(&ips_ops, device_get_unit(sc->dev),
457 		       UID_ROOT, GID_OPERATOR, S_IRUSR | S_IWUSR,
458 		       "ips%d", device_get_unit(sc->dev));
459 	dev->si_drv1 = sc;
460 	udev_dict_set_cstr(dev, "subsystem", "raid");
461 	udev_dict_set_cstr(dev, "disk-type", "raid");
462 	ips_diskdev_init(sc);
463 	callout_reset(&sc->timer, 10 * hz, ips_timeout, sc);
464 	return 0;
465 error:
466 	ips_adapter_free(sc);
467 	return ENXIO;
468 }
469 
470 /*
471  * see if we should reinitialize the card and wait for it to timeout
472  * or complete initialization
473  */
474 int
475 ips_morpheus_reinit(ips_softc_t *sc, int force)
476 {
477 	u_int32_t tmp;
478 	int i;
479 
480 	tmp = ips_read_4(sc, MORPHEUS_REG_OISR);
481 	if (!force && (ips_read_4(sc, MORPHEUS_REG_OMR0) >= IPS_POST1_OK) &&
482 	    (ips_read_4(sc, MORPHEUS_REG_OMR1) != 0xdeadbeef) && !tmp) {
483 		ips_write_4(sc, MORPHEUS_REG_OIMR, 0);
484 		return 0;
485 	}
486 	ips_write_4(sc, MORPHEUS_REG_OIMR, 0xff);
487 	ips_read_4(sc, MORPHEUS_REG_OIMR);
488 	device_printf(sc->dev,
489 	    "resetting adapter, this may take up to 5 minutes\n");
490 	ips_write_4(sc, MORPHEUS_REG_IDR, 0x80000000);
491 	DELAY(5000000);
492 	pci_read_config(sc->dev, 0, 4);
493 	tmp = ips_read_4(sc, MORPHEUS_REG_OISR);
494 	for (i = 0; i < 45 && !(tmp & MORPHEUS_BIT_POST1); i++) {
495 		DELAY(1000000);
496 		DEVICE_PRINTF(2, sc->dev, "post1: %d\n", i);
497 		tmp = ips_read_4(sc, MORPHEUS_REG_OISR);
498 	}
499 	if (tmp & MORPHEUS_BIT_POST1)
500 		ips_write_4(sc, MORPHEUS_REG_OISR, MORPHEUS_BIT_POST1);
501 
502 	if (i == 45 || ips_read_4(sc, MORPHEUS_REG_OMR0) < IPS_POST1_OK) {
503 		device_printf(sc->dev,
504 		    "Adapter error during initialization.\n");
505 		return 1;
506 	}
507 	for (i = 0; i < 240 && !(tmp & MORPHEUS_BIT_POST2); i++) {
508 		DELAY(1000000);
509 		DEVICE_PRINTF(2, sc->dev, "post2: %d\n", i);
510 		tmp = ips_read_4(sc, MORPHEUS_REG_OISR);
511 	}
512 	if (tmp & MORPHEUS_BIT_POST2)
513 		ips_write_4(sc, MORPHEUS_REG_OISR, MORPHEUS_BIT_POST2);
514 
515 	if (i == 240 || !ips_read_4(sc, MORPHEUS_REG_OMR1)) {
516 		device_printf(sc->dev, "adapter failed config check\n");
517 		return 1;
518 	}
519 	ips_write_4(sc, MORPHEUS_REG_OIMR, 0);
520 	if (force && ips_clear_adapter(sc)) {
521 		device_printf(sc->dev, "adapter clear failed\n");
522 		return 1;
523 	}
524 	return 0;
525 }
526 
527 /* clean up so we can unload the driver. */
528 int
529 ips_adapter_free(ips_softc_t *sc)
530 {
531 	int error = 0;
532 
533 	if (sc->state & IPS_DEV_OPEN)
534 		return EBUSY;
535 	if ((error = ips_diskdev_free(sc)))
536 		return error;
537 	if (ips_cmdqueue_free(sc)) {
538 		device_printf(sc->dev,
539 		    "trying to exit when command queue is not empty!\n");
540 		return EBUSY;
541 	}
542 	DEVICE_PRINTF(1, sc->dev, "free\n");
543 	crit_enter();
544 	callout_stop(&sc->timer);
545 	crit_exit();
546 	if (sc->sg_dmatag)
547 		bus_dma_tag_destroy(sc->sg_dmatag);
548 	if (sc->command_dmatag)
549 		bus_dma_tag_destroy(sc->command_dmatag);
550 	dev_ops_remove_minor(&ips_ops, device_get_unit(sc->dev));
551 	return 0;
552 }
553 
554 static int
555 ips_morpheus_check_intr(void *void_sc)
556 {
557 	ips_softc_t *sc = (ips_softc_t *)void_sc;
558 	u_int32_t oisr, iisr;
559 	ips_cmd_status_t status;
560 	ips_command_t *command;
561 	int cmdnumber;
562 	int found = 0;
563 
564 	iisr =ips_read_4(sc, MORPHEUS_REG_IISR);
565 	oisr =ips_read_4(sc, MORPHEUS_REG_OISR);
566 	PRINTF(9, "interrupt registers in:%x out:%x\n", iisr, oisr);
567 	if (!(oisr & MORPHEUS_BIT_CMD_IRQ)) {
568 		DEVICE_PRINTF(2, sc->dev, "got a non-command irq\n");
569 		return(0);
570 	}
571 	while ((status.value = ips_read_4(sc, MORPHEUS_REG_OQPR))
572 	       != 0xffffffff) {
573 		cmdnumber = status.fields.command_id;
574 		command = &sc->commandarray[cmdnumber];
575 		command->status.value = status.value;
576 		command->timeout = 0;
577 		command->callback(command);
578 		DEVICE_PRINTF(9, sc->dev, "got command %d\n", cmdnumber);
579 		found = 1;
580 	}
581 	return(found);
582 }
583 
584 void
585 ips_morpheus_intr(void *void_sc)
586 {
587 	ips_softc_t *sc = void_sc;
588 
589 	lockmgr(&sc->queue_lock, LK_EXCLUSIVE|LK_RETRY);
590 	ips_morpheus_check_intr(sc);
591 	lockmgr(&sc->queue_lock, LK_RELEASE);
592 }
593 
594 void
595 ips_issue_morpheus_cmd(ips_command_t *command)
596 {
597 	crit_enter();
598 	/* hmmm, is there a cleaner way to do this? */
599 	if (command->sc->state & IPS_OFFLINE) {
600 		crit_exit();
601 		command->status.value = IPS_ERROR_STATUS;
602 		command->callback(command);
603 		return;
604 	}
605 	command->timeout = 10;
606 	ips_write_4(command->sc, MORPHEUS_REG_IQPR, command->command_phys_addr);
607 	crit_exit();
608 }
609 
610 void
611 ips_morpheus_poll(ips_command_t *command)
612 {
613 	uint32_t ts;
614 
615 	ts = time_second + command->timeout;
616 	while (command->timeout != 0 &&
617 	    ips_morpheus_check_intr(command->sc) == 0 &&
618 	    (ts > time_second))
619 		DELAY(1000);
620  }
621 
622 static void
623 ips_copperhead_queue_callback(void *queueptr, bus_dma_segment_t *segments,
624 			      int segnum, int error)
625 {
626 	ips_copper_queue_t *queue = queueptr;
627 
628 	if (error)
629 		return;
630 	queue->base_phys_addr = segments[0].ds_addr;
631 }
632 
633 static int
634 ips_copperhead_queue_init(ips_softc_t *sc)
635 {
636 	bus_dma_tag_t dmatag;
637 	bus_dmamap_t dmamap;
638 	int error;
639 
640 	if (bus_dma_tag_create(	/* parent    */	sc->adapter_dmatag,
641 				/* alignemnt */	1,
642 				/* boundary  */	0,
643 				/* lowaddr   */	BUS_SPACE_MAXADDR_32BIT,
644 				/* highaddr  */	BUS_SPACE_MAXADDR,
645 				/* filter    */	NULL,
646 				/* filterarg */	NULL,
647 				/* maxsize   */	sizeof(ips_copper_queue_t),
648 				/* numsegs   */	1,
649 				/* maxsegsize*/	sizeof(ips_copper_queue_t),
650 				/* flags     */	0,
651 				&dmatag) != 0) {
652 		device_printf(sc->dev, "can't alloc dma tag for statue queue\n");
653 		error = ENOMEM;
654 		goto exit;
655 	}
656 	if (bus_dmamem_alloc(dmatag, (void *)&(sc->copper_queue),
657 	    BUS_DMA_NOWAIT, &dmamap)) {
658 		error = ENOMEM;
659 		goto exit;
660 	}
661 	bzero(sc->copper_queue, sizeof(ips_copper_queue_t));
662 	sc->copper_queue->dmatag = dmatag;
663 	sc->copper_queue->dmamap = dmamap;
664 	sc->copper_queue->nextstatus = 1;
665 	bus_dmamap_load(dmatag, dmamap, &(sc->copper_queue->status[0]),
666 	    IPS_MAX_CMD_NUM * 4, ips_copperhead_queue_callback,
667 	    sc->copper_queue, BUS_DMA_NOWAIT);
668 	if (sc->copper_queue->base_phys_addr == 0) {
669 		error = ENOMEM;
670 		goto exit;
671 	}
672 	ips_write_4(sc, COPPER_REG_SQSR, sc->copper_queue->base_phys_addr);
673 	ips_write_4(sc, COPPER_REG_SQER, sc->copper_queue->base_phys_addr +
674 	    IPS_MAX_CMD_NUM * 4);
675 	ips_write_4(sc, COPPER_REG_SQHR, sc->copper_queue->base_phys_addr + 4);
676 	ips_write_4(sc, COPPER_REG_SQTR, sc->copper_queue->base_phys_addr);
677 	return 0;
678 exit:
679 	bus_dmamem_free(dmatag, sc->copper_queue, dmamap);
680 	bus_dma_tag_destroy(dmatag);
681 	return error;
682 }
683 
684 /*
685  * see if we should reinitialize the card and wait for it to timeout or
686  * complete initialization FIXME
687  */
688 int
689 ips_copperhead_reinit(ips_softc_t *sc, int force)
690 {
691 	u_int32_t postcode = 0, configstatus = 0;
692 	int	  i, j;
693 
694 	ips_write_1(sc, COPPER_REG_SCPR, 0x80);
695 	ips_write_1(sc, COPPER_REG_SCPR, 0);
696 	device_printf(sc->dev,
697 	    "reinitializing adapter, this could take several minutes.\n");
698 	for (j = 0; j < 2; j++) {
699 		postcode <<= 8;
700 		for (i = 0; i < 45; i++) {
701 			if (ips_read_1(sc, COPPER_REG_HISR) & COPPER_GHI_BIT) {
702 				postcode |= ips_read_1(sc, COPPER_REG_ISPR);
703 				ips_write_1(sc, COPPER_REG_HISR,
704 				    COPPER_GHI_BIT);
705 				break;
706 			} else
707 				DELAY(1000000);
708 		}
709 		if (i == 45)
710 			return 1;
711 	}
712 	for (j = 0; j < 2; j++) {
713 		configstatus <<= 8;
714 		for (i = 0; i < 240; i++) {
715 			if (ips_read_1(sc, COPPER_REG_HISR) & COPPER_GHI_BIT) {
716 				configstatus |= ips_read_1(sc, COPPER_REG_ISPR);
717 				ips_write_1(sc, COPPER_REG_HISR,
718 				    COPPER_GHI_BIT);
719 				break;
720 			} else
721 				DELAY(1000000);
722 		}
723 		if (i == 240)
724 			return 1;
725 	}
726 	for (i = 0; i < 240; i++) {
727 		if (!(ips_read_1(sc, COPPER_REG_CBSP) & COPPER_OP_BIT))
728 			break;
729 		else
730 			DELAY(1000000);
731 	}
732 	if (i == 240)
733 		return 1;
734 	ips_write_2(sc, COPPER_REG_CCCR, 0x1000 | COPPER_ILE_BIT);
735 	ips_write_1(sc, COPPER_REG_SCPR, COPPER_EBM_BIT);
736 	ips_copperhead_queue_init(sc);
737 	ips_write_1(sc, COPPER_REG_HISR, COPPER_GHI_BIT);
738 	i = ips_read_1(sc, COPPER_REG_SCPR);
739 	ips_write_1(sc, COPPER_REG_HISR, COPPER_EI_BIT);
740 	if (configstatus == 0) {
741 		device_printf(sc->dev, "adapter initialization failed\n");
742 		return 1;
743 	}
744 	if (force && ips_clear_adapter(sc)) {
745 		device_printf(sc->dev, "adapter clear failed\n");
746 		return 1;
747 	}
748 	return 0;
749 }
750 
751 static u_int32_t
752 ips_copperhead_cmd_status(ips_softc_t *sc)
753 {
754 	u_int32_t value;
755 	int statnum;
756 
757 	statnum = sc->copper_queue->nextstatus++;
758 	if (sc->copper_queue->nextstatus == IPS_MAX_CMD_NUM)
759 		sc->copper_queue->nextstatus = 0;
760 	crit_enter();
761 	value = sc->copper_queue->status[statnum];
762 	ips_write_4(sc, COPPER_REG_SQTR, sc->copper_queue->base_phys_addr +
763 	    4 * statnum);
764 	crit_exit();
765 	return value;
766 }
767 
768 void
769 ips_copperhead_intr(void *void_sc)
770 {
771 	ips_softc_t *sc = (ips_softc_t *)void_sc;
772 	ips_cmd_status_t status;
773 	int cmdnumber;
774 
775 	lockmgr(&sc->queue_lock, LK_EXCLUSIVE|LK_RETRY);
776 	while (ips_read_1(sc, COPPER_REG_HISR) & COPPER_SCE_BIT) {
777 		status.value = ips_copperhead_cmd_status(sc);
778 		cmdnumber = status.fields.command_id;
779 		sc->commandarray[cmdnumber].status.value = status.value;
780 		sc->commandarray[cmdnumber].timeout = 0;
781 		sc->commandarray[cmdnumber].callback(&(sc->commandarray[cmdnumber]));
782 		PRINTF(9, "ips: got command %d\n", cmdnumber);
783 	}
784 	lockmgr(&sc->queue_lock, LK_RELEASE);
785 	return;
786 }
787 
788 void
789 ips_issue_copperhead_cmd(ips_command_t *command)
790 {
791 	int i;
792 
793 	crit_enter();
794 	/* hmmm, is there a cleaner way to do this? */
795 	if (command->sc->state & IPS_OFFLINE) {
796 		crit_exit();
797 		command->status.value = IPS_ERROR_STATUS;
798 		command->callback(command);
799 		return;
800 	}
801 	command->timeout = 10;
802 	for (i = 0; ips_read_4(command->sc, COPPER_REG_CCCR) & COPPER_SEM_BIT;
803 	    i++) {
804 		if (i == 20) {
805 			kprintf("sem bit still set, can't send a command\n");
806 			crit_exit();
807 			return;
808 		}
809 		DELAY(500);	/* need to do a delay here */
810 	}
811 	ips_write_4(command->sc, COPPER_REG_CCSAR, command->command_phys_addr);
812 	ips_write_2(command->sc, COPPER_REG_CCCR, COPPER_CMD_START);
813 	crit_exit();
814 }
815 
816 void
817 ips_copperhead_poll(ips_command_t *command)
818 {
819 	kprintf("ips: cmd polling not implemented for copperhead devices\n");
820 }
821