xref: /openbmc/linux/drivers/scsi/aha1542.c (revision 02b4e275)
1 /*
2  *  Driver for Adaptec AHA-1542 SCSI host adapters
3  *
4  *  Copyright (C) 1992  Tommy Thorn
5  *  Copyright (C) 1993, 1994, 1995 Eric Youngdale
6  *  Copyright (C) 2015 Ondrej Zary
7  */
8 
9 #include <linux/module.h>
10 #include <linux/interrupt.h>
11 #include <linux/kernel.h>
12 #include <linux/types.h>
13 #include <linux/string.h>
14 #include <linux/delay.h>
15 #include <linux/init.h>
16 #include <linux/spinlock.h>
17 #include <linux/isa.h>
18 #include <linux/pnp.h>
19 #include <linux/slab.h>
20 #include <linux/io.h>
21 #include <asm/dma.h>
22 #include <scsi/scsi_cmnd.h>
23 #include <scsi/scsi_device.h>
24 #include <scsi/scsi_host.h>
25 #include "aha1542.h"
26 
27 #define MAXBOARDS 4
28 
29 static bool isapnp = 1;
30 module_param(isapnp, bool, 0);
31 MODULE_PARM_DESC(isapnp, "enable PnP support (default=1)");
32 
33 static int io[MAXBOARDS] = { 0x330, 0x334, 0, 0 };
34 module_param_array(io, int, NULL, 0);
35 MODULE_PARM_DESC(io, "base IO address of controller (0x130,0x134,0x230,0x234,0x330,0x334, default=0x330,0x334)");
36 
37 /* time AHA spends on the AT-bus during data transfer */
38 static int bus_on[MAXBOARDS] = { -1, -1, -1, -1 }; /* power-on default: 11us */
39 module_param_array(bus_on, int, NULL, 0);
40 MODULE_PARM_DESC(bus_on, "bus on time [us] (2-15, default=-1 [HW default: 11])");
41 
42 /* time AHA spends off the bus (not to monopolize it) during data transfer  */
43 static int bus_off[MAXBOARDS] = { -1, -1, -1, -1 }; /* power-on default: 4us */
44 module_param_array(bus_off, int, NULL, 0);
45 MODULE_PARM_DESC(bus_off, "bus off time [us] (1-64, default=-1 [HW default: 4])");
46 
47 /* default is jumper selected (J1 on 1542A), factory default = 5 MB/s */
48 static int dma_speed[MAXBOARDS] = { -1, -1, -1, -1 };
49 module_param_array(dma_speed, int, NULL, 0);
50 MODULE_PARM_DESC(dma_speed, "DMA speed [MB/s] (5,6,7,8,10, default=-1 [by jumper])");
51 
52 #define BIOS_TRANSLATION_6432 1	/* Default case these days */
53 #define BIOS_TRANSLATION_25563 2	/* Big disk case */
54 
55 struct aha1542_hostdata {
56 	/* This will effectively start both of them at the first mailbox */
57 	int bios_translation;	/* Mapping bios uses - for compatibility */
58 	int aha1542_last_mbi_used;
59 	int aha1542_last_mbo_used;
60 	struct scsi_cmnd *int_cmds[AHA1542_MAILBOXES];
61 	struct mailbox mb[2 * AHA1542_MAILBOXES];
62 	struct ccb ccb[AHA1542_MAILBOXES];
63 };
64 
65 static inline void aha1542_intr_reset(u16 base)
66 {
67 	outb(IRST, CONTROL(base));
68 }
69 
70 static inline bool wait_mask(u16 port, u8 mask, u8 allof, u8 noneof, int timeout)
71 {
72 	bool delayed = true;
73 
74 	if (timeout == 0) {
75 		timeout = 3000000;
76 		delayed = false;
77 	}
78 
79 	while (1) {
80 		u8 bits = inb(port) & mask;
81 		if ((bits & allof) == allof && ((bits & noneof) == 0))
82 			break;
83 		if (delayed)
84 			mdelay(1);
85 		if (--timeout == 0)
86 			return false;
87 	}
88 
89 	return true;
90 }
91 
92 static int aha1542_outb(unsigned int base, u8 val)
93 {
94 	if (!wait_mask(STATUS(base), CDF, 0, CDF, 0))
95 		return 1;
96 	outb(val, DATA(base));
97 
98 	return 0;
99 }
100 
101 static int aha1542_out(unsigned int base, u8 *buf, int len)
102 {
103 	while (len--) {
104 		if (!wait_mask(STATUS(base), CDF, 0, CDF, 0))
105 			return 1;
106 		outb(*buf++, DATA(base));
107 	}
108 	if (!wait_mask(INTRFLAGS(base), INTRMASK, HACC, 0, 0))
109 		return 1;
110 
111 	return 0;
112 }
113 
114 /* Only used at boot time, so we do not need to worry about latency as much
115    here */
116 
117 static int aha1542_in(unsigned int base, u8 *buf, int len, int timeout)
118 {
119 	while (len--) {
120 		if (!wait_mask(STATUS(base), DF, DF, 0, timeout))
121 			return 1;
122 		*buf++ = inb(DATA(base));
123 	}
124 	return 0;
125 }
126 
127 static int makecode(unsigned hosterr, unsigned scsierr)
128 {
129 	switch (hosterr) {
130 	case 0x0:
131 	case 0xa:		/* Linked command complete without error and linked normally */
132 	case 0xb:		/* Linked command complete without error, interrupt generated */
133 		hosterr = 0;
134 		break;
135 
136 	case 0x11:		/* Selection time out-The initiator selection or target
137 				   reselection was not complete within the SCSI Time out period */
138 		hosterr = DID_TIME_OUT;
139 		break;
140 
141 	case 0x12:		/* Data overrun/underrun-The target attempted to transfer more data
142 				   than was allocated by the Data Length field or the sum of the
143 				   Scatter / Gather Data Length fields. */
144 
145 	case 0x13:		/* Unexpected bus free-The target dropped the SCSI BSY at an unexpected time. */
146 
147 	case 0x15:		/* MBO command was not 00, 01 or 02-The first byte of the CB was
148 				   invalid. This usually indicates a software failure. */
149 
150 	case 0x16:		/* Invalid CCB Operation Code-The first byte of the CCB was invalid.
151 				   This usually indicates a software failure. */
152 
153 	case 0x17:		/* Linked CCB does not have the same LUN-A subsequent CCB of a set
154 				   of linked CCB's does not specify the same logical unit number as
155 				   the first. */
156 	case 0x18:		/* Invalid Target Direction received from Host-The direction of a
157 				   Target Mode CCB was invalid. */
158 
159 	case 0x19:		/* Duplicate CCB Received in Target Mode-More than once CCB was
160 				   received to service data transfer between the same target LUN
161 				   and initiator SCSI ID in the same direction. */
162 
163 	case 0x1a:		/* Invalid CCB or Segment List Parameter-A segment list with a zero
164 				   length segment or invalid segment list boundaries was received.
165 				   A CCB parameter was invalid. */
166 #ifdef DEBUG
167 		printk("Aha1542: %x %x\n", hosterr, scsierr);
168 #endif
169 		hosterr = DID_ERROR;	/* Couldn't find any better */
170 		break;
171 
172 	case 0x14:		/* Target bus phase sequence failure-An invalid bus phase or bus
173 				   phase sequence was requested by the target. The host adapter
174 				   will generate a SCSI Reset Condition, notifying the host with
175 				   a SCRD interrupt */
176 		hosterr = DID_RESET;
177 		break;
178 	default:
179 		printk(KERN_ERR "aha1542: makecode: unknown hoststatus %x\n", hosterr);
180 		break;
181 	}
182 	return scsierr | (hosterr << 16);
183 }
184 
185 static int aha1542_test_port(struct Scsi_Host *sh)
186 {
187 	u8 inquiry_result[4];
188 	int i;
189 
190 	/* Quick and dirty test for presence of the card. */
191 	if (inb(STATUS(sh->io_port)) == 0xff)
192 		return 0;
193 
194 	/* Reset the adapter. I ought to make a hard reset, but it's not really necessary */
195 
196 	/* In case some other card was probing here, reset interrupts */
197 	aha1542_intr_reset(sh->io_port);	/* reset interrupts, so they don't block */
198 
199 	outb(SRST | IRST /*|SCRST */ , CONTROL(sh->io_port));
200 
201 	mdelay(20);		/* Wait a little bit for things to settle down. */
202 
203 	/* Expect INIT and IDLE, any of the others are bad */
204 	if (!wait_mask(STATUS(sh->io_port), STATMASK, INIT | IDLE, STST | DIAGF | INVDCMD | DF | CDF, 0))
205 		return 0;
206 
207 	/* Shouldn't have generated any interrupts during reset */
208 	if (inb(INTRFLAGS(sh->io_port)) & INTRMASK)
209 		return 0;
210 
211 	/* Perform a host adapter inquiry instead so we do not need to set
212 	   up the mailboxes ahead of time */
213 
214 	aha1542_outb(sh->io_port, CMD_INQUIRY);
215 
216 	for (i = 0; i < 4; i++) {
217 		if (!wait_mask(STATUS(sh->io_port), DF, DF, 0, 0))
218 			return 0;
219 		inquiry_result[i] = inb(DATA(sh->io_port));
220 	}
221 
222 	/* Reading port should reset DF */
223 	if (inb(STATUS(sh->io_port)) & DF)
224 		return 0;
225 
226 	/* When HACC, command is completed, and we're though testing */
227 	if (!wait_mask(INTRFLAGS(sh->io_port), HACC, HACC, 0, 0))
228 		return 0;
229 
230 	/* Clear interrupts */
231 	outb(IRST, CONTROL(sh->io_port));
232 
233 	return 1;
234 }
235 
236 static irqreturn_t aha1542_interrupt(int irq, void *dev_id)
237 {
238 	struct Scsi_Host *sh = dev_id;
239 	struct aha1542_hostdata *aha1542 = shost_priv(sh);
240 	void (*my_done)(struct scsi_cmnd *) = NULL;
241 	int errstatus, mbi, mbo, mbistatus;
242 	int number_serviced;
243 	unsigned long flags;
244 	struct scsi_cmnd *tmp_cmd;
245 	int flag;
246 	struct mailbox *mb = aha1542->mb;
247 	struct ccb *ccb = aha1542->ccb;
248 
249 #ifdef DEBUG
250 	{
251 		flag = inb(INTRFLAGS(sh->io_port));
252 		shost_printk(KERN_DEBUG, sh, "aha1542_intr_handle: ");
253 		if (!(flag & ANYINTR))
254 			printk("no interrupt?");
255 		if (flag & MBIF)
256 			printk("MBIF ");
257 		if (flag & MBOA)
258 			printk("MBOF ");
259 		if (flag & HACC)
260 			printk("HACC ");
261 		if (flag & SCRD)
262 			printk("SCRD ");
263 		printk("status %02x\n", inb(STATUS(sh->io_port)));
264 	};
265 #endif
266 	number_serviced = 0;
267 
268 	spin_lock_irqsave(sh->host_lock, flags);
269 	while (1) {
270 		flag = inb(INTRFLAGS(sh->io_port));
271 
272 		/* Check for unusual interrupts.  If any of these happen, we should
273 		   probably do something special, but for now just printing a message
274 		   is sufficient.  A SCSI reset detected is something that we really
275 		   need to deal with in some way. */
276 		if (flag & ~MBIF) {
277 			if (flag & MBOA)
278 				printk("MBOF ");
279 			if (flag & HACC)
280 				printk("HACC ");
281 			if (flag & SCRD)
282 				printk("SCRD ");
283 		}
284 		aha1542_intr_reset(sh->io_port);
285 
286 		mbi = aha1542->aha1542_last_mbi_used + 1;
287 		if (mbi >= 2 * AHA1542_MAILBOXES)
288 			mbi = AHA1542_MAILBOXES;
289 
290 		do {
291 			if (mb[mbi].status != 0)
292 				break;
293 			mbi++;
294 			if (mbi >= 2 * AHA1542_MAILBOXES)
295 				mbi = AHA1542_MAILBOXES;
296 		} while (mbi != aha1542->aha1542_last_mbi_used);
297 
298 		if (mb[mbi].status == 0) {
299 			spin_unlock_irqrestore(sh->host_lock, flags);
300 			/* Hmm, no mail.  Must have read it the last time around */
301 			if (!number_serviced)
302 				shost_printk(KERN_WARNING, sh, "interrupt received, but no mail.\n");
303 			return IRQ_HANDLED;
304 		};
305 
306 		mbo = (scsi2int(mb[mbi].ccbptr) - (isa_virt_to_bus(&ccb[0]))) / sizeof(struct ccb);
307 		mbistatus = mb[mbi].status;
308 		mb[mbi].status = 0;
309 		aha1542->aha1542_last_mbi_used = mbi;
310 
311 #ifdef DEBUG
312 		if (ccb[mbo].tarstat | ccb[mbo].hastat)
313 			shost_printk(KERN_DEBUG, sh, "aha1542_command: returning %x (status %d)\n",
314 			       ccb[mbo].tarstat + ((int) ccb[mbo].hastat << 16), mb[mbi].status);
315 #endif
316 
317 		if (mbistatus == 3)
318 			continue;	/* Aborted command not found */
319 
320 #ifdef DEBUG
321 		shost_printk(KERN_DEBUG, sh, "...done %d %d\n", mbo, mbi);
322 #endif
323 
324 		tmp_cmd = aha1542->int_cmds[mbo];
325 
326 		if (!tmp_cmd || !tmp_cmd->scsi_done) {
327 			spin_unlock_irqrestore(sh->host_lock, flags);
328 			shost_printk(KERN_WARNING, sh, "Unexpected interrupt\n");
329 			shost_printk(KERN_WARNING, sh, "tarstat=%x, hastat=%x idlun=%x ccb#=%d\n", ccb[mbo].tarstat,
330 			       ccb[mbo].hastat, ccb[mbo].idlun, mbo);
331 			return IRQ_HANDLED;
332 		}
333 		my_done = tmp_cmd->scsi_done;
334 		kfree(tmp_cmd->host_scribble);
335 		tmp_cmd->host_scribble = NULL;
336 		/* Fetch the sense data, and tuck it away, in the required slot.  The
337 		   Adaptec automatically fetches it, and there is no guarantee that
338 		   we will still have it in the cdb when we come back */
339 		if (ccb[mbo].tarstat == 2)
340 			memcpy(tmp_cmd->sense_buffer, &ccb[mbo].cdb[ccb[mbo].cdblen],
341 			       SCSI_SENSE_BUFFERSIZE);
342 
343 
344 		/* is there mail :-) */
345 
346 		/* more error checking left out here */
347 		if (mbistatus != 1)
348 			/* This is surely wrong, but I don't know what's right */
349 			errstatus = makecode(ccb[mbo].hastat, ccb[mbo].tarstat);
350 		else
351 			errstatus = 0;
352 
353 #ifdef DEBUG
354 		if (errstatus)
355 			shost_printk(KERN_DEBUG, sh, "(aha1542 error:%x %x %x) ", errstatus,
356 			       ccb[mbo].hastat, ccb[mbo].tarstat);
357 		if (ccb[mbo].tarstat == 2)
358 			print_hex_dump_bytes("sense: ", DUMP_PREFIX_NONE, &ccb[mbo].cdb[ccb[mbo].cdblen], 12);
359 		if (errstatus)
360 			printk("aha1542_intr_handle: returning %6x\n", errstatus);
361 #endif
362 		tmp_cmd->result = errstatus;
363 		aha1542->int_cmds[mbo] = NULL;	/* This effectively frees up the mailbox slot, as
364 						   far as queuecommand is concerned */
365 		my_done(tmp_cmd);
366 		number_serviced++;
367 	};
368 }
369 
370 static int aha1542_queuecommand(struct Scsi_Host *sh, struct scsi_cmnd *cmd)
371 {
372 	struct aha1542_hostdata *aha1542 = shost_priv(sh);
373 	u8 direction;
374 	u8 target = cmd->device->id;
375 	u8 lun = cmd->device->lun;
376 	unsigned long flags;
377 	int bufflen = scsi_bufflen(cmd);
378 	int mbo;
379 	struct mailbox *mb = aha1542->mb;
380 	struct ccb *ccb = aha1542->ccb;
381 
382 	if (*cmd->cmnd == REQUEST_SENSE) {
383 		/* Don't do the command - we have the sense data already */
384 		cmd->result = 0;
385 		cmd->scsi_done(cmd);
386 		return 0;
387 	}
388 #ifdef DEBUG
389 	{
390 		int i = -1;
391 		if (*cmd->cmnd == READ_10 || *cmd->cmnd == WRITE_10)
392 			i = xscsi2int(cmd->cmnd + 2);
393 		else if (*cmd->cmnd == READ_6 || *cmd->cmnd == WRITE_6)
394 			i = scsi2int(cmd->cmnd + 2);
395 		shost_printk(KERN_DEBUG, sh, "aha1542_queuecommand: dev %d cmd %02x pos %d len %d",
396 						target, *cmd->cmnd, i, bufflen);
397 		print_hex_dump_bytes("command: ", DUMP_PREFIX_NONE, cmd->cmnd, cmd->cmd_len);
398 	}
399 #endif
400 	/* Use the outgoing mailboxes in a round-robin fashion, because this
401 	   is how the host adapter will scan for them */
402 
403 	spin_lock_irqsave(sh->host_lock, flags);
404 	mbo = aha1542->aha1542_last_mbo_used + 1;
405 	if (mbo >= AHA1542_MAILBOXES)
406 		mbo = 0;
407 
408 	do {
409 		if (mb[mbo].status == 0 && aha1542->int_cmds[mbo] == NULL)
410 			break;
411 		mbo++;
412 		if (mbo >= AHA1542_MAILBOXES)
413 			mbo = 0;
414 	} while (mbo != aha1542->aha1542_last_mbo_used);
415 
416 	if (mb[mbo].status || aha1542->int_cmds[mbo])
417 		panic("Unable to find empty mailbox for aha1542.\n");
418 
419 	aha1542->int_cmds[mbo] = cmd;	/* This will effectively prevent someone else from
420 					   screwing with this cdb. */
421 
422 	aha1542->aha1542_last_mbo_used = mbo;
423 
424 #ifdef DEBUG
425 	shost_printk(KERN_DEBUG, sh, "Sending command (%d %p)...", mbo, cmd->scsi_done);
426 #endif
427 
428 	any2scsi(mb[mbo].ccbptr, isa_virt_to_bus(&ccb[mbo]));	/* This gets trashed for some reason */
429 
430 	memset(&ccb[mbo], 0, sizeof(struct ccb));
431 
432 	ccb[mbo].cdblen = cmd->cmd_len;
433 
434 	direction = 0;
435 	if (*cmd->cmnd == READ_10 || *cmd->cmnd == READ_6)
436 		direction = 8;
437 	else if (*cmd->cmnd == WRITE_10 || *cmd->cmnd == WRITE_6)
438 		direction = 16;
439 
440 	memcpy(ccb[mbo].cdb, cmd->cmnd, ccb[mbo].cdblen);
441 
442 	if (bufflen) {
443 		struct scatterlist *sg;
444 		struct chain *cptr;
445 		int i, sg_count = scsi_sg_count(cmd);
446 
447 		ccb[mbo].op = 2;	/* SCSI Initiator Command  w/scatter-gather */
448 		cmd->host_scribble = kmalloc(sizeof(*cptr)*sg_count,
449 		                                         GFP_KERNEL | GFP_DMA);
450 		cptr = (struct chain *) cmd->host_scribble;
451 		if (cptr == NULL) {
452 			/* free the claimed mailbox slot */
453 			aha1542->int_cmds[mbo] = NULL;
454 			spin_unlock_irqrestore(sh->host_lock, flags);
455 			return SCSI_MLQUEUE_HOST_BUSY;
456 		}
457 		scsi_for_each_sg(cmd, sg, sg_count, i) {
458 			any2scsi(cptr[i].dataptr, isa_page_to_bus(sg_page(sg))
459 								+ sg->offset);
460 			any2scsi(cptr[i].datalen, sg->length);
461 		};
462 		any2scsi(ccb[mbo].datalen, sg_count * sizeof(struct chain));
463 		any2scsi(ccb[mbo].dataptr, isa_virt_to_bus(cptr));
464 #ifdef DEBUG
465 		shost_printk(KERN_DEBUG, sh, "cptr %p: ", cptr);
466 		print_hex_dump_bytes("cptr: ", DUMP_PREFIX_NONE, cptr, 18);
467 #endif
468 	} else {
469 		ccb[mbo].op = 0;	/* SCSI Initiator Command */
470 		cmd->host_scribble = NULL;
471 		any2scsi(ccb[mbo].datalen, 0);
472 		any2scsi(ccb[mbo].dataptr, 0);
473 	};
474 	ccb[mbo].idlun = (target & 7) << 5 | direction | (lun & 7);	/*SCSI Target Id */
475 	ccb[mbo].rsalen = 16;
476 	ccb[mbo].linkptr[0] = ccb[mbo].linkptr[1] = ccb[mbo].linkptr[2] = 0;
477 	ccb[mbo].commlinkid = 0;
478 
479 #ifdef DEBUG
480 	print_hex_dump_bytes("sending: ", DUMP_PREFIX_NONE, &ccb[mbo], sizeof(ccb[mbo]) - 10);
481 	printk("aha1542_queuecommand: now waiting for interrupt ");
482 #endif
483 	mb[mbo].status = 1;
484 	aha1542_outb(cmd->device->host->io_port, CMD_START_SCSI);
485 	spin_unlock_irqrestore(sh->host_lock, flags);
486 
487 	return 0;
488 }
489 
490 /* Initialize mailboxes */
491 static void setup_mailboxes(struct Scsi_Host *sh)
492 {
493 	struct aha1542_hostdata *aha1542 = shost_priv(sh);
494 	int i;
495 	struct mailbox *mb = aha1542->mb;
496 	struct ccb *ccb = aha1542->ccb;
497 
498 	u8 mb_cmd[5] = { CMD_MBINIT, AHA1542_MAILBOXES, 0, 0, 0};
499 
500 	for (i = 0; i < AHA1542_MAILBOXES; i++) {
501 		mb[i].status = mb[AHA1542_MAILBOXES + i].status = 0;
502 		any2scsi(mb[i].ccbptr, isa_virt_to_bus(&ccb[i]));
503 	};
504 	aha1542_intr_reset(sh->io_port);	/* reset interrupts, so they don't block */
505 	any2scsi((mb_cmd + 2), isa_virt_to_bus(mb));
506 	if (aha1542_out(sh->io_port, mb_cmd, 5))
507 		shost_printk(KERN_ERR, sh, "failed setting up mailboxes\n");
508 	aha1542_intr_reset(sh->io_port);
509 }
510 
511 static int aha1542_getconfig(struct Scsi_Host *sh)
512 {
513 	u8 inquiry_result[3];
514 	int i;
515 	i = inb(STATUS(sh->io_port));
516 	if (i & DF) {
517 		i = inb(DATA(sh->io_port));
518 	};
519 	aha1542_outb(sh->io_port, CMD_RETCONF);
520 	aha1542_in(sh->io_port, inquiry_result, 3, 0);
521 	if (!wait_mask(INTRFLAGS(sh->io_port), INTRMASK, HACC, 0, 0))
522 		shost_printk(KERN_ERR, sh, "error querying board settings\n");
523 	aha1542_intr_reset(sh->io_port);
524 	switch (inquiry_result[0]) {
525 	case 0x80:
526 		sh->dma_channel = 7;
527 		break;
528 	case 0x40:
529 		sh->dma_channel = 6;
530 		break;
531 	case 0x20:
532 		sh->dma_channel = 5;
533 		break;
534 	case 0x01:
535 		sh->dma_channel = 0;
536 		break;
537 	case 0:
538 		/* This means that the adapter, although Adaptec 1542 compatible, doesn't use a DMA channel.
539 		   Currently only aware of the BusLogic BT-445S VL-Bus adapter which needs this. */
540 		sh->dma_channel = 0xFF;
541 		break;
542 	default:
543 		shost_printk(KERN_ERR, sh, "Unable to determine DMA channel.\n");
544 		return -1;
545 	};
546 	switch (inquiry_result[1]) {
547 	case 0x40:
548 		sh->irq = 15;
549 		break;
550 	case 0x20:
551 		sh->irq = 14;
552 		break;
553 	case 0x8:
554 		sh->irq = 12;
555 		break;
556 	case 0x4:
557 		sh->irq = 11;
558 		break;
559 	case 0x2:
560 		sh->irq = 10;
561 		break;
562 	case 0x1:
563 		sh->irq = 9;
564 		break;
565 	default:
566 		shost_printk(KERN_ERR, sh, "Unable to determine IRQ level.\n");
567 		return -1;
568 	};
569 	sh->this_id = inquiry_result[2] & 7;
570 	return 0;
571 }
572 
573 /* This function should only be called for 1542C boards - we can detect
574    the special firmware settings and unlock the board */
575 
576 static int aha1542_mbenable(struct Scsi_Host *sh)
577 {
578 	static u8 mbenable_cmd[3];
579 	static u8 mbenable_result[2];
580 	int retval;
581 
582 	retval = BIOS_TRANSLATION_6432;
583 
584 	aha1542_outb(sh->io_port, CMD_EXTBIOS);
585 	if (aha1542_in(sh->io_port, mbenable_result, 2, 100))
586 		return retval;
587 	if (!wait_mask(INTRFLAGS(sh->io_port), INTRMASK, HACC, 0, 100))
588 		goto fail;
589 	aha1542_intr_reset(sh->io_port);
590 
591 	if ((mbenable_result[0] & 0x08) || mbenable_result[1]) {
592 		mbenable_cmd[0] = CMD_MBENABLE;
593 		mbenable_cmd[1] = 0;
594 		mbenable_cmd[2] = mbenable_result[1];
595 
596 		if ((mbenable_result[0] & 0x08) && (mbenable_result[1] & 0x03))
597 			retval = BIOS_TRANSLATION_25563;
598 
599 		if (aha1542_out(sh->io_port, mbenable_cmd, 3))
600 			goto fail;
601 	};
602 	while (0) {
603 fail:
604 		shost_printk(KERN_ERR, sh, "Mailbox init failed\n");
605 	}
606 	aha1542_intr_reset(sh->io_port);
607 	return retval;
608 }
609 
610 /* Query the board to find out if it is a 1542 or a 1740, or whatever. */
611 static int aha1542_query(struct Scsi_Host *sh)
612 {
613 	struct aha1542_hostdata *aha1542 = shost_priv(sh);
614 	u8 inquiry_result[4];
615 	int i;
616 	i = inb(STATUS(sh->io_port));
617 	if (i & DF) {
618 		i = inb(DATA(sh->io_port));
619 	};
620 	aha1542_outb(sh->io_port, CMD_INQUIRY);
621 	aha1542_in(sh->io_port, inquiry_result, 4, 0);
622 	if (!wait_mask(INTRFLAGS(sh->io_port), INTRMASK, HACC, 0, 0))
623 		shost_printk(KERN_ERR, sh, "error querying card type\n");
624 	aha1542_intr_reset(sh->io_port);
625 
626 	aha1542->bios_translation = BIOS_TRANSLATION_6432;	/* Default case */
627 
628 	/* For an AHA1740 series board, we ignore the board since there is a
629 	   hardware bug which can lead to wrong blocks being returned if the board
630 	   is operating in the 1542 emulation mode.  Since there is an extended mode
631 	   driver, we simply ignore the board and let the 1740 driver pick it up.
632 	 */
633 
634 	if (inquiry_result[0] == 0x43) {
635 		shost_printk(KERN_INFO, sh, "Emulation mode not supported for AHA-1740 hardware, use aha1740 driver instead.\n");
636 		return 1;
637 	};
638 
639 	/* Always call this - boards that do not support extended bios translation
640 	   will ignore the command, and we will set the proper default */
641 
642 	aha1542->bios_translation = aha1542_mbenable(sh);
643 
644 	return 0;
645 }
646 
647 static u8 dma_speed_hw(int dma_speed)
648 {
649 	switch (dma_speed) {
650 	case 5:
651 		return 0x00;
652 	case 6:
653 		return 0x04;
654 	case 7:
655 		return 0x01;
656 	case 8:
657 		return 0x02;
658 	case 10:
659 		return 0x03;
660 	}
661 
662 	return 0xff;	/* invalid */
663 }
664 
665 /* Set the Bus on/off-times as not to ruin floppy performance */
666 static void aha1542_set_bus_times(struct Scsi_Host *sh, int bus_on, int bus_off, int dma_speed)
667 {
668 	if (bus_on > 0) {
669 		u8 oncmd[] = { CMD_BUSON_TIME, clamp(bus_on, 2, 15) };
670 
671 		aha1542_intr_reset(sh->io_port);
672 		if (aha1542_out(sh->io_port, oncmd, 2))
673 			goto fail;
674 	}
675 
676 	if (bus_off > 0) {
677 		u8 offcmd[] = { CMD_BUSOFF_TIME, clamp(bus_off, 1, 64) };
678 
679 		aha1542_intr_reset(sh->io_port);
680 		if (aha1542_out(sh->io_port, offcmd, 2))
681 			goto fail;
682 	}
683 
684 	if (dma_speed_hw(dma_speed) != 0xff) {
685 		u8 dmacmd[] = { CMD_DMASPEED, dma_speed_hw(dma_speed) };
686 
687 		aha1542_intr_reset(sh->io_port);
688 		if (aha1542_out(sh->io_port, dmacmd, 2))
689 			goto fail;
690 	}
691 	aha1542_intr_reset(sh->io_port);
692 	return;
693 fail:
694 	shost_printk(KERN_ERR, sh, "setting bus on/off-time failed\n");
695 	aha1542_intr_reset(sh->io_port);
696 }
697 
698 /* return non-zero on detection */
699 static struct Scsi_Host *aha1542_hw_init(struct scsi_host_template *tpnt, struct device *pdev, int indx)
700 {
701 	unsigned int base_io = io[indx];
702 	struct Scsi_Host *sh;
703 	struct aha1542_hostdata *aha1542;
704 	char dma_info[] = "no DMA";
705 
706 	if (base_io == 0)
707 		return NULL;
708 
709 	if (!request_region(base_io, AHA1542_REGION_SIZE, "aha1542"))
710 		return NULL;
711 
712 	sh = scsi_host_alloc(tpnt, sizeof(struct aha1542_hostdata));
713 	if (!sh)
714 		goto release;
715 	aha1542 = shost_priv(sh);
716 
717 	sh->unique_id = base_io;
718 	sh->io_port = base_io;
719 	sh->n_io_port = AHA1542_REGION_SIZE;
720 	aha1542->aha1542_last_mbi_used = 2 * AHA1542_MAILBOXES - 1;
721 	aha1542->aha1542_last_mbo_used = AHA1542_MAILBOXES - 1;
722 
723 	if (!aha1542_test_port(sh))
724 		goto unregister;
725 
726 	aha1542_set_bus_times(sh, bus_on[indx], bus_off[indx], dma_speed[indx]);
727 	if (aha1542_query(sh))
728 		goto unregister;
729 	if (aha1542_getconfig(sh) == -1)
730 		goto unregister;
731 
732 	if (sh->dma_channel != 0xFF)
733 		snprintf(dma_info, sizeof(dma_info), "DMA %d", sh->dma_channel);
734 	shost_printk(KERN_INFO, sh, "Adaptec AHA-1542 (SCSI-ID %d) at IO 0x%x, IRQ %d, %s\n",
735 				sh->this_id, base_io, sh->irq, dma_info);
736 	if (aha1542->bios_translation == BIOS_TRANSLATION_25563)
737 		shost_printk(KERN_INFO, sh, "Using extended bios translation\n");
738 
739 	setup_mailboxes(sh);
740 
741 	if (request_irq(sh->irq, aha1542_interrupt, 0, "aha1542", sh)) {
742 		shost_printk(KERN_ERR, sh, "Unable to allocate IRQ.\n");
743 		goto unregister;
744 	}
745 	if (sh->dma_channel != 0xFF) {
746 		if (request_dma(sh->dma_channel, "aha1542")) {
747 			shost_printk(KERN_ERR, sh, "Unable to allocate DMA channel.\n");
748 			goto free_irq;
749 		}
750 		if (sh->dma_channel == 0 || sh->dma_channel >= 5) {
751 			set_dma_mode(sh->dma_channel, DMA_MODE_CASCADE);
752 			enable_dma(sh->dma_channel);
753 		}
754 	}
755 
756 	if (scsi_add_host(sh, pdev))
757 		goto free_dma;
758 
759 	scsi_scan_host(sh);
760 
761 	return sh;
762 free_dma:
763 	if (sh->dma_channel != 0xff)
764 		free_dma(sh->dma_channel);
765 free_irq:
766 	free_irq(sh->irq, sh);
767 unregister:
768 	scsi_host_put(sh);
769 release:
770 	release_region(base_io, AHA1542_REGION_SIZE);
771 
772 	return NULL;
773 }
774 
775 static int aha1542_release(struct Scsi_Host *sh)
776 {
777 	scsi_remove_host(sh);
778 	if (sh->dma_channel != 0xff)
779 		free_dma(sh->dma_channel);
780 	if (sh->irq)
781 		free_irq(sh->irq, sh);
782 	if (sh->io_port && sh->n_io_port)
783 		release_region(sh->io_port, sh->n_io_port);
784 	scsi_host_put(sh);
785 	return 0;
786 }
787 
788 
789 /*
790  * This is a device reset.  This is handled by sending a special command
791  * to the device.
792  */
793 static int aha1542_dev_reset(struct scsi_cmnd *cmd)
794 {
795 	struct Scsi_Host *sh = cmd->device->host;
796 	struct aha1542_hostdata *aha1542 = shost_priv(sh);
797 	unsigned long flags;
798 	struct mailbox *mb = aha1542->mb;
799 	u8 target = cmd->device->id;
800 	u8 lun = cmd->device->lun;
801 	int mbo;
802 	struct ccb *ccb = aha1542->ccb;
803 
804 	spin_lock_irqsave(sh->host_lock, flags);
805 	mbo = aha1542->aha1542_last_mbo_used + 1;
806 	if (mbo >= AHA1542_MAILBOXES)
807 		mbo = 0;
808 
809 	do {
810 		if (mb[mbo].status == 0 && aha1542->int_cmds[mbo] == NULL)
811 			break;
812 		mbo++;
813 		if (mbo >= AHA1542_MAILBOXES)
814 			mbo = 0;
815 	} while (mbo != aha1542->aha1542_last_mbo_used);
816 
817 	if (mb[mbo].status || aha1542->int_cmds[mbo])
818 		panic("Unable to find empty mailbox for aha1542.\n");
819 
820 	aha1542->int_cmds[mbo] = cmd;	/* This will effectively
821 					   prevent someone else from
822 					   screwing with this cdb. */
823 
824 	aha1542->aha1542_last_mbo_used = mbo;
825 
826 	any2scsi(mb[mbo].ccbptr, isa_virt_to_bus(&ccb[mbo]));	/* This gets trashed for some reason */
827 
828 	memset(&ccb[mbo], 0, sizeof(struct ccb));
829 
830 	ccb[mbo].op = 0x81;	/* BUS DEVICE RESET */
831 
832 	ccb[mbo].idlun = (target & 7) << 5 | (lun & 7);		/*SCSI Target Id */
833 
834 	ccb[mbo].linkptr[0] = ccb[mbo].linkptr[1] = ccb[mbo].linkptr[2] = 0;
835 	ccb[mbo].commlinkid = 0;
836 
837 	/*
838 	 * Now tell the 1542 to flush all pending commands for this
839 	 * target
840 	 */
841 	aha1542_outb(sh->io_port, CMD_START_SCSI);
842 	spin_unlock_irqrestore(sh->host_lock, flags);
843 
844 	scmd_printk(KERN_WARNING, cmd,
845 		"Trying device reset for target\n");
846 
847 	return SUCCESS;
848 }
849 
850 static int aha1542_reset(struct scsi_cmnd *cmd, u8 reset_cmd)
851 {
852 	struct Scsi_Host *sh = cmd->device->host;
853 	struct aha1542_hostdata *aha1542 = shost_priv(sh);
854 	unsigned long flags;
855 	int i;
856 
857 	spin_lock_irqsave(sh->host_lock, flags);
858 	/*
859 	 * This does a scsi reset for all devices on the bus.
860 	 * In principle, we could also reset the 1542 - should
861 	 * we do this?  Try this first, and we can add that later
862 	 * if it turns out to be useful.
863 	 */
864 	outb(reset_cmd, CONTROL(cmd->device->host->io_port));
865 
866 	if (!wait_mask(STATUS(cmd->device->host->io_port),
867 	     STATMASK, IDLE, STST | DIAGF | INVDCMD | DF | CDF, 0)) {
868 		spin_unlock_irqrestore(sh->host_lock, flags);
869 		return FAILED;
870 	}
871 
872 	/*
873 	 * We need to do this too before the 1542 can interact with
874 	 * us again after host reset.
875 	 */
876 	if (reset_cmd & HRST)
877 		setup_mailboxes(cmd->device->host);
878 
879 	/*
880 	 * Now try to pick up the pieces.  For all pending commands,
881 	 * free any internal data structures, and basically clear things
882 	 * out.  We do not try and restart any commands or anything -
883 	 * the strategy handler takes care of that crap.
884 	 */
885 	shost_printk(KERN_WARNING, cmd->device->host, "Sent BUS RESET to scsi host %d\n", cmd->device->host->host_no);
886 
887 	for (i = 0; i < AHA1542_MAILBOXES; i++) {
888 		if (aha1542->int_cmds[i] != NULL) {
889 			struct scsi_cmnd *tmp_cmd;
890 			tmp_cmd = aha1542->int_cmds[i];
891 
892 			if (tmp_cmd->device->soft_reset) {
893 				/*
894 				 * If this device implements the soft reset option,
895 				 * then it is still holding onto the command, and
896 				 * may yet complete it.  In this case, we don't
897 				 * flush the data.
898 				 */
899 				continue;
900 			}
901 			kfree(tmp_cmd->host_scribble);
902 			tmp_cmd->host_scribble = NULL;
903 			aha1542->int_cmds[i] = NULL;
904 			aha1542->mb[i].status = 0;
905 		}
906 	}
907 
908 	spin_unlock_irqrestore(sh->host_lock, flags);
909 	return SUCCESS;
910 }
911 
912 static int aha1542_bus_reset(struct scsi_cmnd *cmd)
913 {
914 	return aha1542_reset(cmd, SCRST);
915 }
916 
917 static int aha1542_host_reset(struct scsi_cmnd *cmd)
918 {
919 	return aha1542_reset(cmd, HRST | SCRST);
920 }
921 
922 static int aha1542_biosparam(struct scsi_device *sdev,
923 		struct block_device *bdev, sector_t capacity, int geom[])
924 {
925 	struct aha1542_hostdata *aha1542 = shost_priv(sdev->host);
926 
927 	if (capacity >= 0x200000 &&
928 			aha1542->bios_translation == BIOS_TRANSLATION_25563) {
929 		/* Please verify that this is the same as what DOS returns */
930 		geom[0] = 255;	/* heads */
931 		geom[1] = 63;	/* sectors */
932 	} else {
933 		geom[0] = 64;	/* heads */
934 		geom[1] = 32;	/* sectors */
935 	}
936 	geom[2] = sector_div(capacity, geom[0] * geom[1]);	/* cylinders */
937 
938 	return 0;
939 }
940 MODULE_LICENSE("GPL");
941 
942 static struct scsi_host_template driver_template = {
943 	.module			= THIS_MODULE,
944 	.proc_name		= "aha1542",
945 	.name			= "Adaptec 1542",
946 	.queuecommand		= aha1542_queuecommand,
947 	.eh_device_reset_handler= aha1542_dev_reset,
948 	.eh_bus_reset_handler	= aha1542_bus_reset,
949 	.eh_host_reset_handler	= aha1542_host_reset,
950 	.bios_param		= aha1542_biosparam,
951 	.can_queue		= AHA1542_MAILBOXES,
952 	.this_id		= 7,
953 	.sg_tablesize		= 16,
954 	.cmd_per_lun		= 1,
955 	.unchecked_isa_dma	= 1,
956 	.use_clustering		= ENABLE_CLUSTERING,
957 };
958 
959 static int aha1542_isa_match(struct device *pdev, unsigned int ndev)
960 {
961 	struct Scsi_Host *sh = aha1542_hw_init(&driver_template, pdev, ndev);
962 
963 	if (!sh)
964 		return 0;
965 
966 	dev_set_drvdata(pdev, sh);
967 	return 1;
968 }
969 
970 static int aha1542_isa_remove(struct device *pdev,
971 				    unsigned int ndev)
972 {
973 	aha1542_release(dev_get_drvdata(pdev));
974 	dev_set_drvdata(pdev, NULL);
975 	return 0;
976 }
977 
978 static struct isa_driver aha1542_isa_driver = {
979 	.match		= aha1542_isa_match,
980 	.remove		= aha1542_isa_remove,
981 	.driver		= {
982 		.name	= "aha1542"
983 	},
984 };
985 static int isa_registered;
986 
987 #ifdef CONFIG_PNP
988 static struct pnp_device_id aha1542_pnp_ids[] = {
989 	{ .id = "ADP1542" },
990 	{ .id = "" }
991 };
992 MODULE_DEVICE_TABLE(pnp, aha1542_pnp_ids);
993 
994 static int aha1542_pnp_probe(struct pnp_dev *pdev, const struct pnp_device_id *id)
995 {
996 	int indx;
997 	struct Scsi_Host *sh;
998 
999 	for (indx = 0; indx < ARRAY_SIZE(io); indx++) {
1000 		if (io[indx])
1001 			continue;
1002 
1003 		if (pnp_activate_dev(pdev) < 0)
1004 			continue;
1005 
1006 		io[indx] = pnp_port_start(pdev, 0);
1007 
1008 		/* The card can be queried for its DMA, we have
1009 		   the DMA set up that is enough */
1010 
1011 		dev_info(&pdev->dev, "ISAPnP found an AHA1535 at I/O 0x%03X", io[indx]);
1012 	}
1013 
1014 	sh = aha1542_hw_init(&driver_template, &pdev->dev, indx);
1015 	if (!sh)
1016 		return -ENODEV;
1017 
1018 	pnp_set_drvdata(pdev, sh);
1019 	return 0;
1020 }
1021 
1022 static void aha1542_pnp_remove(struct pnp_dev *pdev)
1023 {
1024 	aha1542_release(pnp_get_drvdata(pdev));
1025 	pnp_set_drvdata(pdev, NULL);
1026 }
1027 
1028 static struct pnp_driver aha1542_pnp_driver = {
1029 	.name		= "aha1542",
1030 	.id_table	= aha1542_pnp_ids,
1031 	.probe		= aha1542_pnp_probe,
1032 	.remove		= aha1542_pnp_remove,
1033 };
1034 static int pnp_registered;
1035 #endif /* CONFIG_PNP */
1036 
1037 static int __init aha1542_init(void)
1038 {
1039 	int ret = 0;
1040 
1041 #ifdef CONFIG_PNP
1042 	if (isapnp) {
1043 		ret = pnp_register_driver(&aha1542_pnp_driver);
1044 		if (!ret)
1045 			pnp_registered = 1;
1046 	}
1047 #endif
1048 	ret = isa_register_driver(&aha1542_isa_driver, MAXBOARDS);
1049 	if (!ret)
1050 		isa_registered = 1;
1051 
1052 #ifdef CONFIG_PNP
1053 	if (pnp_registered)
1054 		ret = 0;
1055 #endif
1056 	if (isa_registered)
1057 		ret = 0;
1058 
1059 	return ret;
1060 }
1061 
1062 static void __exit aha1542_exit(void)
1063 {
1064 #ifdef CONFIG_PNP
1065 	if (pnp_registered)
1066 		pnp_unregister_driver(&aha1542_pnp_driver);
1067 #endif
1068 	if (isa_registered)
1069 		isa_unregister_driver(&aha1542_isa_driver);
1070 }
1071 
1072 module_init(aha1542_init);
1073 module_exit(aha1542_exit);
1074