rio_linux.c 32.3 KB
Newer Older
L
Linus Torvalds 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35

/* rio_linux.c -- Linux driver for the Specialix RIO series cards. 
 *
 *
 *   (C) 1999 R.E.Wolff@BitWizard.nl
 *
 * Specialix pays for the development and support of this driver.
 * Please DO contact support@specialix.co.uk if you require
 * support. But please read the documentation (rio.txt) first.
 *
 *
 *
 *      This program is free software; you can redistribute it and/or
 *      modify it under the terms of the GNU General Public License as
 *      published by the Free Software Foundation; either version 2 of
 *      the License, or (at your option) any later version.
 *
 *      This program is distributed in the hope that it will be
 *      useful, but WITHOUT ANY WARRANTY; without even the implied
 *      warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
 *      PURPOSE.  See the GNU General Public License for more details.
 *
 *      You should have received a copy of the GNU General Public
 *      License along with this program; if not, write to the Free
 *      Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139,
 *      USA.
 *
 * Revision history:
 * $Log: rio.c,v $
 * Revision 1.1  1999/07/11 10:13:54  wolff
 * Initial revision
 *
 * */

#include <linux/module.h>
A
Andrew Morton 已提交
36
#include <linux/config.h>
L
Linus Torvalds 已提交
37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107
#include <linux/kdev_t.h>
#include <asm/io.h>
#include <linux/kernel.h>
#include <linux/sched.h>
#include <linux/ioport.h>
#include <linux/interrupt.h>
#include <linux/errno.h>
#include <linux/tty.h>
#include <linux/tty_flip.h>
#include <linux/mm.h>
#include <linux/serial.h>
#include <linux/fcntl.h>
#include <linux/major.h>
#include <linux/delay.h>
#include <linux/pci.h>
#include <linux/slab.h>
#include <linux/miscdevice.h>
#include <linux/init.h>

#include <linux/generic_serial.h>
#include <asm/uaccess.h>

#include "linux_compat.h"
#include "pkt.h"
#include "daemon.h"
#include "rio.h"
#include "riospace.h"
#include "cmdpkt.h"
#include "map.h"
#include "rup.h"
#include "port.h"
#include "riodrvr.h"
#include "rioinfo.h"
#include "func.h"
#include "errors.h"
#include "pci.h"

#include "parmmap.h"
#include "unixrup.h"
#include "board.h"
#include "host.h"
#include "phb.h"
#include "link.h"
#include "cmdblk.h"
#include "route.h"
#include "cirrus.h"
#include "rioioctl.h"
#include "param.h"
#include "protsts.h"
#include "rioboard.h"


#include "rio_linux.h"

/* I don't think that this driver can handle more than 512 ports on
one machine.  Specialix specifies max 4 boards in one machine. I don't
know why. If you want to try anyway you'll have to increase the number
of boards in rio.h.  You'll have to allocate more majors if you need
more than 512 ports.... */

#ifndef RIO_NORMAL_MAJOR0
/* This allows overriding on the compiler commandline, or in a "major.h" 
   include or something like that */
#define RIO_NORMAL_MAJOR0  154
#define RIO_NORMAL_MAJOR1  156
#endif

#ifndef PCI_DEVICE_ID_SPECIALIX_SX_XIO_IO8
#define PCI_DEVICE_ID_SPECIALIX_SX_XIO_IO8 0x2000
#endif

A
Andrew Morton 已提交
108
#ifndef RIO_WINDOW_LEN
L
Linus Torvalds 已提交
109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130
#define RIO_WINDOW_LEN 0x10000
#endif


/* Configurable options: 
   (Don't be too sure that it'll work if you toggle them) */

/* Am I paranoid or not ? ;-) */
#undef RIO_PARANOIA_CHECK


/* 20 -> 2000 per second. The card should rate-limit interrupts at 1000
   Hz, but it is user configurable. I don't recommend going above 1000
   Hz. The interrupt ratelimit might trigger if the interrupt is
   shared with a very active other device. 
   undef this if you want to disable the check....
*/
#define IRQ_RATE_LIMIT 200


/* These constants are derived from SCO Source */
static struct Conf
A
Andrew Morton 已提交
131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170
 RIOConf = {
	/* locator */ "RIO Config here",
					/* startuptime */ HZ * 2,
					/* how long to wait for card to run */
				/* slowcook */ 0,
				/* TRUE -> always use line disc. */
				/* intrpolltime */ 1,
				/* The frequency of OUR polls */
				/* breakinterval */ 25,
				/* x10 mS XXX: units seem to be 1ms not 10! -- REW */
				/* timer */ 10,
				/* mS */
	/* RtaLoadBase */ 0x7000,
	/* HostLoadBase */ 0x7C00,
				/* XpHz */ 5,
				/* number of Xprint hits per second */
				/* XpCps */ 120,
				/* Xprint characters per second */
				/* XpOn */ "\033d#",
				/* start Xprint for a wyse 60 */
				/* XpOff */ "\024",
				/* end Xprint for a wyse 60 */
				/* MaxXpCps */ 2000,
				/* highest Xprint speed */
				/* MinXpCps */ 10,
				/* slowest Xprint speed */
				/* SpinCmds */ 1,
				/* non-zero for mega fast boots */
					/* First Addr */ 0x0A0000,
					/* First address to look at */
					/* Last Addr */ 0xFF0000,
					/* Last address looked at */
				/* BufferSize */ 1024,
				/* Bytes per port of buffering */
				/* LowWater */ 256,
				/* how much data left before wakeup */
				/* LineLength */ 80,
				/* how wide is the console? */
				/* CmdTimeout */ HZ,
				/* how long a close command may take */
L
Linus Torvalds 已提交
171 172 173 174 175 176 177
};




/* Function prototypes */

A
Andrew Morton 已提交
178 179 180 181 182 183 184 185 186 187 188
static void rio_disable_tx_interrupts(void *ptr);
static void rio_enable_tx_interrupts(void *ptr);
static void rio_disable_rx_interrupts(void *ptr);
static void rio_enable_rx_interrupts(void *ptr);
static int rio_get_CD(void *ptr);
static void rio_shutdown_port(void *ptr);
static int rio_set_real_termios(void *ptr);
static void rio_hungup(void *ptr);
static void rio_close(void *ptr);
static int rio_chars_in_buffer(void *ptr);
static int rio_fw_ioctl(struct inode *inode, struct file *filp, unsigned int cmd, unsigned long arg);
L
Linus Torvalds 已提交
189 190
static int rio_init_drivers(void);

A
Andrew Morton 已提交
191
static void my_hd(void *addr, int len);
L
Linus Torvalds 已提交
192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210

static struct tty_driver *rio_driver, *rio_driver2;

/* The name "p" is a bit non-descript. But that's what the rio-lynxos
sources use all over the place. */
struct rio_info *p;

int rio_debug;


/* You can have the driver poll your card. 
    - Set rio_poll to 1 to poll every timer tick (10ms on Intel). 
      This is used when the card cannot use an interrupt for some reason.
*/
static int rio_poll = 1;


/* These are the only open spaces in my computer. Yours may have more
   or less.... */
A
Andrew Morton 已提交
211
static int rio_probe_addrs[] = { 0xc0000, 0xd0000, 0xe0000 };
L
Linus Torvalds 已提交
212

213
#define NR_RIO_ADDRS ARRAY_SIZE(rio_probe_addrs)
L
Linus Torvalds 已提交
214 215 216 217 218


/* Set the mask to all-ones. This alas, only supports 32 interrupts. 
   Some architectures may need more. -- Changed to LONG to
   support up to 64 bits on 64bit architectures. -- REW 20/06/99 */
A
Adrian Bunk 已提交
219
static long rio_irqmask = -1;
L
Linus Torvalds 已提交
220 221 222 223 224 225 226 227 228

MODULE_AUTHOR("Rogier Wolff <R.E.Wolff@bitwizard.nl>, Patrick van de Lageweg <patrick@bitwizard.nl>");
MODULE_DESCRIPTION("RIO driver");
MODULE_LICENSE("GPL");
module_param(rio_poll, int, 0);
module_param(rio_debug, int, 0644);
module_param(rio_irqmask, long, 0);

static struct real_driver rio_real_driver = {
A
Andrew Morton 已提交
229 230 231 232 233 234 235 236 237 238 239
	rio_disable_tx_interrupts,
	rio_enable_tx_interrupts,
	rio_disable_rx_interrupts,
	rio_enable_rx_interrupts,
	rio_get_CD,
	rio_shutdown_port,
	rio_set_real_termios,
	rio_chars_in_buffer,
	rio_close,
	rio_hungup,
	NULL
L
Linus Torvalds 已提交
240 241 242 243 244 245 246 247
};

/* 
 *  Firmware loader driver specific routines
 *
 */

static struct file_operations rio_fw_fops = {
A
Andrew Morton 已提交
248 249
	.owner = THIS_MODULE,
	.ioctl = rio_fw_ioctl,
L
Linus Torvalds 已提交
250 251 252 253 254 255 256 257 258 259 260 261 262 263
};

static struct miscdevice rio_fw_device = {
	RIOCTL_MISC_MINOR, "rioctl", &rio_fw_fops
};





#ifdef RIO_PARANOIA_CHECK

/* This doesn't work. Who's paranoid around here? Not me! */

A
Andrew Morton 已提交
264
static inline int rio_paranoia_check(struct rio_port const *port, char *name, const char *routine)
L
Linus Torvalds 已提交
265 266
{

A
Andrew Morton 已提交
267 268 269 270 271 272 273 274 275 276 277 278 279
	static const char *badmagic = KERN_ERR "rio: Warning: bad rio port magic number for device %s in %s\n";
	static const char *badinfo = KERN_ERR "rio: Warning: null rio port for device %s in %s\n";

	if (!port) {
		printk(badinfo, name, routine);
		return 1;
	}
	if (port->magic != RIO_MAGIC) {
		printk(badmagic, name, routine);
		return 1;
	}

	return 0;
L
Linus Torvalds 已提交
280 281 282 283 284 285 286
}
#else
#define rio_paranoia_check(a,b,c) 0
#endif


#ifdef DEBUG
A
Andrew Morton 已提交
287
static void my_hd(void *ad, int len)
L
Linus Torvalds 已提交
288
{
A
Andrew Morton 已提交
289 290 291 292
	int i, j, ch;
	unsigned char *addr = ad;

	for (i = 0; i < len; i += 16) {
293
		rio_dprintk(RIO_DEBUG_PARAM, "%08lx ", (unsigned long) addr + i);
A
Andrew Morton 已提交
294 295 296 297 298 299 300 301 302
		for (j = 0; j < 16; j++) {
			rio_dprintk(RIO_DEBUG_PARAM, "%02x %s", addr[j + i], (j == 7) ? " " : "");
		}
		for (j = 0; j < 16; j++) {
			ch = addr[j + i];
			rio_dprintk(RIO_DEBUG_PARAM, "%c", (ch < 0x20) ? '.' : ((ch > 0x7f) ? '.' : ch));
		}
		rio_dprintk(RIO_DEBUG_PARAM, "\n");
	}
L
Linus Torvalds 已提交
303 304 305 306 307 308
}
#else
#define my_hd(ad,len) do{/* nothing*/ } while (0)
#endif


A
Andrew Morton 已提交
309 310
/* Delay a number of jiffies, allowing a signal to interrupt */
int RIODelay(struct Port *PortP, int njiffies)
L
Linus Torvalds 已提交
311
{
A
Andrew Morton 已提交
312
	func_enter();
L
Linus Torvalds 已提交
313

A
Andrew Morton 已提交
314 315 316
	rio_dprintk(RIO_DEBUG_DELAY, "delaying %d jiffies\n", njiffies);
	msleep_interruptible(jiffies_to_msecs(njiffies));
	func_exit();
L
Linus Torvalds 已提交
317

A
Andrew Morton 已提交
318 319 320 321
	if (signal_pending(current))
		return RIO_FAIL;
	else
		return !RIO_FAIL;
L
Linus Torvalds 已提交
322 323 324
}


A
Andrew Morton 已提交
325 326
/* Delay a number of jiffies, disallowing a signal to interrupt */
int RIODelay_ni(struct Port *PortP, int njiffies)
L
Linus Torvalds 已提交
327
{
A
Andrew Morton 已提交
328
	func_enter();
L
Linus Torvalds 已提交
329

A
Andrew Morton 已提交
330 331 332 333
	rio_dprintk(RIO_DEBUG_DELAY, "delaying %d jiffies (ni)\n", njiffies);
	msleep(jiffies_to_msecs(njiffies));
	func_exit();
	return !RIO_FAIL;
L
Linus Torvalds 已提交
334 335
}

336
void rio_copy_to_card(void *from, void __iomem *to, int len)
337 338 339
{
	rio_memcpy_toio(NULL, to, from, len);
}
L
Linus Torvalds 已提交
340 341 342 343 344 345

int rio_minor(struct tty_struct *tty)
{
	return tty->index + (tty->driver == rio_driver) ? 0 : 256;
}

A
Andrew Morton 已提交
346
static int rio_set_real_termios(void *ptr)
L
Linus Torvalds 已提交
347
{
348
	return RIOParam((struct Port *) ptr, CONFIG, 1, 1);
L
Linus Torvalds 已提交
349 350 351
}


A
Andrew Morton 已提交
352
static void rio_reset_interrupt(struct Host *HostP)
L
Linus Torvalds 已提交
353
{
A
Andrew Morton 已提交
354
	func_enter();
L
Linus Torvalds 已提交
355

A
Andrew Morton 已提交
356 357 358 359
	switch (HostP->Type) {
	case RIO_AT:
	case RIO_MCA:
	case RIO_PCI:
360
		writeb(0xFF, &HostP->ResetInt);
A
Andrew Morton 已提交
361
	}
L
Linus Torvalds 已提交
362

A
Andrew Morton 已提交
363
	func_exit();
L
Linus Torvalds 已提交
364 365 366
}


A
Andrew Morton 已提交
367
static irqreturn_t rio_interrupt(int irq, void *ptr, struct pt_regs *regs)
L
Linus Torvalds 已提交
368
{
A
Andrew Morton 已提交
369 370
	struct Host *HostP;
	func_enter();
L
Linus Torvalds 已提交
371

A
Andrew Morton 已提交
372 373
	HostP = (struct Host *) ptr;	/* &p->RIOHosts[(long)ptr]; */
	rio_dprintk(RIO_DEBUG_IFLOW, "rio: enter rio_interrupt (%d/%d)\n", irq, HostP->Ivec);
L
Linus Torvalds 已提交
374

A
Andrew Morton 已提交
375 376
	/* AAargh! The order in which to do these things is essential and
	   not trivial.
L
Linus Torvalds 已提交
377

A
Andrew Morton 已提交
378 379 380 381
	   - hardware twiddling goes before "recursive". Otherwise when we
	   poll the card, and a recursive interrupt happens, we won't
	   ack the card, so it might keep on interrupting us. (especially
	   level sensitive interrupt systems like PCI).
L
Linus Torvalds 已提交
382

A
Andrew Morton 已提交
383 384
	   - Rate limit goes before hardware twiddling. Otherwise we won't
	   catch a card that has gone bonkers.
L
Linus Torvalds 已提交
385

A
Andrew Morton 已提交
386 387 388 389 390
	   - The "initialized" test goes after the hardware twiddling. Otherwise
	   the card will stick us in the interrupt routine again.

	   - The initialized test goes before recursive.
	 */
L
Linus Torvalds 已提交
391

A
Andrew Morton 已提交
392 393 394 395 396 397 398 399 400 401
	rio_dprintk(RIO_DEBUG_IFLOW, "rio: We've have noticed the interrupt\n");
	if (HostP->Ivec == irq) {
		/* Tell the card we've noticed the interrupt. */
		rio_reset_interrupt(HostP);
	}

	if ((HostP->Flags & RUN_STATE) != RC_RUNNING)
		return IRQ_HANDLED;

	if (test_and_set_bit(RIO_BOARD_INTR_LOCK, &HostP->locks)) {
402
		printk(KERN_ERR "Recursive interrupt! (host %p/irq%d)\n", ptr, HostP->Ivec);
A
Andrew Morton 已提交
403 404 405 406 407
		return IRQ_HANDLED;
	}

	RIOServiceHost(p, HostP, irq);

408
	rio_dprintk(RIO_DEBUG_IFLOW, "riointr() doing host %p type %d\n", ptr, HostP->Type);
A
Andrew Morton 已提交
409 410 411 412 413

	clear_bit(RIO_BOARD_INTR_LOCK, &HostP->locks);
	rio_dprintk(RIO_DEBUG_IFLOW, "rio: exit rio_interrupt (%d/%d)\n", irq, HostP->Ivec);
	func_exit();
	return IRQ_HANDLED;
L
Linus Torvalds 已提交
414 415 416
}


A
Andrew Morton 已提交
417
static void rio_pollfunc(unsigned long data)
L
Linus Torvalds 已提交
418
{
A
Andrew Morton 已提交
419
	func_enter();
L
Linus Torvalds 已提交
420

A
Andrew Morton 已提交
421 422 423
	rio_interrupt(0, &p->RIOHosts[data], NULL);
	p->RIOHosts[data].timer.expires = jiffies + rio_poll;
	add_timer(&p->RIOHosts[data].timer);
L
Linus Torvalds 已提交
424

A
Andrew Morton 已提交
425
	func_exit();
L
Linus Torvalds 已提交
426 427 428 429 430 431 432 433 434 435 436
}


/* ********************************************************************** *
 *                Here are the routines that actually                     *
 *              interface with the generic_serial driver                  *
 * ********************************************************************** */

/* Ehhm. I don't know how to fiddle with interrupts on the Specialix 
   cards. ....   Hmm. Ok I figured it out. You don't.  -- REW */

A
Andrew Morton 已提交
437
static void rio_disable_tx_interrupts(void *ptr)
L
Linus Torvalds 已提交
438
{
A
Andrew Morton 已提交
439
	func_enter();
L
Linus Torvalds 已提交
440

A
Andrew Morton 已提交
441
	/*  port->gs.flags &= ~GS_TX_INTEN; */
L
Linus Torvalds 已提交
442

A
Andrew Morton 已提交
443
	func_exit();
L
Linus Torvalds 已提交
444 445 446
}


A
Andrew Morton 已提交
447
static void rio_enable_tx_interrupts(void *ptr)
L
Linus Torvalds 已提交
448
{
A
Andrew Morton 已提交
449 450
	struct Port *PortP = ptr;
	/* int hn; */
L
Linus Torvalds 已提交
451

A
Andrew Morton 已提交
452
	func_enter();
L
Linus Torvalds 已提交
453

A
Andrew Morton 已提交
454
	/* hn = PortP->HostP - p->RIOHosts;
L
Linus Torvalds 已提交
455

A
Andrew Morton 已提交
456 457
	   rio_dprintk (RIO_DEBUG_TTY, "Pushing host %d\n", hn);
	   rio_interrupt (-1,(void *) hn, NULL); */
L
Linus Torvalds 已提交
458

A
Andrew Morton 已提交
459
	RIOTxEnable((char *) PortP);
L
Linus Torvalds 已提交
460

A
Andrew Morton 已提交
461 462 463 464 465
	/*
	 * In general we cannot count on "tx empty" interrupts, although
	 * the interrupt routine seems to be able to tell the difference.
	 */
	PortP->gs.flags &= ~GS_TX_INTEN;
L
Linus Torvalds 已提交
466

A
Andrew Morton 已提交
467
	func_exit();
L
Linus Torvalds 已提交
468 469 470
}


A
Andrew Morton 已提交
471
static void rio_disable_rx_interrupts(void *ptr)
L
Linus Torvalds 已提交
472
{
A
Andrew Morton 已提交
473 474
	func_enter();
	func_exit();
L
Linus Torvalds 已提交
475 476
}

A
Andrew Morton 已提交
477
static void rio_enable_rx_interrupts(void *ptr)
L
Linus Torvalds 已提交
478
{
A
Andrew Morton 已提交
479 480 481
	/*  struct rio_port *port = ptr; */
	func_enter();
	func_exit();
L
Linus Torvalds 已提交
482 483 484 485
}


/* Jeez. Isn't this simple?  */
A
Andrew Morton 已提交
486
static int rio_get_CD(void *ptr)
L
Linus Torvalds 已提交
487
{
A
Andrew Morton 已提交
488 489 490 491 492
	struct Port *PortP = ptr;
	int rv;

	func_enter();
	rv = (PortP->ModemState & MSVR1_CD) != 0;
L
Linus Torvalds 已提交
493

A
Andrew Morton 已提交
494
	rio_dprintk(RIO_DEBUG_INIT, "Getting CD status: %d\n", rv);
L
Linus Torvalds 已提交
495

A
Andrew Morton 已提交
496 497
	func_exit();
	return rv;
L
Linus Torvalds 已提交
498 499 500 501 502
}


/* Jeez. Isn't this simple? Actually, we can sync with the actual port
   by just pushing stuff into the queue going to the port... */
A
Andrew Morton 已提交
503
static int rio_chars_in_buffer(void *ptr)
L
Linus Torvalds 已提交
504
{
A
Andrew Morton 已提交
505
	func_enter();
L
Linus Torvalds 已提交
506

A
Andrew Morton 已提交
507 508
	func_exit();
	return 0;
L
Linus Torvalds 已提交
509 510 511 512
}


/* Nothing special here... */
A
Andrew Morton 已提交
513
static void rio_shutdown_port(void *ptr)
L
Linus Torvalds 已提交
514
{
A
Andrew Morton 已提交
515
	struct Port *PortP;
L
Linus Torvalds 已提交
516

A
Andrew Morton 已提交
517
	func_enter();
L
Linus Torvalds 已提交
518

A
Andrew Morton 已提交
519 520 521
	PortP = (struct Port *) ptr;
	PortP->gs.tty = NULL;
	func_exit();
L
Linus Torvalds 已提交
522 523 524 525 526 527 528 529 530 531
}


/* I haven't the foggiest why the decrement use count has to happen
   here. The whole linux serial drivers stuff needs to be redesigned.
   My guess is that this is a hack to minimize the impact of a bug
   elsewhere. Thinking about it some more. (try it sometime) Try
   running minicom on a serial port that is driven by a modularized
   driver. Have the modem hangup. Then remove the driver module. Then
   exit minicom.  I expect an "oops".  -- REW */
A
Andrew Morton 已提交
532
static void rio_hungup(void *ptr)
L
Linus Torvalds 已提交
533
{
A
Andrew Morton 已提交
534 535 536
	struct Port *PortP;

	func_enter();
L
Linus Torvalds 已提交
537

A
Andrew Morton 已提交
538 539
	PortP = (struct Port *) ptr;
	PortP->gs.tty = NULL;
L
Linus Torvalds 已提交
540

A
Andrew Morton 已提交
541
	func_exit();
L
Linus Torvalds 已提交
542 543 544 545 546 547 548
}


/* The standard serial_close would become shorter if you'd wrap it like
   this. 
   rs_close (...){save_flags;cli;real_close();dec_use_count;restore_flags;}
 */
A
Andrew Morton 已提交
549
static void rio_close(void *ptr)
L
Linus Torvalds 已提交
550
{
A
Andrew Morton 已提交
551
	struct Port *PortP;
L
Linus Torvalds 已提交
552

A
Andrew Morton 已提交
553
	func_enter();
L
Linus Torvalds 已提交
554

A
Andrew Morton 已提交
555
	PortP = (struct Port *) ptr;
L
Linus Torvalds 已提交
556

A
Andrew Morton 已提交
557
	riotclose(ptr);
L
Linus Torvalds 已提交
558

A
Andrew Morton 已提交
559 560 561 562
	if (PortP->gs.count) {
		printk(KERN_ERR "WARNING port count:%d\n", PortP->gs.count);
		PortP->gs.count = 0;
	}
L
Linus Torvalds 已提交
563

A
Andrew Morton 已提交
564 565
	PortP->gs.tty = NULL;
	func_exit();
L
Linus Torvalds 已提交
566 567 568 569
}



A
Andrew Morton 已提交
570
static int rio_fw_ioctl(struct inode *inode, struct file *filp, unsigned int cmd, unsigned long arg)
L
Linus Torvalds 已提交
571
{
A
Andrew Morton 已提交
572 573
	int rc = 0;
	func_enter();
L
Linus Torvalds 已提交
574

A
Andrew Morton 已提交
575
	/* The "dev" argument isn't used. */
A
Al Viro 已提交
576
	rc = riocontrol(p, 0, cmd, arg, capable(CAP_SYS_ADMIN));
L
Linus Torvalds 已提交
577

A
Andrew Morton 已提交
578 579
	func_exit();
	return rc;
L
Linus Torvalds 已提交
580 581
}

A
Andrew Morton 已提交
582
extern int RIOShortCommand(struct rio_info *p, struct Port *PortP, int command, int len, int arg);
L
Linus Torvalds 已提交
583

A
Andrew Morton 已提交
584
static int rio_ioctl(struct tty_struct *tty, struct file *filp, unsigned int cmd, unsigned long arg)
L
Linus Torvalds 已提交
585
{
A
Al Viro 已提交
586
	void __user *argp = (void __user *)arg;
A
Andrew Morton 已提交
587 588 589
	int rc;
	struct Port *PortP;
	int ival;
L
Linus Torvalds 已提交
590

A
Andrew Morton 已提交
591
	func_enter();
L
Linus Torvalds 已提交
592

A
Andrew Morton 已提交
593
	PortP = (struct Port *) tty->driver_data;
L
Linus Torvalds 已提交
594

A
Andrew Morton 已提交
595 596 597
	rc = 0;
	switch (cmd) {
	case TIOCSSOFTCAR:
A
Al Viro 已提交
598
		if ((rc = get_user(ival, (unsigned __user *) argp)) == 0) {
A
Andrew Morton 已提交
599 600 601 602 603
			tty->termios->c_cflag = (tty->termios->c_cflag & ~CLOCAL) | (ival ? CLOCAL : 0);
		}
		break;
	case TIOCGSERIAL:
		rc = -EFAULT;
A
Al Viro 已提交
604 605
		if (access_ok(VERIFY_WRITE, argp, sizeof(struct serial_struct)))
			rc = gs_getserial(&PortP->gs, argp);
A
Andrew Morton 已提交
606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634
		break;
	case TCSBRK:
		if (PortP->State & RIO_DELETED) {
			rio_dprintk(RIO_DEBUG_TTY, "BREAK on deleted RTA\n");
			rc = -EIO;
		} else {
			if (RIOShortCommand(p, PortP, SBREAK, 2, 250) == RIO_FAIL) {
				rio_dprintk(RIO_DEBUG_INTR, "SBREAK RIOShortCommand failed\n");
				rc = -EIO;
			}
		}
		break;
	case TCSBRKP:
		if (PortP->State & RIO_DELETED) {
			rio_dprintk(RIO_DEBUG_TTY, "BREAK on deleted RTA\n");
			rc = -EIO;
		} else {
			int l;
			l = arg ? arg * 100 : 250;
			if (l > 255)
				l = 255;
			if (RIOShortCommand(p, PortP, SBREAK, 2, arg ? arg * 100 : 250) == RIO_FAIL) {
				rio_dprintk(RIO_DEBUG_INTR, "SBREAK RIOShortCommand failed\n");
				rc = -EIO;
			}
		}
		break;
	case TIOCSSERIAL:
		rc = -EFAULT;
A
Al Viro 已提交
635 636
		if (access_ok(VERIFY_READ, argp, sizeof(struct serial_struct)))
			rc = gs_setserial(&PortP->gs, argp);
A
Andrew Morton 已提交
637 638 639 640 641 642 643
		break;
	default:
		rc = -ENOIOCTLCMD;
		break;
	}
	func_exit();
	return rc;
L
Linus Torvalds 已提交
644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662
}


/* The throttle/unthrottle scheme for the Specialix card is different
 * from other drivers and deserves some explanation. 
 * The Specialix hardware takes care of XON/XOFF
 * and CTS/RTS flow control itself.  This means that all we have to
 * do when signalled by the upper tty layer to throttle/unthrottle is
 * to make a note of it here.  When we come to read characters from the
 * rx buffers on the card (rio_receive_chars()) we look to see if the
 * upper layer can accept more (as noted here in rio_rx_throt[]). 
 * If it can't we simply don't remove chars from the cards buffer. 
 * When the tty layer can accept chars, we again note that here and when
 * rio_receive_chars() is called it will remove them from the cards buffer.
 * The card will notice that a ports buffer has drained below some low
 * water mark and will unflow control the line itself, using whatever
 * flow control scheme is in use for that port. -- Simon Allen
 */

A
Andrew Morton 已提交
663
static void rio_throttle(struct tty_struct *tty)
L
Linus Torvalds 已提交
664
{
A
Andrew Morton 已提交
665 666 667 668 669 670 671 672 673 674 675 676
	struct Port *port = (struct Port *) tty->driver_data;

	func_enter();
	/* If the port is using any type of input flow
	 * control then throttle the port.
	 */

	if ((tty->termios->c_cflag & CRTSCTS) || (I_IXOFF(tty))) {
		port->State |= RIO_THROTTLE_RX;
	}

	func_exit();
L
Linus Torvalds 已提交
677 678 679
}


A
Andrew Morton 已提交
680
static void rio_unthrottle(struct tty_struct *tty)
L
Linus Torvalds 已提交
681
{
A
Andrew Morton 已提交
682
	struct Port *port = (struct Port *) tty->driver_data;
L
Linus Torvalds 已提交
683

A
Andrew Morton 已提交
684 685 686 687 688
	func_enter();
	/* Always unthrottle even if flow control is not enabled on
	 * this port in case we disabled flow control while the port
	 * was throttled
	 */
L
Linus Torvalds 已提交
689

A
Andrew Morton 已提交
690
	port->State &= ~RIO_THROTTLE_RX;
L
Linus Torvalds 已提交
691

A
Andrew Morton 已提交
692 693
	func_exit();
	return;
L
Linus Torvalds 已提交
694 695 696 697 698 699 700 701 702 703 704
}





/* ********************************************************************** *
 *                    Here are the initialization routines.               *
 * ********************************************************************** */


A
Andrew Morton 已提交
705
static struct vpd_prom *get_VPD_PROM(struct Host *hp)
L
Linus Torvalds 已提交
706
{
A
Andrew Morton 已提交
707 708 709 710 711 712
	static struct vpd_prom vpdp;
	char *p;
	int i;

	func_enter();
	rio_dprintk(RIO_DEBUG_PROBE, "Going to verify vpd prom at %p.\n", hp->Caddr + RIO_VPD_ROM);
L
Linus Torvalds 已提交
713

A
Andrew Morton 已提交
714 715 716 717
	p = (char *) &vpdp;
	for (i = 0; i < sizeof(struct vpd_prom); i++)
		*p++ = readb(hp->Caddr + RIO_VPD_ROM + i * 2);
	/* read_rio_byte (hp, RIO_VPD_ROM + i*2); */
L
Linus Torvalds 已提交
718

A
Andrew Morton 已提交
719 720 721
	/* Terminate the identifier string.
	 *** requires one extra byte in struct vpd_prom *** */
	*p++ = 0;
L
Linus Torvalds 已提交
722

A
Andrew Morton 已提交
723 724
	if (rio_debug & RIO_DEBUG_PROBE)
		my_hd((char *) &vpdp, 0x20);
L
Linus Torvalds 已提交
725

A
Andrew Morton 已提交
726
	func_exit();
L
Linus Torvalds 已提交
727

A
Andrew Morton 已提交
728
	return &vpdp;
L
Linus Torvalds 已提交
729 730 731
}

static struct tty_operations rio_ops = {
A
Andrew Morton 已提交
732
	.open = riotopen,
L
Linus Torvalds 已提交
733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783
	.close = gs_close,
	.write = gs_write,
	.put_char = gs_put_char,
	.flush_chars = gs_flush_chars,
	.write_room = gs_write_room,
	.chars_in_buffer = gs_chars_in_buffer,
	.flush_buffer = gs_flush_buffer,
	.ioctl = rio_ioctl,
	.throttle = rio_throttle,
	.unthrottle = rio_unthrottle,
	.set_termios = gs_set_termios,
	.stop = gs_stop,
	.start = gs_start,
	.hangup = gs_hangup,
};

static int rio_init_drivers(void)
{
	int error = -ENOMEM;

	rio_driver = alloc_tty_driver(256);
	if (!rio_driver)
		goto out;
	rio_driver2 = alloc_tty_driver(256);
	if (!rio_driver2)
		goto out1;

	func_enter();

	rio_driver->owner = THIS_MODULE;
	rio_driver->driver_name = "specialix_rio";
	rio_driver->name = "ttySR";
	rio_driver->major = RIO_NORMAL_MAJOR0;
	rio_driver->type = TTY_DRIVER_TYPE_SERIAL;
	rio_driver->subtype = SERIAL_TYPE_NORMAL;
	rio_driver->init_termios = tty_std_termios;
	rio_driver->init_termios.c_cflag = B9600 | CS8 | CREAD | HUPCL | CLOCAL;
	rio_driver->flags = TTY_DRIVER_REAL_RAW;
	tty_set_operations(rio_driver, &rio_ops);

	rio_driver2->owner = THIS_MODULE;
	rio_driver2->driver_name = "specialix_rio";
	rio_driver2->name = "ttySR";
	rio_driver2->major = RIO_NORMAL_MAJOR1;
	rio_driver2->type = TTY_DRIVER_TYPE_SERIAL;
	rio_driver2->subtype = SERIAL_TYPE_NORMAL;
	rio_driver2->init_termios = tty_std_termios;
	rio_driver2->init_termios.c_cflag = B9600 | CS8 | CREAD | HUPCL | CLOCAL;
	rio_driver2->flags = TTY_DRIVER_REAL_RAW;
	tty_set_operations(rio_driver2, &rio_ops);

A
Andrew Morton 已提交
784
	rio_dprintk(RIO_DEBUG_INIT, "set_termios = %p\n", gs_set_termios);
L
Linus Torvalds 已提交
785 786 787 788 789 790 791

	if ((error = tty_register_driver(rio_driver)))
		goto out2;
	if ((error = tty_register_driver(rio_driver2)))
		goto out3;
	func_exit();
	return 0;
A
Andrew Morton 已提交
792
      out3:
L
Linus Torvalds 已提交
793
	tty_unregister_driver(rio_driver);
A
Andrew Morton 已提交
794
      out2:
L
Linus Torvalds 已提交
795
	put_tty_driver(rio_driver2);
A
Andrew Morton 已提交
796
      out1:
L
Linus Torvalds 已提交
797
	put_tty_driver(rio_driver);
A
Andrew Morton 已提交
798 799
      out:
	printk(KERN_ERR "rio: Couldn't register a rio driver, error = %d\n", error);
L
Linus Torvalds 已提交
800 801 802 803
	return 1;
}


A
Andrew Morton 已提交
804
static void *ckmalloc(int size)
L
Linus Torvalds 已提交
805
{
A
Andrew Morton 已提交
806
	void *p;
L
Linus Torvalds 已提交
807

A
Andrew Morton 已提交
808 809 810 811
	p = kmalloc(size, GFP_KERNEL);
	if (p)
		memset(p, 0, size);
	return p;
L
Linus Torvalds 已提交
812 813 814 815
}



A
Andrew Morton 已提交
816
static int rio_init_datastructures(void)
L
Linus Torvalds 已提交
817
{
A
Andrew Morton 已提交
818 819 820 821 822 823 824 825 826 827
	int i;
	struct Port *port;
	func_enter();

	/* Many drivers statically allocate the maximum number of ports
	   There is no reason not to allocate them dynamically. Is there? -- REW */
	/* However, the RIO driver allows users to configure their first
	   RTA as the ports numbered 504-511. We therefore need to allocate
	   the whole range. :-(   -- REW */

L
Linus Torvalds 已提交
828 829 830 831
#define RI_SZ   sizeof(struct rio_info)
#define HOST_SZ sizeof(struct Host)
#define PORT_SZ sizeof(struct Port *)
#define TMIO_SZ sizeof(struct termios *)
832
	rio_dprintk(RIO_DEBUG_INIT, "getting : %Zd %Zd %Zd %Zd %Zd bytes\n", RI_SZ, RIO_HOSTS * HOST_SZ, RIO_PORTS * PORT_SZ, RIO_PORTS * TMIO_SZ, RIO_PORTS * TMIO_SZ);
A
Andrew Morton 已提交
833 834 835 836 837 838 839 840 841

	if (!(p = ckmalloc(RI_SZ)))
		goto free0;
	if (!(p->RIOHosts = ckmalloc(RIO_HOSTS * HOST_SZ)))
		goto free1;
	if (!(p->RIOPortp = ckmalloc(RIO_PORTS * PORT_SZ)))
		goto free2;
	p->RIOConf = RIOConf;
	rio_dprintk(RIO_DEBUG_INIT, "Got : %p %p %p\n", p, p->RIOHosts, p->RIOPortp);
L
Linus Torvalds 已提交
842 843

#if 1
A
Andrew Morton 已提交
844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861
	for (i = 0; i < RIO_PORTS; i++) {
		port = p->RIOPortp[i] = ckmalloc(sizeof(struct Port));
		if (!port) {
			goto free6;
		}
		rio_dprintk(RIO_DEBUG_INIT, "initing port %d (%d)\n", i, port->Mapped);
		port->PortNum = i;
		port->gs.magic = RIO_MAGIC;
		port->gs.close_delay = HZ / 2;
		port->gs.closing_wait = 30 * HZ;
		port->gs.rd = &rio_real_driver;
		spin_lock_init(&port->portSem);
		/*
		 * Initializing wait queue
		 */
		init_waitqueue_head(&port->gs.open_wait);
		init_waitqueue_head(&port->gs.close_wait);
	}
L
Linus Torvalds 已提交
862
#else
A
Andrew Morton 已提交
863
	/* We could postpone initializing them to when they are configured. */
L
Linus Torvalds 已提交
864 865 866 867
#endif



A
Andrew Morton 已提交
868 869 870 871
	if (rio_debug & RIO_DEBUG_INIT) {
		my_hd(&rio_real_driver, sizeof(rio_real_driver));
	}

L
Linus Torvalds 已提交
872

A
Andrew Morton 已提交
873 874 875 876 877
	func_exit();
	return 0;

      free6:for (i--; i >= 0; i--)
		kfree(p->RIOPortp[i]);
L
Linus Torvalds 已提交
878 879
/*free5:
 free4:
A
Andrew Morton 已提交
880 881 882 883 884 885 886
 free3:*/ kfree(p->RIOPortp);
      free2:kfree(p->RIOHosts);
      free1:
	rio_dprintk(RIO_DEBUG_INIT, "Not enough memory! %p %p %p\n", p, p->RIOHosts, p->RIOPortp);
	kfree(p);
      free0:
	return -ENOMEM;
L
Linus Torvalds 已提交
887 888
}

A
Andrew Morton 已提交
889
static void __exit rio_release_drivers(void)
L
Linus Torvalds 已提交
890
{
A
Andrew Morton 已提交
891 892 893 894 895 896
	func_enter();
	tty_unregister_driver(rio_driver2);
	tty_unregister_driver(rio_driver);
	put_tty_driver(rio_driver2);
	put_tty_driver(rio_driver);
	func_exit();
L
Linus Torvalds 已提交
897 898 899 900 901 902 903 904 905 906
}


#ifdef CONFIG_PCI
 /* This was written for SX, but applies to RIO too...
    (including bugs....)

    There is another bit besides Bit 17. Turning that bit off
    (on boards shipped with the fix in the eeprom) results in a 
    hang on the next access to the card. 
A
Andrew Morton 已提交
907
  */
L
Linus Torvalds 已提交
908 909 910 911 912 913 914 915 916 917 918 919

 /******************************************************** 
 * Setting bit 17 in the CNTRL register of the PLX 9050  * 
 * chip forces a retry on writes while a read is pending.*
 * This is to prevent the card locking up on Intel Xeon  *
 * multiprocessor systems with the NX chipset.    -- NV  *
 ********************************************************/

/* Newer cards are produced with this bit set from the configuration
   EEprom.  As the bit is read/write for the CPU, we can fix it here,
   if we detect that it isn't set correctly. -- REW */

A
Andrew Morton 已提交
920
static void fix_rio_pci(struct pci_dev *pdev)
L
Linus Torvalds 已提交
921
{
922
	unsigned long hwbase;
A
Al Viro 已提交
923
	unsigned char __iomem *rebase;
A
Andrew Morton 已提交
924
	unsigned int t;
L
Linus Torvalds 已提交
925 926 927 928

#define CNTRL_REG_OFFSET        0x50
#define CNTRL_REG_GOODVALUE     0x18260000

929 930
	hwbase = pci_resource_start(pdev, 0);
	rebase = ioremap(hwbase, 0x80);
A
Andrew Morton 已提交
931 932 933 934 935
	t = readl(rebase + CNTRL_REG_OFFSET);
	if (t != CNTRL_REG_GOODVALUE) {
		printk(KERN_DEBUG "rio: performing cntrl reg fix: %08x -> %08x\n", t, CNTRL_REG_GOODVALUE);
		writel(CNTRL_REG_GOODVALUE, rebase + CNTRL_REG_OFFSET);
	}
936
	iounmap(rebase);
L
Linus Torvalds 已提交
937 938 939 940
}
#endif


A
Andrew Morton 已提交
941
static int __init rio_init(void)
L
Linus Torvalds 已提交
942
{
A
Andrew Morton 已提交
943 944 945 946 947 948
	int found = 0;
	int i;
	struct Host *hp;
	int retval;
	struct vpd_prom *vpdp;
	int okboard;
L
Linus Torvalds 已提交
949 950

#ifdef CONFIG_PCI
A
Andrew Morton 已提交
951 952
	struct pci_dev *pdev = NULL;
	unsigned short tshort;
L
Linus Torvalds 已提交
953 954
#endif

A
Andrew Morton 已提交
955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972
	func_enter();
	rio_dprintk(RIO_DEBUG_INIT, "Initing rio module... (rio_debug=%d)\n", rio_debug);

	if (abs((long) (&rio_debug) - rio_debug) < 0x10000) {
		printk(KERN_WARNING "rio: rio_debug is an address, instead of a value. " "Assuming -1. Was %x/%p.\n", rio_debug, &rio_debug);
		rio_debug = -1;
	}

	if (misc_register(&rio_fw_device) < 0) {
		printk(KERN_ERR "RIO: Unable to register firmware loader driver.\n");
		return -EIO;
	}

	retval = rio_init_datastructures();
	if (retval < 0) {
		misc_deregister(&rio_fw_device);
		return retval;
	}
L
Linus Torvalds 已提交
973
#ifdef CONFIG_PCI
A
Andrew Morton 已提交
974 975
	/* First look for the JET devices: */
	while ((pdev = pci_get_device(PCI_VENDOR_ID_SPECIALIX, PCI_DEVICE_ID_SPECIALIX_SX_XIO_IO8, pdev))) {
976 977
		u32 tint;

A
Andrew Morton 已提交
978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997
		if (pci_enable_device(pdev))
			continue;

		/* Specialix has a whole bunch of cards with
		   0x2000 as the device ID. They say its because
		   the standard requires it. Stupid standard. */
		/* It seems that reading a word doesn't work reliably on 2.0.
		   Also, reading a non-aligned dword doesn't work. So we read the
		   whole dword at 0x2c and extract the word at 0x2e (SUBSYSTEM_ID)
		   ourselves */
		pci_read_config_dword(pdev, 0x2c, &tint);
		tshort = (tint >> 16) & 0xffff;
		rio_dprintk(RIO_DEBUG_PROBE, "Got a specialix card: %x.\n", tint);
		if (tshort != 0x0100) {
			rio_dprintk(RIO_DEBUG_PROBE, "But it's not a RIO card (%d)...\n", tshort);
			continue;
		}
		rio_dprintk(RIO_DEBUG_PROBE, "cp1\n");

		hp = &p->RIOHosts[p->RIONumHosts];
998
		hp->PaddrP = pci_resource_start(pdev, 2);
A
Andrew Morton 已提交
999 1000 1001 1002
		hp->Ivec = pdev->irq;
		if (((1 << hp->Ivec) & rio_irqmask) == 0)
			hp->Ivec = 0;
		hp->Caddr = ioremap(p->RIOHosts[p->RIONumHosts].PaddrP, RIO_WINDOW_LEN);
A
Al Viro 已提交
1003
		hp->CardP = (struct DpRam __iomem *) hp->Caddr;
A
Andrew Morton 已提交
1004
		hp->Type = RIO_PCI;
1005
		hp->Copy = rio_copy_to_card;
A
Andrew Morton 已提交
1006 1007 1008 1009 1010 1011
		hp->Mode = RIO_PCI_BOOT_FROM_RAM;
		spin_lock_init(&hp->HostLock);
		rio_reset_interrupt(hp);
		rio_start_card_running(hp);

		rio_dprintk(RIO_DEBUG_PROBE, "Going to test it (%p/%p).\n", (void *) p->RIOHosts[p->RIONumHosts].PaddrP, p->RIOHosts[p->RIONumHosts].Caddr);
1012
		if (RIOBoardTest(p->RIOHosts[p->RIONumHosts].PaddrP, p->RIOHosts[p->RIONumHosts].Caddr, RIO_PCI, 0) == 0) {
A
Andrew Morton 已提交
1013
			rio_dprintk(RIO_DEBUG_INIT, "Done RIOBoardTest\n");
1014
			writeb(0xFF, &p->RIOHosts[p->RIONumHosts].ResetInt);
A
Andrew Morton 已提交
1015
			p->RIOHosts[p->RIONumHosts].UniqueNum =
1016 1017
			    ((readb(&p->RIOHosts[p->RIONumHosts].Unique[0]) & 0xFF) << 0) |
			    ((readb(&p->RIOHosts[p->RIONumHosts].Unique[1]) & 0xFF) << 8) | ((readb(&p->RIOHosts[p->RIONumHosts].Unique[2]) & 0xFF) << 16) | ((readb(&p->RIOHosts[p->RIONumHosts].Unique[3]) & 0xFF) << 24);
A
Andrew Morton 已提交
1018 1019 1020
			rio_dprintk(RIO_DEBUG_PROBE, "Hmm Tested ok, uniqid = %x.\n", p->RIOHosts[p->RIONumHosts].UniqueNum);

			fix_rio_pci(pdev);
1021
			p->RIOLastPCISearch = 0;
A
Andrew Morton 已提交
1022 1023 1024
			p->RIONumHosts++;
			found++;
		} else {
A
Al Viro 已提交
1025
			iounmap(p->RIOHosts[p->RIONumHosts].Caddr);
A
Andrew Morton 已提交
1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041
		}
	}

	/* Then look for the older PCI card.... : */

	/* These older PCI cards have problems (only byte-mode access is
	   supported), which makes them a bit awkward to support.
	   They also have problems sharing interrupts. Be careful.
	   (The driver now refuses to share interrupts for these
	   cards. This should be sufficient).
	 */

	/* Then look for the older RIO/PCI devices: */
	while ((pdev = pci_get_device(PCI_VENDOR_ID_SPECIALIX, PCI_DEVICE_ID_SPECIALIX_RIO, pdev))) {
		if (pci_enable_device(pdev))
			continue;
L
Linus Torvalds 已提交
1042 1043

#ifdef CONFIG_RIO_OLDPCI
A
Andrew Morton 已提交
1044
		hp = &p->RIOHosts[p->RIONumHosts];
1045
		hp->PaddrP = pci_resource_start(pdev, 0);
A
Andrew Morton 已提交
1046 1047 1048 1049 1050
		hp->Ivec = pdev->irq;
		if (((1 << hp->Ivec) & rio_irqmask) == 0)
			hp->Ivec = 0;
		hp->Ivec |= 0x8000;	/* Mark as non-sharable */
		hp->Caddr = ioremap(p->RIOHosts[p->RIONumHosts].PaddrP, RIO_WINDOW_LEN);
A
Al Viro 已提交
1051
		hp->CardP = (struct DpRam __iomem *) hp->Caddr;
A
Andrew Morton 已提交
1052
		hp->Type = RIO_PCI;
1053
		hp->Copy = rio_copy_to_card;
A
Andrew Morton 已提交
1054 1055 1056 1057 1058 1059 1060 1061 1062
		hp->Mode = RIO_PCI_BOOT_FROM_RAM;
		spin_lock_init(&hp->HostLock);

		rio_dprintk(RIO_DEBUG_PROBE, "Ivec: %x\n", hp->Ivec);
		rio_dprintk(RIO_DEBUG_PROBE, "Mode: %x\n", hp->Mode);

		rio_reset_interrupt(hp);
		rio_start_card_running(hp);
		rio_dprintk(RIO_DEBUG_PROBE, "Going to test it (%p/%p).\n", (void *) p->RIOHosts[p->RIONumHosts].PaddrP, p->RIOHosts[p->RIONumHosts].Caddr);
1063
		if (RIOBoardTest(p->RIOHosts[p->RIONumHosts].PaddrP, p->RIOHosts[p->RIONumHosts].Caddr, RIO_PCI, 0) == 0) {
1064
			writeb(0xFF, &p->RIOHosts[p->RIONumHosts].ResetInt);
A
Andrew Morton 已提交
1065
			p->RIOHosts[p->RIONumHosts].UniqueNum =
1066 1067
			    ((readb(&p->RIOHosts[p->RIONumHosts].Unique[0]) & 0xFF) << 0) |
			    ((readb(&p->RIOHosts[p->RIONumHosts].Unique[1]) & 0xFF) << 8) | ((readb(&p->RIOHosts[p->RIONumHosts].Unique[2]) & 0xFF) << 16) | ((readb(&p->RIOHosts[p->RIONumHosts].Unique[3]) & 0xFF) << 24);
A
Andrew Morton 已提交
1068 1069
			rio_dprintk(RIO_DEBUG_PROBE, "Hmm Tested ok, uniqid = %x.\n", p->RIOHosts[p->RIONumHosts].UniqueNum);

1070
			p->RIOLastPCISearch = 0;
A
Andrew Morton 已提交
1071 1072 1073
			p->RIONumHosts++;
			found++;
		} else {
A
Al Viro 已提交
1074
			iounmap(p->RIOHosts[p->RIONumHosts].Caddr);
A
Andrew Morton 已提交
1075
		}
L
Linus Torvalds 已提交
1076
#else
A
Andrew Morton 已提交
1077
		printk(KERN_ERR "Found an older RIO PCI card, but the driver is not " "compiled to support it.\n");
L
Linus Torvalds 已提交
1078
#endif
A
Andrew Morton 已提交
1079 1080 1081 1082 1083 1084 1085 1086 1087 1088
	}
#endif				/* PCI */

	/* Now probe for ISA cards... */
	for (i = 0; i < NR_RIO_ADDRS; i++) {
		hp = &p->RIOHosts[p->RIONumHosts];
		hp->PaddrP = rio_probe_addrs[i];
		/* There was something about the IRQs of these cards. 'Forget what.--REW */
		hp->Ivec = 0;
		hp->Caddr = ioremap(p->RIOHosts[p->RIONumHosts].PaddrP, RIO_WINDOW_LEN);
A
Al Viro 已提交
1089
		hp->CardP = (struct DpRam __iomem *) hp->Caddr;
A
Andrew Morton 已提交
1090
		hp->Type = RIO_AT;
1091 1092
		hp->Copy = rio_copy_to_card;	/* AT card PCI???? - PVDL
                                         * -- YES! this is now a normal copy. Only the
A
Andrew Morton 已提交
1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103
					 * old PCI card uses the special PCI copy.
					 * Moreover, the ISA card will work with the
					 * special PCI copy anyway. -- REW */
		hp->Mode = 0;
		spin_lock_init(&hp->HostLock);

		vpdp = get_VPD_PROM(hp);
		rio_dprintk(RIO_DEBUG_PROBE, "Got VPD ROM\n");
		okboard = 0;
		if ((strncmp(vpdp->identifier, RIO_ISA_IDENT, 16) == 0) || (strncmp(vpdp->identifier, RIO_ISA2_IDENT, 16) == 0) || (strncmp(vpdp->identifier, RIO_ISA3_IDENT, 16) == 0)) {
			/* Board is present... */
1104
			if (RIOBoardTest(hp->PaddrP, hp->Caddr, RIO_AT, 0) == 0) {
A
Andrew Morton 已提交
1105 1106 1107 1108 1109 1110 1111 1112 1113 1114
				/* ... and feeling fine!!!! */
				rio_dprintk(RIO_DEBUG_PROBE, "Hmm Tested ok, uniqid = %x.\n", p->RIOHosts[p->RIONumHosts].UniqueNum);
				if (RIOAssignAT(p, hp->PaddrP, hp->Caddr, 0)) {
					rio_dprintk(RIO_DEBUG_PROBE, "Hmm Tested ok, host%d uniqid = %x.\n", p->RIONumHosts, p->RIOHosts[p->RIONumHosts - 1].UniqueNum);
					okboard++;
					found++;
				}
			}

			if (!okboard)
A
Al Viro 已提交
1115
				iounmap(hp->Caddr);
A
Andrew Morton 已提交
1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166
		}
	}


	for (i = 0; i < p->RIONumHosts; i++) {
		hp = &p->RIOHosts[i];
		if (hp->Ivec) {
			int mode = SA_SHIRQ;
			if (hp->Ivec & 0x8000) {
				mode = 0;
				hp->Ivec &= 0x7fff;
			}
			rio_dprintk(RIO_DEBUG_INIT, "Requesting interrupt hp: %p rio_interrupt: %d Mode: %x\n", hp, hp->Ivec, hp->Mode);
			retval = request_irq(hp->Ivec, rio_interrupt, mode, "rio", hp);
			rio_dprintk(RIO_DEBUG_INIT, "Return value from request_irq: %d\n", retval);
			if (retval) {
				printk(KERN_ERR "rio: Cannot allocate irq %d.\n", hp->Ivec);
				hp->Ivec = 0;
			}
			rio_dprintk(RIO_DEBUG_INIT, "Got irq %d.\n", hp->Ivec);
			if (hp->Ivec != 0) {
				rio_dprintk(RIO_DEBUG_INIT, "Enabling interrupts on rio card.\n");
				hp->Mode |= RIO_PCI_INT_ENABLE;
			} else
				hp->Mode &= !RIO_PCI_INT_ENABLE;
			rio_dprintk(RIO_DEBUG_INIT, "New Mode: %x\n", hp->Mode);
			rio_start_card_running(hp);
		}
		/* Init the timer "always" to make sure that it can safely be
		   deleted when we unload... */

		init_timer(&hp->timer);
		if (!hp->Ivec) {
			rio_dprintk(RIO_DEBUG_INIT, "Starting polling at %dj intervals.\n", rio_poll);
			hp->timer.data = i;
			hp->timer.function = rio_pollfunc;
			hp->timer.expires = jiffies + rio_poll;
			add_timer(&hp->timer);
		}
	}

	if (found) {
		rio_dprintk(RIO_DEBUG_INIT, "rio: total of %d boards detected.\n", found);
		rio_init_drivers();
	} else {
		/* deregister the misc device we created earlier */
		misc_deregister(&rio_fw_device);
	}

	func_exit();
	return found ? 0 : -EIO;
L
Linus Torvalds 已提交
1167 1168 1169
}


A
Andrew Morton 已提交
1170
static void __exit rio_exit(void)
L
Linus Torvalds 已提交
1171
{
A
Andrew Morton 已提交
1172 1173 1174 1175
	int i;
	struct Host *hp;

	func_enter();
L
Linus Torvalds 已提交
1176

A
Andrew Morton 已提交
1177 1178 1179 1180 1181 1182 1183 1184 1185
	for (i = 0, hp = p->RIOHosts; i < p->RIONumHosts; i++, hp++) {
		RIOHostReset(hp->Type, hp->CardP, hp->Slot);
		if (hp->Ivec) {
			free_irq(hp->Ivec, hp);
			rio_dprintk(RIO_DEBUG_INIT, "freed irq %d.\n", hp->Ivec);
		}
		/* It is safe/allowed to del_timer a non-active timer */
		del_timer(&hp->timer);
	}
L
Linus Torvalds 已提交
1186

A
Andrew Morton 已提交
1187 1188 1189
	if (misc_deregister(&rio_fw_device) < 0) {
		printk(KERN_INFO "rio: couldn't deregister control-device\n");
	}
L
Linus Torvalds 已提交
1190 1191


A
Andrew Morton 已提交
1192
	rio_dprintk(RIO_DEBUG_CLEANUP, "Cleaning up drivers\n");
L
Linus Torvalds 已提交
1193

A
Andrew Morton 已提交
1194
	rio_release_drivers();
L
Linus Torvalds 已提交
1195

A
Andrew Morton 已提交
1196 1197 1198 1199
	/* Release dynamically allocated memory */
	kfree(p->RIOPortp);
	kfree(p->RIOHosts);
	kfree(p);
L
Linus Torvalds 已提交
1200

A
Andrew Morton 已提交
1201
	func_exit();
L
Linus Torvalds 已提交
1202 1203 1204 1205
}

module_init(rio_init);
module_exit(rio_exit);