/* $Id: act2000_isa.c,v 1.11.6.3 2001/09/23 22:24:32 kai Exp $
 *
 * ISDN lowlevel-module for the IBM ISDN-S0 Active 2000 (ISA-Version).
 *
 * Author       Fritz Elfert
 * Copyright    by Fritz Elfert      <fritz@isdn4linux.de>
 *
 * This software may be used and distributed according to the terms
 * of the GNU General Public License, incorporated herein by reference.
 *
 * Thanks to Friedemann Baitinger and IBM Germany
 *
 */

#include "act2000.h"
#include "act2000_isa.h"
#include "capi.h"

/*
 * Reset Controller, then try to read the Card's signature.
 + Return:
 *   1 = Signature found.
 *   0 = Signature not found.
 */
static int
act2000_isa_reset(unsigned short portbase)
{
	unsigned char reg;
	int i;
	int found;
	int serial = 0;

	found = 0;
	reg = inb(portbase + ISA_COR);
	if (reg != 0xff) {
		outb(reg | ISA_COR_RESET, portbase + ISA_COR);
		mdelay(10);
		outb(reg, portbase + ISA_COR);
		mdelay(10);

		for (i = 0; i < 16; i++) {
			if (inb(portbase + ISA_ISR) & ISA_ISR_SERIAL)
				serial |= 0x10000;
			serial >>= 1;
		}
		if (serial == ISA_SER_ID)
			found++;
	}
	return found;
}

int
act2000_isa_detect(unsigned short portbase)
{
	int ret = 0;

	if (request_region(portbase, ACT2000_PORTLEN, "act2000isa")) {
		ret = act2000_isa_reset(portbase);
		release_region(portbase, ISA_REGION);
	}
	return ret;
}

static irqreturn_t
act2000_isa_interrupt(int dummy, void *dev_id)
{
	act2000_card *card = dev_id;
	u_char istatus;

	istatus = (inb(ISA_PORT_ISR) & 0x07);
	if (istatus & ISA_ISR_OUT) {
		/* RX fifo has data */
		istatus &= ISA_ISR_OUT_MASK;
		outb(0, ISA_PORT_SIS);
		act2000_isa_receive(card);
		outb(ISA_SIS_INT, ISA_PORT_SIS);
	}
	if (istatus & ISA_ISR_ERR) {
		/* Error Interrupt */
		istatus &= ISA_ISR_ERR_MASK;
		printk(KERN_WARNING "act2000: errIRQ\n");
	}
	if (istatus)
		printk(KERN_DEBUG "act2000: ?IRQ %d %02x\n", card->irq, istatus);
	return IRQ_HANDLED;
}

static void
act2000_isa_select_irq(act2000_card *card)
{
	unsigned char reg;

	reg = (inb(ISA_PORT_COR) & ~ISA_COR_IRQOFF) | ISA_COR_PERR;
	switch (card->irq) {
	case 3:
		reg = ISA_COR_IRQ03;
		break;
	case 5:
		reg = ISA_COR_IRQ05;
		break;
	case 7:
		reg = ISA_COR_IRQ07;
		break;
	case 10:
		reg = ISA_COR_IRQ10;
		break;
	case 11:
		reg = ISA_COR_IRQ11;
		break;
	case 12:
		reg = ISA_COR_IRQ12;
		break;
	case 15:
		reg = ISA_COR_IRQ15;
		break;
	}
	outb(reg, ISA_PORT_COR);
}

static void
act2000_isa_enable_irq(act2000_card *card)
{
	act2000_isa_select_irq(card);
	/* Enable READ irq */
	outb(ISA_SIS_INT, ISA_PORT_SIS);
}

/*
 * Install interrupt handler, enable irq on card.
 * If irq is -1, choose next free irq, else irq is given explicitly.
 */
int
act2000_isa_config_irq(act2000_card *card, short irq)
{
	int old_irq;

	if (card->flags & ACT2000_FLAGS_IVALID)
		free_irq(card->irq, card);

	card->flags &= ~ACT2000_FLAGS_IVALID;
	outb(ISA_COR_IRQOFF, ISA_PORT_COR);
	if (!irq)
		return 0;

	old_irq = card->irq;
	card->irq = irq;
	if (request_irq(irq, &act2000_isa_interrupt, 0, card->regname, card)) {
		card->irq = old_irq;
		card->flags |= ACT2000_FLAGS_IVALID;
		printk(KERN_WARNING
		       "act2000: Could not request irq %d\n", irq);
		return -EBUSY;
	} else {
		act2000_isa_select_irq(card);
		/* Disable READ and WRITE irq */
		outb(0, ISA_PORT_SIS);
		outb(0, ISA_PORT_SOS);
	}
	return 0;
}

int
act2000_isa_config_port(act2000_card *card, unsigned short portbase)
{
	if (card->flags & ACT2000_FLAGS_PVALID) {
		release_region(card->port, ISA_REGION);
		card->flags &= ~ACT2000_FLAGS_PVALID;
	}
	if (!request_region(portbase, ACT2000_PORTLEN, card->regname))
		return -EBUSY;
	else {
		card->port = portbase;
		card->flags |= ACT2000_FLAGS_PVALID;
		return 0;
	}
}

/*
 * Release resources, used by an adaptor.
 */
void
act2000_isa_release(act2000_card *card)
{
	unsigned long flags;

	spin_lock_irqsave(&card->lock, flags);
	if (card->flags & ACT2000_FLAGS_IVALID)
		free_irq(card->irq, card);

	card->flags &= ~ACT2000_FLAGS_IVALID;
	if (card->flags & ACT2000_FLAGS_PVALID)
		release_region(card->port, ISA_REGION);
	card->flags &= ~ACT2000_FLAGS_PVALID;
	spin_unlock_irqrestore(&card->lock, flags);
}

static int
act2000_isa_writeb(act2000_card *card, u_char data)
{
	u_char timeout = 40;

	while (timeout) {
		if (inb(ISA_PORT_SOS) & ISA_SOS_READY) {
			outb(data, ISA_PORT_SDO);
			return 0;
		} else {
			timeout--;
			udelay(10);
		}
	}
	return 1;
}

static int
act2000_isa_readb(act2000_card *card, u_char *data)
{
	u_char timeout = 40;

	while (timeout) {
		if (inb(ISA_PORT_SIS) & ISA_SIS_READY) {
			*data = inb(ISA_PORT_SDI);
			return 0;
		} else {
			timeout--;
			udelay(10);
		}
	}
	return 1;
}

void
act2000_isa_receive(act2000_card *card)
{
	u_char c;

	if (test_and_set_bit(ACT2000_LOCK_RX, (void *)&card->ilock) != 0)
		return;
	while (!act2000_isa_readb(card, &c)) {
		if (card->idat.isa.rcvidx < 8) {
			card->idat.isa.rcvhdr[card->idat.isa.rcvidx++] = c;
			if (card->idat.isa.rcvidx == 8) {
				int valid = actcapi_chkhdr(card, (actcapi_msghdr *)&card->idat.isa.rcvhdr);

				if (valid) {
					card->idat.isa.rcvlen = ((actcapi_msghdr *)&card->idat.isa.rcvhdr)->len;
					card->idat.isa.rcvskb = dev_alloc_skb(card->idat.isa.rcvlen);
					if (!card->idat.isa.rcvskb) {
						card->idat.isa.rcvignore = 1;
						printk(KERN_WARNING
						       "act2000_isa_receive: no memory\n");
						test_and_clear_bit(ACT2000_LOCK_RX, (void *)&card->ilock);
						return;
					}
					memcpy(skb_put(card->idat.isa.rcvskb, 8), card->idat.isa.rcvhdr, 8);
					card->idat.isa.rcvptr = skb_put(card->idat.isa.rcvskb, card->idat.isa.rcvlen - 8);
				} else {
					card->idat.isa.rcvidx = 0;
					printk(KERN_WARNING
					       "act2000_isa_receive: Invalid CAPI msg\n");
					{
						int i; __u8 *p; __u8 *t; __u8 tmp[30];
						for (i = 0, p = (__u8 *)&card->idat.isa.rcvhdr, t = tmp; i < 8; i++)
							t += sprintf(t, "%02x ", *(p++));
						printk(KERN_WARNING "act2000_isa_receive: %s\n", tmp);
					}
				}
			}
		} else {
			if (!card->idat.isa.rcvignore)
				*card->idat.isa.rcvptr++ = c;
			if (++card->idat.isa.rcvidx >= card->idat.isa.rcvlen) {
				if (!card->idat.isa.rcvignore) {
					skb_queue_tail(&card->rcvq, card->idat.isa.rcvskb);
					act2000_schedule_rx(card);
				}
				card->idat.isa.rcvidx = 0;
				card->idat.isa.rcvlen = 8;
				card->idat.isa.rcvignore = 0;
				card->idat.isa.rcvskb = NULL;
				card->idat.isa.rcvptr = card->idat.isa.rcvhdr;
			}
		}
	}
	if (!(card->flags & ACT2000_FLAGS_IVALID)) {
		/* In polling mode, schedule myself */
		if ((card->idat.isa.rcvidx) &&
		    (card->idat.isa.rcvignore ||
		     (card->idat.isa.rcvidx < card->idat.isa.rcvlen)))
			act2000_schedule_poll(card);
	}
	test_and_clear_bit(ACT2000_LOCK_RX, (void *)&card->ilock);
}

void
act2000_isa_send(act2000_card *card)
{
	unsigned long flags;
	struct sk_buff *skb;
	actcapi_msg *msg;
	int l;

	if (test_and_set_bit(ACT2000_LOCK_TX, (void *)&card->ilock) != 0)
		return;
	while (1) {
		spin_lock_irqsave(&card->lock, flags);
		if (!(card->sbuf)) {
			card->sbuf = skb_dequeue(&card->sndq);
			if (card->sbuf) {
				card->ack_msg = card->sbuf->data;
				msg = (actcapi_msg *)card->sbuf->data;
				if ((msg->hdr.cmd.cmd == 0x86) &&
				    (msg->hdr.cmd.subcmd == 0)) {
					/* Save flags in message */
					card->need_b3ack = msg->msg.data_b3_req.flags;
					msg->msg.data_b3_req.flags = 0;
				}
			}
		}
		spin_unlock_irqrestore(&card->lock, flags);
		if (!(card->sbuf)) {
			/* No more data to send */
			test_and_clear_bit(ACT2000_LOCK_TX, (void *)&card->ilock);
			return;
		}
		skb = card->sbuf;
		l = 0;
		while (skb->len) {
			if (act2000_isa_writeb(card, *(skb->data))) {
				/* Fifo is full, but more data to send */
				test_and_clear_bit(ACT2000_LOCK_TX, (void *)&card->ilock);
				/* Schedule myself */
				act2000_schedule_tx(card);
				return;
			}
			skb_pull(skb, 1);
			l++;
		}
		msg = (actcapi_msg *)card->ack_msg;
		if ((msg->hdr.cmd.cmd == 0x86) &&
		    (msg->hdr.cmd.subcmd == 0)) {
			/*
			 * If it's user data, reset data-ptr
			 * and put skb into ackq.
			 */
			skb->data = card->ack_msg;
			/* Restore flags in message */
			msg->msg.data_b3_req.flags = card->need_b3ack;
			skb_queue_tail(&card->ackq, skb);
		} else
			dev_kfree_skb(skb);
		card->sbuf = NULL;
	}
}

/*
 * Get firmware ID, check for 'ISDN' signature.
 */
static int
act2000_isa_getid(act2000_card *card)
{
	act2000_fwid fid;
	u_char *p = (u_char *)&fid;
	int count = 0;

	while (1) {
		if (count > 510)
			return -EPROTO;
		if (act2000_isa_readb(card, p++))
			break;
		count++;
	}
	if (count <= 20) {
		printk(KERN_WARNING "act2000: No Firmware-ID!\n");
		return -ETIME;
	}
	*p = '\0';
	fid.revlen[0] = '\0';
	if (strcmp(fid.isdn, "ISDN")) {
		printk(KERN_WARNING "act2000: Wrong Firmware-ID!\n");
		return -EPROTO;
	}
	p = strchr(fid.revision, '\n');
	if (p)
		*p = '\0';
	printk(KERN_INFO "act2000: Firmware-ID: %s\n", fid.revision);
	if (card->flags & ACT2000_FLAGS_IVALID) {
		printk(KERN_DEBUG "Enabling Interrupts ...\n");
		act2000_isa_enable_irq(card);
	}
	return 0;
}

/*
 * Download microcode into card, check Firmware signature.
 */
int
act2000_isa_download(act2000_card *card, act2000_ddef __user *cb)
{
	unsigned int length;
	int l;
	int c;
	u_char *b;
	u_char __user *p;
	u_char *buf;
	act2000_ddef cblock;

	if (!act2000_isa_reset(card->port))
		return -ENXIO;
	msleep_interruptible(500);
	if (copy_from_user(&cblock, cb, sizeof(cblock)))
		return -EFAULT;
	length = cblock.length;
	p = cblock.buffer;
	if (!access_ok(VERIFY_READ, p, length))
		return -EFAULT;
	buf = kmalloc(1024, GFP_KERNEL);
	if (!buf)
		return -ENOMEM;
	while (length) {
		l = (length > 1024) ? 1024 : length;
		c = 0;
		b = buf;
		if (copy_from_user(buf, p, l)) {
			kfree(buf);
			return -EFAULT;
		}
		while (c < l) {
			if (act2000_isa_writeb(card, *b++)) {
				printk(KERN_WARNING
				       "act2000: loader timed out"
				       " len=%d c=%d\n", length, c);
				kfree(buf);
				return -ETIME;
			}
			c++;
		}
		length -= l;
		p += l;
	}
	kfree(buf);
	msleep_interruptible(500);
	return act2000_isa_getid(card);
}
