xref: /openbmc/linux/drivers/scsi/aha1542.c (revision e3d786a3)
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_hw_array(io, int, ioport, 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, sg_count;
379 	struct mailbox *mb = aha1542->mb;
380 	struct ccb *ccb = aha1542->ccb;
381 	struct chain *cptr;
382 
383 	if (*cmd->cmnd == REQUEST_SENSE) {
384 		/* Don't do the command - we have the sense data already */
385 		cmd->result = 0;
386 		cmd->scsi_done(cmd);
387 		return 0;
388 	}
389 #ifdef DEBUG
390 	{
391 		int i = -1;
392 		if (*cmd->cmnd == READ_10 || *cmd->cmnd == WRITE_10)
393 			i = xscsi2int(cmd->cmnd + 2);
394 		else if (*cmd->cmnd == READ_6 || *cmd->cmnd == WRITE_6)
395 			i = scsi2int(cmd->cmnd + 2);
396 		shost_printk(KERN_DEBUG, sh, "aha1542_queuecommand: dev %d cmd %02x pos %d len %d",
397 						target, *cmd->cmnd, i, bufflen);
398 		print_hex_dump_bytes("command: ", DUMP_PREFIX_NONE, cmd->cmnd, cmd->cmd_len);
399 	}
400 #endif
401 	if (bufflen) {	/* allocate memory before taking host_lock */
402 		sg_count = scsi_sg_count(cmd);
403 		cptr = kmalloc_array(sg_count, sizeof(*cptr),
404 				     GFP_KERNEL | GFP_DMA);
405 		if (!cptr)
406 			return SCSI_MLQUEUE_HOST_BUSY;
407 	} else {
408 		sg_count = 0;
409 		cptr = NULL;
410 	}
411 
412 	/* Use the outgoing mailboxes in a round-robin fashion, because this
413 	   is how the host adapter will scan for them */
414 
415 	spin_lock_irqsave(sh->host_lock, flags);
416 	mbo = aha1542->aha1542_last_mbo_used + 1;
417 	if (mbo >= AHA1542_MAILBOXES)
418 		mbo = 0;
419 
420 	do {
421 		if (mb[mbo].status == 0 && aha1542->int_cmds[mbo] == NULL)
422 			break;
423 		mbo++;
424 		if (mbo >= AHA1542_MAILBOXES)
425 			mbo = 0;
426 	} while (mbo != aha1542->aha1542_last_mbo_used);
427 
428 	if (mb[mbo].status || aha1542->int_cmds[mbo])
429 		panic("Unable to find empty mailbox for aha1542.\n");
430 
431 	aha1542->int_cmds[mbo] = cmd;	/* This will effectively prevent someone else from
432 					   screwing with this cdb. */
433 
434 	aha1542->aha1542_last_mbo_used = mbo;
435 
436 #ifdef DEBUG
437 	shost_printk(KERN_DEBUG, sh, "Sending command (%d %p)...", mbo, cmd->scsi_done);
438 #endif
439 
440 	any2scsi(mb[mbo].ccbptr, isa_virt_to_bus(&ccb[mbo]));	/* This gets trashed for some reason */
441 
442 	memset(&ccb[mbo], 0, sizeof(struct ccb));
443 
444 	ccb[mbo].cdblen = cmd->cmd_len;
445 
446 	direction = 0;
447 	if (*cmd->cmnd == READ_10 || *cmd->cmnd == READ_6)
448 		direction = 8;
449 	else if (*cmd->cmnd == WRITE_10 || *cmd->cmnd == WRITE_6)
450 		direction = 16;
451 
452 	memcpy(ccb[mbo].cdb, cmd->cmnd, ccb[mbo].cdblen);
453 
454 	if (bufflen) {
455 		struct scatterlist *sg;
456 		int i;
457 
458 		ccb[mbo].op = 2;	/* SCSI Initiator Command  w/scatter-gather */
459 		cmd->host_scribble = (void *)cptr;
460 		scsi_for_each_sg(cmd, sg, sg_count, i) {
461 			any2scsi(cptr[i].dataptr, isa_page_to_bus(sg_page(sg))
462 								+ sg->offset);
463 			any2scsi(cptr[i].datalen, sg->length);
464 		};
465 		any2scsi(ccb[mbo].datalen, sg_count * sizeof(struct chain));
466 		any2scsi(ccb[mbo].dataptr, isa_virt_to_bus(cptr));
467 #ifdef DEBUG
468 		shost_printk(KERN_DEBUG, sh, "cptr %p: ", cptr);
469 		print_hex_dump_bytes("cptr: ", DUMP_PREFIX_NONE, cptr, 18);
470 #endif
471 	} else {
472 		ccb[mbo].op = 0;	/* SCSI Initiator Command */
473 		cmd->host_scribble = NULL;
474 		any2scsi(ccb[mbo].datalen, 0);
475 		any2scsi(ccb[mbo].dataptr, 0);
476 	};
477 	ccb[mbo].idlun = (target & 7) << 5 | direction | (lun & 7);	/*SCSI Target Id */
478 	ccb[mbo].rsalen = 16;
479 	ccb[mbo].linkptr[0] = ccb[mbo].linkptr[1] = ccb[mbo].linkptr[2] = 0;
480 	ccb[mbo].commlinkid = 0;
481 
482 #ifdef DEBUG
483 	print_hex_dump_bytes("sending: ", DUMP_PREFIX_NONE, &ccb[mbo], sizeof(ccb[mbo]) - 10);
484 	printk("aha1542_queuecommand: now waiting for interrupt ");
485 #endif
486 	mb[mbo].status = 1;
487 	aha1542_outb(cmd->device->host->io_port, CMD_START_SCSI);
488 	spin_unlock_irqrestore(sh->host_lock, flags);
489 
490 	return 0;
491 }
492 
493 /* Initialize mailboxes */
494 static void setup_mailboxes(struct Scsi_Host *sh)
495 {
496 	struct aha1542_hostdata *aha1542 = shost_priv(sh);
497 	int i;
498 	struct mailbox *mb = aha1542->mb;
499 	struct ccb *ccb = aha1542->ccb;
500 
501 	u8 mb_cmd[5] = { CMD_MBINIT, AHA1542_MAILBOXES, 0, 0, 0};
502 
503 	for (i = 0; i < AHA1542_MAILBOXES; i++) {
504 		mb[i].status = mb[AHA1542_MAILBOXES + i].status = 0;
505 		any2scsi(mb[i].ccbptr, isa_virt_to_bus(&ccb[i]));
506 	};
507 	aha1542_intr_reset(sh->io_port);	/* reset interrupts, so they don't block */
508 	any2scsi((mb_cmd + 2), isa_virt_to_bus(mb));
509 	if (aha1542_out(sh->io_port, mb_cmd, 5))
510 		shost_printk(KERN_ERR, sh, "failed setting up mailboxes\n");
511 	aha1542_intr_reset(sh->io_port);
512 }
513 
514 static int aha1542_getconfig(struct Scsi_Host *sh)
515 {
516 	u8 inquiry_result[3];
517 	int i;
518 	i = inb(STATUS(sh->io_port));
519 	if (i & DF) {
520 		i = inb(DATA(sh->io_port));
521 	};
522 	aha1542_outb(sh->io_port, CMD_RETCONF);
523 	aha1542_in(sh->io_port, inquiry_result, 3, 0);
524 	if (!wait_mask(INTRFLAGS(sh->io_port), INTRMASK, HACC, 0, 0))
525 		shost_printk(KERN_ERR, sh, "error querying board settings\n");
526 	aha1542_intr_reset(sh->io_port);
527 	switch (inquiry_result[0]) {
528 	case 0x80:
529 		sh->dma_channel = 7;
530 		break;
531 	case 0x40:
532 		sh->dma_channel = 6;
533 		break;
534 	case 0x20:
535 		sh->dma_channel = 5;
536 		break;
537 	case 0x01:
538 		sh->dma_channel = 0;
539 		break;
540 	case 0:
541 		/* This means that the adapter, although Adaptec 1542 compatible, doesn't use a DMA channel.
542 		   Currently only aware of the BusLogic BT-445S VL-Bus adapter which needs this. */
543 		sh->dma_channel = 0xFF;
544 		break;
545 	default:
546 		shost_printk(KERN_ERR, sh, "Unable to determine DMA channel.\n");
547 		return -1;
548 	};
549 	switch (inquiry_result[1]) {
550 	case 0x40:
551 		sh->irq = 15;
552 		break;
553 	case 0x20:
554 		sh->irq = 14;
555 		break;
556 	case 0x8:
557 		sh->irq = 12;
558 		break;
559 	case 0x4:
560 		sh->irq = 11;
561 		break;
562 	case 0x2:
563 		sh->irq = 10;
564 		break;
565 	case 0x1:
566 		sh->irq = 9;
567 		break;
568 	default:
569 		shost_printk(KERN_ERR, sh, "Unable to determine IRQ level.\n");
570 		return -1;
571 	};
572 	sh->this_id = inquiry_result[2] & 7;
573 	return 0;
574 }
575 
576 /* This function should only be called for 1542C boards - we can detect
577    the special firmware settings and unlock the board */
578 
579 static int aha1542_mbenable(struct Scsi_Host *sh)
580 {
581 	static u8 mbenable_cmd[3];
582 	static u8 mbenable_result[2];
583 	int retval;
584 
585 	retval = BIOS_TRANSLATION_6432;
586 
587 	aha1542_outb(sh->io_port, CMD_EXTBIOS);
588 	if (aha1542_in(sh->io_port, mbenable_result, 2, 100))
589 		return retval;
590 	if (!wait_mask(INTRFLAGS(sh->io_port), INTRMASK, HACC, 0, 100))
591 		goto fail;
592 	aha1542_intr_reset(sh->io_port);
593 
594 	if ((mbenable_result[0] & 0x08) || mbenable_result[1]) {
595 		mbenable_cmd[0] = CMD_MBENABLE;
596 		mbenable_cmd[1] = 0;
597 		mbenable_cmd[2] = mbenable_result[1];
598 
599 		if ((mbenable_result[0] & 0x08) && (mbenable_result[1] & 0x03))
600 			retval = BIOS_TRANSLATION_25563;
601 
602 		if (aha1542_out(sh->io_port, mbenable_cmd, 3))
603 			goto fail;
604 	};
605 	while (0) {
606 fail:
607 		shost_printk(KERN_ERR, sh, "Mailbox init failed\n");
608 	}
609 	aha1542_intr_reset(sh->io_port);
610 	return retval;
611 }
612 
613 /* Query the board to find out if it is a 1542 or a 1740, or whatever. */
614 static int aha1542_query(struct Scsi_Host *sh)
615 {
616 	struct aha1542_hostdata *aha1542 = shost_priv(sh);
617 	u8 inquiry_result[4];
618 	int i;
619 	i = inb(STATUS(sh->io_port));
620 	if (i & DF) {
621 		i = inb(DATA(sh->io_port));
622 	};
623 	aha1542_outb(sh->io_port, CMD_INQUIRY);
624 	aha1542_in(sh->io_port, inquiry_result, 4, 0);
625 	if (!wait_mask(INTRFLAGS(sh->io_port), INTRMASK, HACC, 0, 0))
626 		shost_printk(KERN_ERR, sh, "error querying card type\n");
627 	aha1542_intr_reset(sh->io_port);
628 
629 	aha1542->bios_translation = BIOS_TRANSLATION_6432;	/* Default case */
630 
631 	/* For an AHA1740 series board, we ignore the board since there is a
632 	   hardware bug which can lead to wrong blocks being returned if the board
633 	   is operating in the 1542 emulation mode.  Since there is an extended mode
634 	   driver, we simply ignore the board and let the 1740 driver pick it up.
635 	 */
636 
637 	if (inquiry_result[0] == 0x43) {
638 		shost_printk(KERN_INFO, sh, "Emulation mode not supported for AHA-1740 hardware, use aha1740 driver instead.\n");
639 		return 1;
640 	};
641 
642 	/* Always call this - boards that do not support extended bios translation
643 	   will ignore the command, and we will set the proper default */
644 
645 	aha1542->bios_translation = aha1542_mbenable(sh);
646 
647 	return 0;
648 }
649 
650 static u8 dma_speed_hw(int dma_speed)
651 {
652 	switch (dma_speed) {
653 	case 5:
654 		return 0x00;
655 	case 6:
656 		return 0x04;
657 	case 7:
658 		return 0x01;
659 	case 8:
660 		return 0x02;
661 	case 10:
662 		return 0x03;
663 	}
664 
665 	return 0xff;	/* invalid */
666 }
667 
668 /* Set the Bus on/off-times as not to ruin floppy performance */
669 static void aha1542_set_bus_times(struct Scsi_Host *sh, int bus_on, int bus_off, int dma_speed)
670 {
671 	if (bus_on > 0) {
672 		u8 oncmd[] = { CMD_BUSON_TIME, clamp(bus_on, 2, 15) };
673 
674 		aha1542_intr_reset(sh->io_port);
675 		if (aha1542_out(sh->io_port, oncmd, 2))
676 			goto fail;
677 	}
678 
679 	if (bus_off > 0) {
680 		u8 offcmd[] = { CMD_BUSOFF_TIME, clamp(bus_off, 1, 64) };
681 
682 		aha1542_intr_reset(sh->io_port);
683 		if (aha1542_out(sh->io_port, offcmd, 2))
684 			goto fail;
685 	}
686 
687 	if (dma_speed_hw(dma_speed) != 0xff) {
688 		u8 dmacmd[] = { CMD_DMASPEED, dma_speed_hw(dma_speed) };
689 
690 		aha1542_intr_reset(sh->io_port);
691 		if (aha1542_out(sh->io_port, dmacmd, 2))
692 			goto fail;
693 	}
694 	aha1542_intr_reset(sh->io_port);
695 	return;
696 fail:
697 	shost_printk(KERN_ERR, sh, "setting bus on/off-time failed\n");
698 	aha1542_intr_reset(sh->io_port);
699 }
700 
701 /* return non-zero on detection */
702 static struct Scsi_Host *aha1542_hw_init(struct scsi_host_template *tpnt, struct device *pdev, int indx)
703 {
704 	unsigned int base_io = io[indx];
705 	struct Scsi_Host *sh;
706 	struct aha1542_hostdata *aha1542;
707 	char dma_info[] = "no DMA";
708 
709 	if (base_io == 0)
710 		return NULL;
711 
712 	if (!request_region(base_io, AHA1542_REGION_SIZE, "aha1542"))
713 		return NULL;
714 
715 	sh = scsi_host_alloc(tpnt, sizeof(struct aha1542_hostdata));
716 	if (!sh)
717 		goto release;
718 	aha1542 = shost_priv(sh);
719 
720 	sh->unique_id = base_io;
721 	sh->io_port = base_io;
722 	sh->n_io_port = AHA1542_REGION_SIZE;
723 	aha1542->aha1542_last_mbi_used = 2 * AHA1542_MAILBOXES - 1;
724 	aha1542->aha1542_last_mbo_used = AHA1542_MAILBOXES - 1;
725 
726 	if (!aha1542_test_port(sh))
727 		goto unregister;
728 
729 	aha1542_set_bus_times(sh, bus_on[indx], bus_off[indx], dma_speed[indx]);
730 	if (aha1542_query(sh))
731 		goto unregister;
732 	if (aha1542_getconfig(sh) == -1)
733 		goto unregister;
734 
735 	if (sh->dma_channel != 0xFF)
736 		snprintf(dma_info, sizeof(dma_info), "DMA %d", sh->dma_channel);
737 	shost_printk(KERN_INFO, sh, "Adaptec AHA-1542 (SCSI-ID %d) at IO 0x%x, IRQ %d, %s\n",
738 				sh->this_id, base_io, sh->irq, dma_info);
739 	if (aha1542->bios_translation == BIOS_TRANSLATION_25563)
740 		shost_printk(KERN_INFO, sh, "Using extended bios translation\n");
741 
742 	setup_mailboxes(sh);
743 
744 	if (request_irq(sh->irq, aha1542_interrupt, 0, "aha1542", sh)) {
745 		shost_printk(KERN_ERR, sh, "Unable to allocate IRQ.\n");
746 		goto unregister;
747 	}
748 	if (sh->dma_channel != 0xFF) {
749 		if (request_dma(sh->dma_channel, "aha1542")) {
750 			shost_printk(KERN_ERR, sh, "Unable to allocate DMA channel.\n");
751 			goto free_irq;
752 		}
753 		if (sh->dma_channel == 0 || sh->dma_channel >= 5) {
754 			set_dma_mode(sh->dma_channel, DMA_MODE_CASCADE);
755 			enable_dma(sh->dma_channel);
756 		}
757 	}
758 
759 	if (scsi_add_host(sh, pdev))
760 		goto free_dma;
761 
762 	scsi_scan_host(sh);
763 
764 	return sh;
765 free_dma:
766 	if (sh->dma_channel != 0xff)
767 		free_dma(sh->dma_channel);
768 free_irq:
769 	free_irq(sh->irq, sh);
770 unregister:
771 	scsi_host_put(sh);
772 release:
773 	release_region(base_io, AHA1542_REGION_SIZE);
774 
775 	return NULL;
776 }
777 
778 static int aha1542_release(struct Scsi_Host *sh)
779 {
780 	scsi_remove_host(sh);
781 	if (sh->dma_channel != 0xff)
782 		free_dma(sh->dma_channel);
783 	if (sh->irq)
784 		free_irq(sh->irq, sh);
785 	if (sh->io_port && sh->n_io_port)
786 		release_region(sh->io_port, sh->n_io_port);
787 	scsi_host_put(sh);
788 	return 0;
789 }
790 
791 
792 /*
793  * This is a device reset.  This is handled by sending a special command
794  * to the device.
795  */
796 static int aha1542_dev_reset(struct scsi_cmnd *cmd)
797 {
798 	struct Scsi_Host *sh = cmd->device->host;
799 	struct aha1542_hostdata *aha1542 = shost_priv(sh);
800 	unsigned long flags;
801 	struct mailbox *mb = aha1542->mb;
802 	u8 target = cmd->device->id;
803 	u8 lun = cmd->device->lun;
804 	int mbo;
805 	struct ccb *ccb = aha1542->ccb;
806 
807 	spin_lock_irqsave(sh->host_lock, flags);
808 	mbo = aha1542->aha1542_last_mbo_used + 1;
809 	if (mbo >= AHA1542_MAILBOXES)
810 		mbo = 0;
811 
812 	do {
813 		if (mb[mbo].status == 0 && aha1542->int_cmds[mbo] == NULL)
814 			break;
815 		mbo++;
816 		if (mbo >= AHA1542_MAILBOXES)
817 			mbo = 0;
818 	} while (mbo != aha1542->aha1542_last_mbo_used);
819 
820 	if (mb[mbo].status || aha1542->int_cmds[mbo])
821 		panic("Unable to find empty mailbox for aha1542.\n");
822 
823 	aha1542->int_cmds[mbo] = cmd;	/* This will effectively
824 					   prevent someone else from
825 					   screwing with this cdb. */
826 
827 	aha1542->aha1542_last_mbo_used = mbo;
828 
829 	any2scsi(mb[mbo].ccbptr, isa_virt_to_bus(&ccb[mbo]));	/* This gets trashed for some reason */
830 
831 	memset(&ccb[mbo], 0, sizeof(struct ccb));
832 
833 	ccb[mbo].op = 0x81;	/* BUS DEVICE RESET */
834 
835 	ccb[mbo].idlun = (target & 7) << 5 | (lun & 7);		/*SCSI Target Id */
836 
837 	ccb[mbo].linkptr[0] = ccb[mbo].linkptr[1] = ccb[mbo].linkptr[2] = 0;
838 	ccb[mbo].commlinkid = 0;
839 
840 	/*
841 	 * Now tell the 1542 to flush all pending commands for this
842 	 * target
843 	 */
844 	aha1542_outb(sh->io_port, CMD_START_SCSI);
845 	spin_unlock_irqrestore(sh->host_lock, flags);
846 
847 	scmd_printk(KERN_WARNING, cmd,
848 		"Trying device reset for target\n");
849 
850 	return SUCCESS;
851 }
852 
853 static int aha1542_reset(struct scsi_cmnd *cmd, u8 reset_cmd)
854 {
855 	struct Scsi_Host *sh = cmd->device->host;
856 	struct aha1542_hostdata *aha1542 = shost_priv(sh);
857 	unsigned long flags;
858 	int i;
859 
860 	spin_lock_irqsave(sh->host_lock, flags);
861 	/*
862 	 * This does a scsi reset for all devices on the bus.
863 	 * In principle, we could also reset the 1542 - should
864 	 * we do this?  Try this first, and we can add that later
865 	 * if it turns out to be useful.
866 	 */
867 	outb(reset_cmd, CONTROL(cmd->device->host->io_port));
868 
869 	if (!wait_mask(STATUS(cmd->device->host->io_port),
870 	     STATMASK, IDLE, STST | DIAGF | INVDCMD | DF | CDF, 0)) {
871 		spin_unlock_irqrestore(sh->host_lock, flags);
872 		return FAILED;
873 	}
874 
875 	/*
876 	 * We need to do this too before the 1542 can interact with
877 	 * us again after host reset.
878 	 */
879 	if (reset_cmd & HRST)
880 		setup_mailboxes(cmd->device->host);
881 
882 	/*
883 	 * Now try to pick up the pieces.  For all pending commands,
884 	 * free any internal data structures, and basically clear things
885 	 * out.  We do not try and restart any commands or anything -
886 	 * the strategy handler takes care of that crap.
887 	 */
888 	shost_printk(KERN_WARNING, cmd->device->host, "Sent BUS RESET to scsi host %d\n", cmd->device->host->host_no);
889 
890 	for (i = 0; i < AHA1542_MAILBOXES; i++) {
891 		if (aha1542->int_cmds[i] != NULL) {
892 			struct scsi_cmnd *tmp_cmd;
893 			tmp_cmd = aha1542->int_cmds[i];
894 
895 			if (tmp_cmd->device->soft_reset) {
896 				/*
897 				 * If this device implements the soft reset option,
898 				 * then it is still holding onto the command, and
899 				 * may yet complete it.  In this case, we don't
900 				 * flush the data.
901 				 */
902 				continue;
903 			}
904 			kfree(tmp_cmd->host_scribble);
905 			tmp_cmd->host_scribble = NULL;
906 			aha1542->int_cmds[i] = NULL;
907 			aha1542->mb[i].status = 0;
908 		}
909 	}
910 
911 	spin_unlock_irqrestore(sh->host_lock, flags);
912 	return SUCCESS;
913 }
914 
915 static int aha1542_bus_reset(struct scsi_cmnd *cmd)
916 {
917 	return aha1542_reset(cmd, SCRST);
918 }
919 
920 static int aha1542_host_reset(struct scsi_cmnd *cmd)
921 {
922 	return aha1542_reset(cmd, HRST | SCRST);
923 }
924 
925 static int aha1542_biosparam(struct scsi_device *sdev,
926 		struct block_device *bdev, sector_t capacity, int geom[])
927 {
928 	struct aha1542_hostdata *aha1542 = shost_priv(sdev->host);
929 
930 	if (capacity >= 0x200000 &&
931 			aha1542->bios_translation == BIOS_TRANSLATION_25563) {
932 		/* Please verify that this is the same as what DOS returns */
933 		geom[0] = 255;	/* heads */
934 		geom[1] = 63;	/* sectors */
935 	} else {
936 		geom[0] = 64;	/* heads */
937 		geom[1] = 32;	/* sectors */
938 	}
939 	geom[2] = sector_div(capacity, geom[0] * geom[1]);	/* cylinders */
940 
941 	return 0;
942 }
943 MODULE_LICENSE("GPL");
944 
945 static struct scsi_host_template driver_template = {
946 	.module			= THIS_MODULE,
947 	.proc_name		= "aha1542",
948 	.name			= "Adaptec 1542",
949 	.queuecommand		= aha1542_queuecommand,
950 	.eh_device_reset_handler= aha1542_dev_reset,
951 	.eh_bus_reset_handler	= aha1542_bus_reset,
952 	.eh_host_reset_handler	= aha1542_host_reset,
953 	.bios_param		= aha1542_biosparam,
954 	.can_queue		= AHA1542_MAILBOXES,
955 	.this_id		= 7,
956 	.sg_tablesize		= 16,
957 	.unchecked_isa_dma	= 1,
958 	.use_clustering		= ENABLE_CLUSTERING,
959 };
960 
961 static int aha1542_isa_match(struct device *pdev, unsigned int ndev)
962 {
963 	struct Scsi_Host *sh = aha1542_hw_init(&driver_template, pdev, ndev);
964 
965 	if (!sh)
966 		return 0;
967 
968 	dev_set_drvdata(pdev, sh);
969 	return 1;
970 }
971 
972 static int aha1542_isa_remove(struct device *pdev,
973 				    unsigned int ndev)
974 {
975 	aha1542_release(dev_get_drvdata(pdev));
976 	dev_set_drvdata(pdev, NULL);
977 	return 0;
978 }
979 
980 static struct isa_driver aha1542_isa_driver = {
981 	.match		= aha1542_isa_match,
982 	.remove		= aha1542_isa_remove,
983 	.driver		= {
984 		.name	= "aha1542"
985 	},
986 };
987 static int isa_registered;
988 
989 #ifdef CONFIG_PNP
990 static const struct pnp_device_id aha1542_pnp_ids[] = {
991 	{ .id = "ADP1542" },
992 	{ .id = "" }
993 };
994 MODULE_DEVICE_TABLE(pnp, aha1542_pnp_ids);
995 
996 static int aha1542_pnp_probe(struct pnp_dev *pdev, const struct pnp_device_id *id)
997 {
998 	int indx;
999 	struct Scsi_Host *sh;
1000 
1001 	for (indx = 0; indx < ARRAY_SIZE(io); indx++) {
1002 		if (io[indx])
1003 			continue;
1004 
1005 		if (pnp_activate_dev(pdev) < 0)
1006 			continue;
1007 
1008 		io[indx] = pnp_port_start(pdev, 0);
1009 
1010 		/* The card can be queried for its DMA, we have
1011 		   the DMA set up that is enough */
1012 
1013 		dev_info(&pdev->dev, "ISAPnP found an AHA1535 at I/O 0x%03X", io[indx]);
1014 	}
1015 
1016 	sh = aha1542_hw_init(&driver_template, &pdev->dev, indx);
1017 	if (!sh)
1018 		return -ENODEV;
1019 
1020 	pnp_set_drvdata(pdev, sh);
1021 	return 0;
1022 }
1023 
1024 static void aha1542_pnp_remove(struct pnp_dev *pdev)
1025 {
1026 	aha1542_release(pnp_get_drvdata(pdev));
1027 	pnp_set_drvdata(pdev, NULL);
1028 }
1029 
1030 static struct pnp_driver aha1542_pnp_driver = {
1031 	.name		= "aha1542",
1032 	.id_table	= aha1542_pnp_ids,
1033 	.probe		= aha1542_pnp_probe,
1034 	.remove		= aha1542_pnp_remove,
1035 };
1036 static int pnp_registered;
1037 #endif /* CONFIG_PNP */
1038 
1039 static int __init aha1542_init(void)
1040 {
1041 	int ret = 0;
1042 
1043 #ifdef CONFIG_PNP
1044 	if (isapnp) {
1045 		ret = pnp_register_driver(&aha1542_pnp_driver);
1046 		if (!ret)
1047 			pnp_registered = 1;
1048 	}
1049 #endif
1050 	ret = isa_register_driver(&aha1542_isa_driver, MAXBOARDS);
1051 	if (!ret)
1052 		isa_registered = 1;
1053 
1054 #ifdef CONFIG_PNP
1055 	if (pnp_registered)
1056 		ret = 0;
1057 #endif
1058 	if (isa_registered)
1059 		ret = 0;
1060 
1061 	return ret;
1062 }
1063 
1064 static void __exit aha1542_exit(void)
1065 {
1066 #ifdef CONFIG_PNP
1067 	if (pnp_registered)
1068 		pnp_unregister_driver(&aha1542_pnp_driver);
1069 #endif
1070 	if (isa_registered)
1071 		isa_unregister_driver(&aha1542_isa_driver);
1072 }
1073 
1074 module_init(aha1542_init);
1075 module_exit(aha1542_exit);
1076