/*
 * PCBIT-D low-layer interface definitions
 *
 * Copyright (C) 1996 Universidade de Lisboa
 *
 * Written by Pedro Roque Marques (roque@di.fc.ul.pt)
 *
 * This software may be used and distributed according to the terms of
 * the GNU General Public License, incorporated herein by reference.
 */

/*
 * 19991203 - Fernando Carvalho - takion@superbofh.org
 * Hacked to compile with egcs and run with current version of isdn modules
 */

#ifndef LAYER2_H
#define LAYER2_H

#include <linux/interrupt.h>

#include <asm/byteorder.h>

#define BANK1 0x0000U /* PC -> Board */
#define BANK2 0x01ffU /* Board -> PC */
#define BANK3 0x03feU /* Att Board */
#define BANK4 0x03ffU /* Att PC */

#define BANKLEN 0x01FFU

#define LOAD_ZONE_START 0x03f8U
#define LOAD_ZONE_END   0x03fdU

#define LOAD_RETRY      18000000



/* TAM - XX - C - S  - NUM */
#define PREHDR_LEN 8
/* TT  - M  - I - TH - TD  */
#define FRAME_HDR_LEN  8

#define MSG_CONN_REQ		0x08000100
#define MSG_CONN_CONF		0x00000101
#define MSG_CONN_IND		0x00000102
#define MSG_CONN_RESP		0x08000103

#define MSG_CONN_ACTV_REQ	0x08000300
#define MSG_CONN_ACTV_CONF	0x00000301
#define MSG_CONN_ACTV_IND	0x00000302
#define MSG_CONN_ACTV_RESP	0x08000303

#define MSG_DISC_REQ		0x08000400
#define MSG_DISC_CONF		0x00000401
#define MSG_DISC_IND		0x00000402
#define MSG_DISC_RESP		0x08000403

#define MSG_TDATA_REQ		0x0908E200
#define MSG_TDATA_CONF		0x0000E201
#define MSG_TDATA_IND		0x0000E202
#define MSG_TDATA_RESP		0x0908E203

#define MSG_SELP_REQ		0x09004000
#define MSG_SELP_CONF		0x00004001

#define MSG_ACT_TRANSP_REQ      0x0908E000
#define MSG_ACT_TRANSP_CONF     0x0000E001

#define MSG_STPROT_REQ		0x09004100
#define MSG_STPROT_CONF		0x00004101

#define MSG_PING188_REQ		0x09030500
#define MSG_PING188_CONF        0x000005bc

#define MSG_WATCH188	        0x09030400

#define MSG_API_ON              0x08020102
#define MSG_POOL_PCBIT          0x08020400
#define MSG_POOL_PCBIT_CONF     0x00000401

#define MSG_INFO_IND            0x00002602
#define MSG_INFO_RESP           0x08002603

#define MSG_DEBUG_188           0x0000ff00

/*

  long  4 3 2 1
  Intel 1 2 3 4
*/

#ifdef __LITTLE_ENDIAN
#define SET_MSG_SCMD(msg, ch)	(msg = (msg & 0xffffff00) | (((ch) & 0xff)))
#define SET_MSG_CMD(msg, ch)	(msg = (msg & 0xffff00ff) | (((ch) & 0xff) << 8))
#define SET_MSG_PROC(msg, ch)	(msg = (msg & 0xff00ffff) | (((ch) & 0xff) << 16))
#define SET_MSG_CPU(msg, ch)	(msg = (msg & 0x00ffffff) | (((ch) & 0xff) << 24))

#define GET_MSG_SCMD(msg)	((msg) & 0xFF)
#define GET_MSG_CMD(msg)	((msg) >> 8 & 0xFF)
#define GET_MSG_PROC(msg)	((msg) >> 16 & 0xFF)
#define GET_MSG_CPU(msg)	((msg) >> 24)

#else
#error "Non-Intel CPU"
#endif

#define MAX_QUEUED 7

#define SCHED_READ    0x01
#define SCHED_WRITE   0x02

#define SET_RUN_TIMEOUT 2 * HZ /* 2 seconds */

struct frame_buf {
	ulong msg;
	unsigned int refnum;
	unsigned int dt_len;
	unsigned int hdr_len;
	struct sk_buff *skb;
	unsigned int copied;
	struct frame_buf *next;
};

extern int pcbit_l2_write(struct pcbit_dev *dev, ulong msg, ushort refnum,
			  struct sk_buff *skb, unsigned short hdr_len);

extern irqreturn_t pcbit_irq_handler(int interrupt, void *);

extern struct pcbit_dev *dev_pcbit[MAX_PCBIT_CARDS];

#ifdef DEBUG
static __inline__ void log_state(struct pcbit_dev *dev) {
	printk(KERN_DEBUG "writeptr = %ld\n",
	       (ulong) (dev->writeptr - dev->sh_mem));
	printk(KERN_DEBUG "readptr  = %ld\n",
	       (ulong) (dev->readptr - (dev->sh_mem + BANK2)));
	printk(KERN_DEBUG "{rcv_seq=%01x, send_seq=%01x, unack_seq=%01x}\n",
	       dev->rcv_seq, dev->send_seq, dev->unack_seq);
}
#endif

static __inline__ struct pcbit_dev *chan2dev(struct pcbit_chan *chan)
{
	struct pcbit_dev *dev;
	int i;


	for (i = 0; i < MAX_PCBIT_CARDS; i++)
		if ((dev = dev_pcbit[i]))
			if (dev->b1 == chan || dev->b2 == chan)
				return dev;
	return NULL;

}

static __inline__ struct pcbit_dev *finddev(int id)
{
	struct pcbit_dev *dev;
	int i;

	for (i = 0; i < MAX_PCBIT_CARDS; i++)
		if ((dev = dev_pcbit[i]))
			if (dev->id == id)
				return dev;
	return NULL;
}


/*
 *  Support routines for reading and writing in the board
 */

static __inline__ void pcbit_writeb(struct pcbit_dev *dev, unsigned char dt)
{
	writeb(dt, dev->writeptr++);
	if (dev->writeptr == dev->sh_mem + BANKLEN)
		dev->writeptr = dev->sh_mem;
}

static __inline__ void pcbit_writew(struct pcbit_dev *dev, unsigned short dt)
{
	int dist;

	dist = BANKLEN - (dev->writeptr - dev->sh_mem);
	switch (dist) {
	case 2:
		writew(dt, dev->writeptr);
		dev->writeptr = dev->sh_mem;
		break;
	case 1:
		writeb((u_char) (dt & 0x00ffU), dev->writeptr);
		dev->writeptr = dev->sh_mem;
		writeb((u_char) (dt >> 8), dev->writeptr++);
		break;
	default:
		writew(dt, dev->writeptr);
		dev->writeptr += 2;
		break;
	};
}

static __inline__ void memcpy_topcbit(struct pcbit_dev *dev, u_char *data,
				      int len)
{
	int diff;

	diff = len - (BANKLEN - (dev->writeptr - dev->sh_mem));

	if (diff > 0)
	{
		memcpy_toio(dev->writeptr, data, len - diff);
		memcpy_toio(dev->sh_mem, data + (len - diff), diff);
		dev->writeptr = dev->sh_mem + diff;
	}
	else
	{
		memcpy_toio(dev->writeptr, data, len);

		dev->writeptr += len;
		if (diff == 0)
			dev->writeptr = dev->sh_mem;
	}
}

static __inline__ unsigned char pcbit_readb(struct pcbit_dev *dev)
{
	unsigned char val;

	val = readb(dev->readptr++);
	if (dev->readptr == dev->sh_mem + BANK2 + BANKLEN)
		dev->readptr = dev->sh_mem + BANK2;

	return val;
}

static __inline__ unsigned short pcbit_readw(struct pcbit_dev *dev)
{
	int dist;
	unsigned short val;

	dist = BANKLEN - (dev->readptr - (dev->sh_mem + BANK2));
	switch (dist) {
	case 2:
		val = readw(dev->readptr);
		dev->readptr = dev->sh_mem + BANK2;
		break;
	case 1:
		val = readb(dev->readptr);
		dev->readptr = dev->sh_mem + BANK2;
		val = (readb(dev->readptr++) << 8) | val;
		break;
	default:
		val = readw(dev->readptr);
		dev->readptr += 2;
		break;
	};
	return val;
}

static __inline__ void memcpy_frompcbit(struct pcbit_dev *dev, u_char *data, int len)
{
	int diff;

	diff = len - (BANKLEN - (dev->readptr - (dev->sh_mem + BANK2)));
	if (diff > 0)
	{
		memcpy_fromio(data, dev->readptr, len - diff);
		memcpy_fromio(data + (len - diff), dev->sh_mem + BANK2 , diff);
		dev->readptr = dev->sh_mem + BANK2 + diff;
	}
	else
	{
		memcpy_fromio(data, dev->readptr, len);
		dev->readptr += len;
		if (diff == 0)
			dev->readptr = dev->sh_mem + BANK2;
	}
}


#endif
