11da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* $Id: avmcard.h,v 1.1.4.1.2.1 2001/12/21 15:00:17 kai Exp $
21da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
31da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Copyright 1999 by Carsten Paeth <calle@calle.de>
41da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
51da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * This software may be used and distributed according to the terms
61da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * of the GNU General Public License, incorporated herein by reference.
71da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
81da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
91da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifndef _AVMCARD_H_
111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define _AVMCARD_H_
121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/spinlock.h>
141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/list.h>
151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/interrupt.h>
161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define	AVMB1_PORTLEN		0x1f
181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define AVM_MAXVERSION		8
191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define AVM_NCCI_PER_CHANNEL	4
201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Versions
231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define	VER_DRIVER	0
261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define	VER_CARDTYPE	1
271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define	VER_HWID	2
281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define	VER_SERIAL	3
291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define	VER_OPTION	4
301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define	VER_PROTO	5
311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define	VER_PROFILE	6
321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define	VER_CAPI	7
331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsenum avmcardtype {
351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	avm_b1isa,
361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	avm_b1pci,
371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	avm_b1pcmcia,
381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	avm_m1,
391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	avm_m2,
401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	avm_t1isa,
411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	avm_t1pci,
421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	avm_c4,
431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	avm_c2
441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds};
451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldstypedef struct avmcard_dmabuf {
47475be4d85a274d0961593db41cf85689db1d583cJoe Perches	long        size;
48475be4d85a274d0961593db41cf85689db1d583cJoe Perches	u8       *dmabuf;
49475be4d85a274d0961593db41cf85689db1d583cJoe Perches	dma_addr_t  dmaaddr;
501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} avmcard_dmabuf;
511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldstypedef struct avmcard_dmainfo {
531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	u32                recvlen;
54475be4d85a274d0961593db41cf85689db1d583cJoe Perches	avmcard_dmabuf       recvbuf;
551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
56475be4d85a274d0961593db41cf85689db1d583cJoe Perches	avmcard_dmabuf       sendbuf;
571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct sk_buff_head  send_queue;
581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct pci_dev      *pcidev;
601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} avmcard_dmainfo;
611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldstypedef	struct avmctrl_info {
631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	char cardname[32];
64475be4d85a274d0961593db41cf85689db1d583cJoe Perches
651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	int versionlen;
661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	char versionbuf[1024];
671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	char *version[AVM_MAXVERSION];
68475be4d85a274d0961593db41cf85689db1d583cJoe Perches
691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	char infobuf[128];	/* for function procinfo */
70475be4d85a274d0961593db41cf85689db1d583cJoe Perches
711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct avmcard  *card;
721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct capi_ctr  capi_ctrl;
73475be4d85a274d0961593db41cf85689db1d583cJoe Perches
741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct list_head ncci_head;
751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} avmctrl_info;
761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldstypedef struct avmcard {
781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	char name[32];
79475be4d85a274d0961593db41cf85689db1d583cJoe Perches
801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	spinlock_t lock;
811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned int port;
821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned irq;
831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned long membase;
841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	enum avmcardtype cardtype;
851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned char revision;
861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned char class;
871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	int cardnr; /* for t1isa */
881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	char msgbuf[128];	/* capimsg msg part */
901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	char databuf[2048];	/* capimsg data part */
911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	void __iomem *mbase;
931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	volatile u32 csr;
941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	avmcard_dmainfo *dma;
951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct avmctrl_info *ctrlinfo;
971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	u_int nr_controllers;
991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	u_int nlogcontr;
1001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct list_head list;
1011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} avmcard;
1021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsextern int b1_irq_table[16];
1041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
106475be4d85a274d0961593db41cf85689db1d583cJoe Perches * LLI Messages to the ISDN-ControllerISDN Controller
1071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
1081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define	SEND_POLL		0x72	/*
110475be4d85a274d0961593db41cf85689db1d583cJoe Perches					 * after load <- RECEIVE_POLL
1111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					 */
1121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SEND_INIT		0x11	/*
113475be4d85a274d0961593db41cf85689db1d583cJoe Perches					 * first message <- RECEIVE_INIT
114475be4d85a274d0961593db41cf85689db1d583cJoe Perches					 * int32 NumApplications  int32
115475be4d85a274d0961593db41cf85689db1d583cJoe Perches					 * NumNCCIs int32 BoardNumber
1161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					 */
1171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SEND_REGISTER		0x12	/*
118475be4d85a274d0961593db41cf85689db1d583cJoe Perches					 * register an application int32
119475be4d85a274d0961593db41cf85689db1d583cJoe Perches					 * ApplIDId int32 NumMessages
120475be4d85a274d0961593db41cf85689db1d583cJoe Perches					 * int32 NumB3Connections int32
121475be4d85a274d0961593db41cf85689db1d583cJoe Perches					 * NumB3Blocks int32 B3Size
122475be4d85a274d0961593db41cf85689db1d583cJoe Perches					 *
123475be4d85a274d0961593db41cf85689db1d583cJoe Perches					 * AnzB3Connection != 0 &&
124475be4d85a274d0961593db41cf85689db1d583cJoe Perches					 * AnzB3Blocks >= 1 && B3Size >= 1
1251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					 */
1261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SEND_RELEASE		0x14	/*
127475be4d85a274d0961593db41cf85689db1d583cJoe Perches					 * deregister an application int32
128475be4d85a274d0961593db41cf85689db1d583cJoe Perches					 * ApplID
1291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					 */
1301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SEND_MESSAGE		0x15	/*
131475be4d85a274d0961593db41cf85689db1d583cJoe Perches					 * send capi-message int32 length
132475be4d85a274d0961593db41cf85689db1d583cJoe Perches					 * capi-data ...
1331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					 */
1341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SEND_DATA_B3_REQ	0x13	/*
135475be4d85a274d0961593db41cf85689db1d583cJoe Perches					 * send capi-data-message int32
136475be4d85a274d0961593db41cf85689db1d583cJoe Perches					 * MsgLength capi-data ... int32
137475be4d85a274d0961593db41cf85689db1d583cJoe Perches					 * B3Length data ....
1381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					 */
1391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SEND_CONFIG		0x21    /*
141475be4d85a274d0961593db41cf85689db1d583cJoe Perches					 */
1421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SEND_POLLACK		0x73    /* T1 Watchdog */
1441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
146475be4d85a274d0961593db41cf85689db1d583cJoe Perches * LLI Messages from the ISDN-ControllerISDN Controller
1471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
1481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define RECEIVE_POLL		0x32	/*
150475be4d85a274d0961593db41cf85689db1d583cJoe Perches					 * <- after SEND_POLL
1511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					 */
1521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define RECEIVE_INIT		0x27	/*
153475be4d85a274d0961593db41cf85689db1d583cJoe Perches					 * <- after SEND_INIT int32 length
154475be4d85a274d0961593db41cf85689db1d583cJoe Perches					 * byte total length b1struct board
155475be4d85a274d0961593db41cf85689db1d583cJoe Perches					 * driver revision b1struct card
156475be4d85a274d0961593db41cf85689db1d583cJoe Perches					 * type b1struct reserved b1struct
157475be4d85a274d0961593db41cf85689db1d583cJoe Perches					 * serial number b1struct driver
158475be4d85a274d0961593db41cf85689db1d583cJoe Perches					 * capability b1struct d-channel
159475be4d85a274d0961593db41cf85689db1d583cJoe Perches					 * protocol b1struct CAPI-2.0
160475be4d85a274d0961593db41cf85689db1d583cJoe Perches					 * profile b1struct capi version
1611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					 */
1621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define RECEIVE_MESSAGE		0x21	/*
163475be4d85a274d0961593db41cf85689db1d583cJoe Perches					 * <- after SEND_MESSAGE int32
164475be4d85a274d0961593db41cf85689db1d583cJoe Perches					 * AppllID int32 Length capi-data
165475be4d85a274d0961593db41cf85689db1d583cJoe Perches					 * ....
1661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					 */
1671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define RECEIVE_DATA_B3_IND	0x22	/*
168475be4d85a274d0961593db41cf85689db1d583cJoe Perches					 * received data int32 AppllID
169475be4d85a274d0961593db41cf85689db1d583cJoe Perches					 * int32 Length capi-data ...
170475be4d85a274d0961593db41cf85689db1d583cJoe Perches					 * int32 B3Length data ...
1711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					 */
1721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define RECEIVE_START		0x23	/*
173475be4d85a274d0961593db41cf85689db1d583cJoe Perches					 * Handshake
1741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					 */
1751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define RECEIVE_STOP		0x24	/*
176475be4d85a274d0961593db41cf85689db1d583cJoe Perches					 * Handshake
1771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					 */
1781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define RECEIVE_NEW_NCCI	0x25	/*
179475be4d85a274d0961593db41cf85689db1d583cJoe Perches					 * int32 AppllID int32 NCCI int32
180475be4d85a274d0961593db41cf85689db1d583cJoe Perches					 * WindowSize
1811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					 */
1821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define RECEIVE_FREE_NCCI	0x26	/*
183475be4d85a274d0961593db41cf85689db1d583cJoe Perches					 * int32 AppllID int32 NCCI
1841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					 */
1851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define RECEIVE_RELEASE		0x26	/*
186475be4d85a274d0961593db41cf85689db1d583cJoe Perches					 * int32 AppllID int32 0xffffffff
1871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					 */
1881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define RECEIVE_TASK_READY	0x31	/*
189475be4d85a274d0961593db41cf85689db1d583cJoe Perches					 * int32 tasknr
190475be4d85a274d0961593db41cf85689db1d583cJoe Perches					 * int32 Length Taskname ...
1911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					 */
1921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define RECEIVE_DEBUGMSG	0x71	/*
193475be4d85a274d0961593db41cf85689db1d583cJoe Perches					 * int32 Length message
194475be4d85a274d0961593db41cf85689db1d583cJoe Perches					 *
1951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					 */
1961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define RECEIVE_POLLDWORD	0x75	/* t1pci in dword mode */
1971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define WRITE_REGISTER		0x00
1991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define READ_REGISTER		0x01
2001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
2021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * port offsets
2031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
2041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define B1_READ			0x00
2061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define B1_WRITE		0x01
2071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define B1_INSTAT		0x02
2081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define B1_OUTSTAT		0x03
2091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define B1_ANALYSE		0x04
2101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define B1_REVISION		0x05
2111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define B1_RESET		0x10
2121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define B1_STAT0(cardtype)  ((cardtype) == avm_m1 ? 0x81200000l : 0x80A00000l)
2151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define B1_STAT1(cardtype)  (0x80E00000l)
2161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* ---------------------------------------------------------------- */
2181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic inline unsigned char b1outp(unsigned int base,
2201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				   unsigned short offset,
2211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				   unsigned char value)
2221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
2231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	outb(value, base + offset);
2241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return inb(base + B1_ANALYSE);
2251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
2261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic inline int b1_rx_full(unsigned int base)
2291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
2301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return inb(base + B1_INSTAT) & 0x1;
2311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
2321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic inline unsigned char b1_get_byte(unsigned int base)
2341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
2351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned long stop = jiffies + 1 * HZ;	/* maximum wait time 1 sec */
2361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	while (!b1_rx_full(base) && time_before(jiffies, stop));
2371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (b1_rx_full(base))
2381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return inb(base + B1_READ);
2391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	printk(KERN_CRIT "b1lli(0x%x): rx not full after 1 second\n", base);
2401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return 0;
2411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
2421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic inline unsigned int b1_get_word(unsigned int base)
2441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
2451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned int val = 0;
2461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	val |= b1_get_byte(base);
2471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	val |= (b1_get_byte(base) << 8);
2481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	val |= (b1_get_byte(base) << 16);
2491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	val |= (b1_get_byte(base) << 24);
2501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return val;
2511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
2521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic inline int b1_tx_empty(unsigned int base)
2541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
2551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return inb(base + B1_OUTSTAT) & 0x1;
2561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
2571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic inline void b1_put_byte(unsigned int base, unsigned char val)
2591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
2601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	while (!b1_tx_empty(base));
2611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	b1outp(base, B1_WRITE, val);
2621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
2631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic inline int b1_save_put_byte(unsigned int base, unsigned char val)
2651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
2661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned long stop = jiffies + 2 * HZ;
267475be4d85a274d0961593db41cf85689db1d583cJoe Perches	while (!b1_tx_empty(base) && time_before(jiffies, stop));
2681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!b1_tx_empty(base)) return -1;
2691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	b1outp(base, B1_WRITE, val);
2701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return 0;
2711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
2721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic inline void b1_put_word(unsigned int base, unsigned int val)
2741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
2751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	b1_put_byte(base, val & 0xff);
2761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	b1_put_byte(base, (val >> 8) & 0xff);
2771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	b1_put_byte(base, (val >> 16) & 0xff);
2781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	b1_put_byte(base, (val >> 24) & 0xff);
2791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
2801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic inline unsigned int b1_get_slice(unsigned int base,
2821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					unsigned char *dp)
2831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
2841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned int len, i;
2851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	len = i = b1_get_word(base);
2871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	while (i-- > 0) *dp++ = b1_get_byte(base);
2881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return len;
2891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
2901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic inline void b1_put_slice(unsigned int base,
2921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				unsigned char *dp, unsigned int len)
2931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
2941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned i = len;
2951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	b1_put_word(base, i);
2961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	while (i-- > 0)
2971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		b1_put_byte(base, *dp++);
2981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
2991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void b1_wr_reg(unsigned int base,
301475be4d85a274d0961593db41cf85689db1d583cJoe Perches		      unsigned int reg,
3021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		      unsigned int value)
3031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
3041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	b1_put_byte(base, WRITE_REGISTER);
305475be4d85a274d0961593db41cf85689db1d583cJoe Perches	b1_put_word(base, reg);
306475be4d85a274d0961593db41cf85689db1d583cJoe Perches	b1_put_word(base, value);
3071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
3081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic inline unsigned int b1_rd_reg(unsigned int base,
310475be4d85a274d0961593db41cf85689db1d583cJoe Perches				     unsigned int reg)
3111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
3121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	b1_put_byte(base, READ_REGISTER);
313475be4d85a274d0961593db41cf85689db1d583cJoe Perches	b1_put_word(base, reg);
314475be4d85a274d0961593db41cf85689db1d583cJoe Perches	return b1_get_word(base);
315475be4d85a274d0961593db41cf85689db1d583cJoe Perches
3161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
3171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic inline void b1_reset(unsigned int base)
3191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
3201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	b1outp(base, B1_RESET, 0);
3211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	mdelay(55 * 2);	/* 2 TIC's */
3221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	b1outp(base, B1_RESET, 1);
3241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	mdelay(55 * 2);	/* 2 TIC's */
3251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	b1outp(base, B1_RESET, 0);
3271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	mdelay(55 * 2);	/* 2 TIC's */
3281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
3291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic inline unsigned char b1_disable_irq(unsigned int base)
3311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
3321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return b1outp(base, B1_INSTAT, 0x00);
3331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
3341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* ---------------------------------------------------------------- */
3361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic inline void b1_set_test_bit(unsigned int base,
3381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				   enum avmcardtype cardtype,
3391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				   int onoff)
3401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
341475be4d85a274d0961593db41cf85689db1d583cJoe Perches	b1_wr_reg(base, B1_STAT0(cardtype), onoff ? 0x21 : 0x20);
3421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
3431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic inline int b1_get_test_bit(unsigned int base,
345475be4d85a274d0961593db41cf85689db1d583cJoe Perches				  enum avmcardtype cardtype)
3461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
347475be4d85a274d0961593db41cf85689db1d583cJoe Perches	return (b1_rd_reg(base, B1_STAT0(cardtype)) & 0x01) != 0;
3481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
3491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* ---------------------------------------------------------------- */
3511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define T1_FASTLINK		0x00
3531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define T1_SLOWLINK		0x08
3541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define T1_READ			B1_READ
3561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define T1_WRITE		B1_WRITE
3571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define T1_INSTAT		B1_INSTAT
3581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define T1_OUTSTAT		B1_OUTSTAT
3591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define T1_IRQENABLE		0x05
3601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define T1_FIFOSTAT		0x06
3611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define T1_RESETLINK		0x10
3621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define T1_ANALYSE		0x11
3631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define T1_IRQMASTER		0x12
3641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define T1_IDENT		0x17
3651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define T1_RESETBOARD		0x1f
3661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define	T1F_IREADY		0x01
3681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define	T1F_IHALF		0x02
3691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define	T1F_IFULL		0x04
3701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define	T1F_IEMPTY		0x08
3711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define	T1F_IFLAGS		0xF0
3721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define	T1F_OREADY		0x10
3741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define	T1F_OHALF		0x20
3751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define	T1F_OEMPTY		0x40
3761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define	T1F_OFULL		0x80
3771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define	T1F_OFLAGS		0xF0
3781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* there are HEMA cards with 1k and 4k FIFO out */
3801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define FIFO_OUTBSIZE		256
3811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define FIFO_INPBSIZE		512
3821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define HEMA_VERSION_ID		0
3841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define HEMA_PAL_ID		0
3851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic inline void t1outp(unsigned int base,
3871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			  unsigned short offset,
3881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			  unsigned char value)
3891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
3901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	outb(value, base + offset);
3911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
3921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic inline unsigned char t1inp(unsigned int base,
394475be4d85a274d0961593db41cf85689db1d583cJoe Perches				  unsigned short offset)
3951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
3961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return inb(base + offset);
3971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
3981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic inline int t1_isfastlink(unsigned int base)
4001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
4011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return (inb(base + T1_IDENT) & ~0x82) == 1;
4021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
4031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
4041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic inline unsigned char t1_fifostatus(unsigned int base)
4051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
4061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return inb(base + T1_FIFOSTAT);
4071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
4081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
4091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic inline unsigned int t1_get_slice(unsigned int base,
4101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					unsigned char *dp)
4111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
4121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned int len, i;
4131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifdef FASTLINK_DEBUG
4141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned wcnt = 0, bcnt = 0;
4151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
4161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
4171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	len = i = b1_get_word(base);
418475be4d85a274d0961593db41cf85689db1d583cJoe Perches	if (t1_isfastlink(base)) {
4191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		int status;
4201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		while (i > 0) {
421475be4d85a274d0961593db41cf85689db1d583cJoe Perches			status = t1_fifostatus(base) & (T1F_IREADY | T1F_IHALF);
4221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			if (i >= FIFO_INPBSIZE) status |= T1F_IFULL;
4231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
4241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			switch (status) {
425475be4d85a274d0961593db41cf85689db1d583cJoe Perches			case T1F_IREADY | T1F_IHALF | T1F_IFULL:
426475be4d85a274d0961593db41cf85689db1d583cJoe Perches				insb(base + B1_READ, dp, FIFO_INPBSIZE);
427475be4d85a274d0961593db41cf85689db1d583cJoe Perches				dp += FIFO_INPBSIZE;
428475be4d85a274d0961593db41cf85689db1d583cJoe Perches				i -= FIFO_INPBSIZE;
4291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifdef FASTLINK_DEBUG
430475be4d85a274d0961593db41cf85689db1d583cJoe Perches				wcnt += FIFO_INPBSIZE;
4311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
432475be4d85a274d0961593db41cf85689db1d583cJoe Perches				break;
433475be4d85a274d0961593db41cf85689db1d583cJoe Perches			case T1F_IREADY | T1F_IHALF:
434475be4d85a274d0961593db41cf85689db1d583cJoe Perches				insb(base + B1_READ, dp, i);
4351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifdef FASTLINK_DEBUG
436475be4d85a274d0961593db41cf85689db1d583cJoe Perches				wcnt += i;
4371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
438475be4d85a274d0961593db41cf85689db1d583cJoe Perches				dp += i;
439475be4d85a274d0961593db41cf85689db1d583cJoe Perches				i = 0;
440475be4d85a274d0961593db41cf85689db1d583cJoe Perches				break;
441475be4d85a274d0961593db41cf85689db1d583cJoe Perches			default:
442475be4d85a274d0961593db41cf85689db1d583cJoe Perches				*dp++ = b1_get_byte(base);
443475be4d85a274d0961593db41cf85689db1d583cJoe Perches				i--;
4441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifdef FASTLINK_DEBUG
445475be4d85a274d0961593db41cf85689db1d583cJoe Perches				bcnt++;
4461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
447475be4d85a274d0961593db41cf85689db1d583cJoe Perches				break;
4481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			}
449475be4d85a274d0961593db41cf85689db1d583cJoe Perches		}
4501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifdef FASTLINK_DEBUG
451475be4d85a274d0961593db41cf85689db1d583cJoe Perches		if (wcnt)
452475be4d85a274d0961593db41cf85689db1d583cJoe Perches			printk(KERN_DEBUG "b1lli(0x%x): get_slice l=%d w=%d b=%d\n",
453475be4d85a274d0961593db41cf85689db1d583cJoe Perches			       base, len, wcnt, bcnt);
4541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
4551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	} else {
4561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		while (i-- > 0)
4571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			*dp++ = b1_get_byte(base);
4581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
4591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return len;
4601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
4611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
4621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic inline void t1_put_slice(unsigned int base,
4631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				unsigned char *dp, unsigned int len)
4641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
4651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned i = len;
4661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	b1_put_word(base, i);
467475be4d85a274d0961593db41cf85689db1d583cJoe Perches	if (t1_isfastlink(base)) {
4681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		int status;
4691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		while (i > 0) {
470475be4d85a274d0961593db41cf85689db1d583cJoe Perches			status = t1_fifostatus(base) & (T1F_OREADY | T1F_OHALF);
4711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			if (i >= FIFO_OUTBSIZE) status |= T1F_OEMPTY;
4721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			switch (status) {
473475be4d85a274d0961593db41cf85689db1d583cJoe Perches			case T1F_OREADY | T1F_OHALF | T1F_OEMPTY:
474475be4d85a274d0961593db41cf85689db1d583cJoe Perches				outsb(base + B1_WRITE, dp, FIFO_OUTBSIZE);
475475be4d85a274d0961593db41cf85689db1d583cJoe Perches				dp += FIFO_OUTBSIZE;
476475be4d85a274d0961593db41cf85689db1d583cJoe Perches				i -= FIFO_OUTBSIZE;
477475be4d85a274d0961593db41cf85689db1d583cJoe Perches				break;
478475be4d85a274d0961593db41cf85689db1d583cJoe Perches			case T1F_OREADY | T1F_OHALF:
479475be4d85a274d0961593db41cf85689db1d583cJoe Perches				outsb(base + B1_WRITE, dp, i);
480475be4d85a274d0961593db41cf85689db1d583cJoe Perches				dp += i;
481475be4d85a274d0961593db41cf85689db1d583cJoe Perches				i = 0;
482475be4d85a274d0961593db41cf85689db1d583cJoe Perches				break;
483475be4d85a274d0961593db41cf85689db1d583cJoe Perches			default:
484475be4d85a274d0961593db41cf85689db1d583cJoe Perches				b1_put_byte(base, *dp++);
485475be4d85a274d0961593db41cf85689db1d583cJoe Perches				i--;
486475be4d85a274d0961593db41cf85689db1d583cJoe Perches				break;
4871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			}
4881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
4891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	} else {
4901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		while (i-- > 0)
4911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			b1_put_byte(base, *dp++);
4921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
4931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
4941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
4951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic inline void t1_disable_irq(unsigned int base)
4961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
497475be4d85a274d0961593db41cf85689db1d583cJoe Perches	t1outp(base, T1_IRQMASTER, 0x00);
4981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
4991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
5001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic inline void t1_reset(unsigned int base)
5011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
502475be4d85a274d0961593db41cf85689db1d583cJoe Perches	/* reset T1 Controller */
503475be4d85a274d0961593db41cf85689db1d583cJoe Perches	b1_reset(base);
504475be4d85a274d0961593db41cf85689db1d583cJoe Perches	/* disable irq on HEMA */
505475be4d85a274d0961593db41cf85689db1d583cJoe Perches	t1outp(base, B1_INSTAT, 0x00);
506475be4d85a274d0961593db41cf85689db1d583cJoe Perches	t1outp(base, B1_OUTSTAT, 0x00);
507475be4d85a274d0961593db41cf85689db1d583cJoe Perches	t1outp(base, T1_IRQMASTER, 0x00);
508475be4d85a274d0961593db41cf85689db1d583cJoe Perches	/* reset HEMA board configuration */
5091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	t1outp(base, T1_RESETBOARD, 0xf);
5101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
5111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
5121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic inline void b1_setinterrupt(unsigned int base, unsigned irq,
5131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				   enum avmcardtype cardtype)
5141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
5151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	switch (cardtype) {
516475be4d85a274d0961593db41cf85689db1d583cJoe Perches	case avm_t1isa:
517475be4d85a274d0961593db41cf85689db1d583cJoe Perches		t1outp(base, B1_INSTAT, 0x00);
518475be4d85a274d0961593db41cf85689db1d583cJoe Perches		t1outp(base, B1_INSTAT, 0x02);
519475be4d85a274d0961593db41cf85689db1d583cJoe Perches		t1outp(base, T1_IRQMASTER, 0x08);
520475be4d85a274d0961593db41cf85689db1d583cJoe Perches		break;
521475be4d85a274d0961593db41cf85689db1d583cJoe Perches	case avm_b1isa:
522475be4d85a274d0961593db41cf85689db1d583cJoe Perches		b1outp(base, B1_INSTAT, 0x00);
523475be4d85a274d0961593db41cf85689db1d583cJoe Perches		b1outp(base, B1_RESET, b1_irq_table[irq]);
524475be4d85a274d0961593db41cf85689db1d583cJoe Perches		b1outp(base, B1_INSTAT, 0x02);
525475be4d85a274d0961593db41cf85689db1d583cJoe Perches		break;
526475be4d85a274d0961593db41cf85689db1d583cJoe Perches	default:
527475be4d85a274d0961593db41cf85689db1d583cJoe Perches	case avm_m1:
528475be4d85a274d0961593db41cf85689db1d583cJoe Perches	case avm_m2:
529475be4d85a274d0961593db41cf85689db1d583cJoe Perches	case avm_b1pci:
530475be4d85a274d0961593db41cf85689db1d583cJoe Perches		b1outp(base, B1_INSTAT, 0x00);
531475be4d85a274d0961593db41cf85689db1d583cJoe Perches		b1outp(base, B1_RESET, 0xf0);
532475be4d85a274d0961593db41cf85689db1d583cJoe Perches		b1outp(base, B1_INSTAT, 0x02);
533475be4d85a274d0961593db41cf85689db1d583cJoe Perches		break;
534475be4d85a274d0961593db41cf85689db1d583cJoe Perches	case avm_c4:
535475be4d85a274d0961593db41cf85689db1d583cJoe Perches	case avm_t1pci:
536475be4d85a274d0961593db41cf85689db1d583cJoe Perches		b1outp(base, B1_RESET, 0xf0);
537475be4d85a274d0961593db41cf85689db1d583cJoe Perches		break;
538475be4d85a274d0961593db41cf85689db1d583cJoe Perches	}
5391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
5401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
5411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* b1.c */
5421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsavmcard *b1_alloc_card(int nr_controllers);
5431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsvoid b1_free_card(avmcard *card);
5441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsint b1_detect(unsigned int base, enum avmcardtype cardtype);
5451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsvoid b1_getrevision(avmcard *card);
546475be4d85a274d0961593db41cf85689db1d583cJoe Perchesint b1_load_t4file(avmcard *card, capiloaddatapart *t4file);
547475be4d85a274d0961593db41cf85689db1d583cJoe Perchesint b1_load_config(avmcard *card, capiloaddatapart *config);
5481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsint b1_loaded(avmcard *card);
5491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
5501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsint b1_load_firmware(struct capi_ctr *ctrl, capiloaddata *data);
5511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsvoid b1_reset_ctr(struct capi_ctr *ctrl);
5521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsvoid b1_register_appl(struct capi_ctr *ctrl, u16 appl,
553475be4d85a274d0961593db41cf85689db1d583cJoe Perches		      capi_register_params *rp);
5541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsvoid b1_release_appl(struct capi_ctr *ctrl, u16 appl);
5551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsu16  b1_send_message(struct capi_ctr *ctrl, struct sk_buff *skb);
5561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsvoid b1_parse_version(avmctrl_info *card);
5577d12e780e003f93433d49ce78cfedf4b4c52adc5David Howellsirqreturn_t b1_interrupt(int interrupt, void *devptr);
5581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
5599a58a80a701bdb2d220cdab4914218df5b48d781Alexey Dobriyanextern const struct file_operations b1ctl_proc_fops;
5601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
5611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsavmcard_dmainfo *avmcard_dma_alloc(char *name, struct pci_dev *,
5621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				   long rsize, long ssize);
5631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsvoid avmcard_dma_free(avmcard_dmainfo *);
5641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
5651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* b1dma.c */
5661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsint b1pciv4_detect(avmcard *card);
5671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsint t1pci_detect(avmcard *card);
5681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsvoid b1dma_reset(avmcard *card);
5697d12e780e003f93433d49ce78cfedf4b4c52adc5David Howellsirqreturn_t b1dma_interrupt(int interrupt, void *devptr);
5701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
5711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsint b1dma_load_firmware(struct capi_ctr *ctrl, capiloaddata *data);
5721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsvoid b1dma_reset_ctr(struct capi_ctr *ctrl);
5731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsvoid b1dma_remove_ctr(struct capi_ctr *ctrl);
5741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsvoid b1dma_register_appl(struct capi_ctr *ctrl,
575475be4d85a274d0961593db41cf85689db1d583cJoe Perches			 u16 appl,
576475be4d85a274d0961593db41cf85689db1d583cJoe Perches			 capi_register_params *rp);
5771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsvoid b1dma_release_appl(struct capi_ctr *ctrl, u16 appl);
5781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsu16  b1dma_send_message(struct capi_ctr *ctrl, struct sk_buff *skb);
5799a58a80a701bdb2d220cdab4914218df5b48d781Alexey Dobriyanextern const struct file_operations b1dmactl_proc_fops;
5801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
5811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif /* _AVMCARD_H_ */
582