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