Path: blob/master/drivers/isdn/hardware/avm/avmcard.h
15112 views
/* $Id: avmcard.h,v 1.1.4.1.2.1 2001/12/21 15:00:17 kai Exp $1*2* Copyright 1999 by Carsten Paeth <[email protected]>3*4* This software may be used and distributed according to the terms5* of the GNU General Public License, incorporated herein by reference.6*7*/89#ifndef _AVMCARD_H_10#define _AVMCARD_H_1112#include <linux/spinlock.h>13#include <linux/list.h>14#include <linux/interrupt.h>1516#define AVMB1_PORTLEN 0x1f17#define AVM_MAXVERSION 818#define AVM_NCCI_PER_CHANNEL 41920/*21* Versions22*/2324#define VER_DRIVER 025#define VER_CARDTYPE 126#define VER_HWID 227#define VER_SERIAL 328#define VER_OPTION 429#define VER_PROTO 530#define VER_PROFILE 631#define VER_CAPI 73233enum avmcardtype {34avm_b1isa,35avm_b1pci,36avm_b1pcmcia,37avm_m1,38avm_m2,39avm_t1isa,40avm_t1pci,41avm_c4,42avm_c243};4445typedef struct avmcard_dmabuf {46long size;47u8 *dmabuf;48dma_addr_t dmaaddr;49} avmcard_dmabuf;5051typedef struct avmcard_dmainfo {52u32 recvlen;53avmcard_dmabuf recvbuf;5455avmcard_dmabuf sendbuf;56struct sk_buff_head send_queue;5758struct pci_dev *pcidev;59} avmcard_dmainfo;6061typedef struct avmctrl_info {62char cardname[32];6364int versionlen;65char versionbuf[1024];66char *version[AVM_MAXVERSION];6768char infobuf[128]; /* for function procinfo */6970struct avmcard *card;71struct capi_ctr capi_ctrl;7273struct list_head ncci_head;74} avmctrl_info;7576typedef struct avmcard {77char name[32];7879spinlock_t lock;80unsigned int port;81unsigned irq;82unsigned long membase;83enum avmcardtype cardtype;84unsigned char revision;85unsigned char class;86int cardnr; /* for t1isa */8788char msgbuf[128]; /* capimsg msg part */89char databuf[2048]; /* capimsg data part */9091void __iomem *mbase;92volatile u32 csr;93avmcard_dmainfo *dma;9495struct avmctrl_info *ctrlinfo;9697u_int nr_controllers;98u_int nlogcontr;99struct list_head list;100} avmcard;101102extern int b1_irq_table[16];103104/*105* LLI Messages to the ISDN-ControllerISDN Controller106*/107108#define SEND_POLL 0x72 /*109* after load <- RECEIVE_POLL110*/111#define SEND_INIT 0x11 /*112* first message <- RECEIVE_INIT113* int32 NumApplications int32114* NumNCCIs int32 BoardNumber115*/116#define SEND_REGISTER 0x12 /*117* register an application int32118* ApplIDId int32 NumMessages119* int32 NumB3Connections int32120* NumB3Blocks int32 B3Size121*122* AnzB3Connection != 0 &&123* AnzB3Blocks >= 1 && B3Size >= 1124*/125#define SEND_RELEASE 0x14 /*126* deregister an application int32127* ApplID128*/129#define SEND_MESSAGE 0x15 /*130* send capi-message int32 length131* capi-data ...132*/133#define SEND_DATA_B3_REQ 0x13 /*134* send capi-data-message int32135* MsgLength capi-data ... int32136* B3Length data ....137*/138139#define SEND_CONFIG 0x21 /*140*/141142#define SEND_POLLACK 0x73 /* T1 Watchdog */143144/*145* LLI Messages from the ISDN-ControllerISDN Controller146*/147148#define RECEIVE_POLL 0x32 /*149* <- after SEND_POLL150*/151#define RECEIVE_INIT 0x27 /*152* <- after SEND_INIT int32 length153* byte total length b1struct board154* driver revision b1struct card155* type b1struct reserved b1struct156* serial number b1struct driver157* capability b1struct d-channel158* protocol b1struct CAPI-2.0159* profile b1struct capi version160*/161#define RECEIVE_MESSAGE 0x21 /*162* <- after SEND_MESSAGE int32163* AppllID int32 Length capi-data164* ....165*/166#define RECEIVE_DATA_B3_IND 0x22 /*167* received data int32 AppllID168* int32 Length capi-data ...169* int32 B3Length data ...170*/171#define RECEIVE_START 0x23 /*172* Handshake173*/174#define RECEIVE_STOP 0x24 /*175* Handshake176*/177#define RECEIVE_NEW_NCCI 0x25 /*178* int32 AppllID int32 NCCI int32179* WindowSize180*/181#define RECEIVE_FREE_NCCI 0x26 /*182* int32 AppllID int32 NCCI183*/184#define RECEIVE_RELEASE 0x26 /*185* int32 AppllID int32 0xffffffff186*/187#define RECEIVE_TASK_READY 0x31 /*188* int32 tasknr189* int32 Length Taskname ...190*/191#define RECEIVE_DEBUGMSG 0x71 /*192* int32 Length message193*194*/195#define RECEIVE_POLLDWORD 0x75 /* t1pci in dword mode */196197#define WRITE_REGISTER 0x00198#define READ_REGISTER 0x01199200/*201* port offsets202*/203204#define B1_READ 0x00205#define B1_WRITE 0x01206#define B1_INSTAT 0x02207#define B1_OUTSTAT 0x03208#define B1_ANALYSE 0x04209#define B1_REVISION 0x05210#define B1_RESET 0x10211212213#define B1_STAT0(cardtype) ((cardtype) == avm_m1 ? 0x81200000l : 0x80A00000l)214#define B1_STAT1(cardtype) (0x80E00000l)215216/* ---------------------------------------------------------------- */217218static inline unsigned char b1outp(unsigned int base,219unsigned short offset,220unsigned char value)221{222outb(value, base + offset);223return inb(base + B1_ANALYSE);224}225226227static inline int b1_rx_full(unsigned int base)228{229return inb(base + B1_INSTAT) & 0x1;230}231232static inline unsigned char b1_get_byte(unsigned int base)233{234unsigned long stop = jiffies + 1 * HZ; /* maximum wait time 1 sec */235while (!b1_rx_full(base) && time_before(jiffies, stop));236if (b1_rx_full(base))237return inb(base + B1_READ);238printk(KERN_CRIT "b1lli(0x%x): rx not full after 1 second\n", base);239return 0;240}241242static inline unsigned int b1_get_word(unsigned int base)243{244unsigned int val = 0;245val |= b1_get_byte(base);246val |= (b1_get_byte(base) << 8);247val |= (b1_get_byte(base) << 16);248val |= (b1_get_byte(base) << 24);249return val;250}251252static inline int b1_tx_empty(unsigned int base)253{254return inb(base + B1_OUTSTAT) & 0x1;255}256257static inline void b1_put_byte(unsigned int base, unsigned char val)258{259while (!b1_tx_empty(base));260b1outp(base, B1_WRITE, val);261}262263static inline int b1_save_put_byte(unsigned int base, unsigned char val)264{265unsigned long stop = jiffies + 2 * HZ;266while (!b1_tx_empty(base) && time_before(jiffies,stop));267if (!b1_tx_empty(base)) return -1;268b1outp(base, B1_WRITE, val);269return 0;270}271272static inline void b1_put_word(unsigned int base, unsigned int val)273{274b1_put_byte(base, val & 0xff);275b1_put_byte(base, (val >> 8) & 0xff);276b1_put_byte(base, (val >> 16) & 0xff);277b1_put_byte(base, (val >> 24) & 0xff);278}279280static inline unsigned int b1_get_slice(unsigned int base,281unsigned char *dp)282{283unsigned int len, i;284285len = i = b1_get_word(base);286while (i-- > 0) *dp++ = b1_get_byte(base);287return len;288}289290static inline void b1_put_slice(unsigned int base,291unsigned char *dp, unsigned int len)292{293unsigned i = len;294b1_put_word(base, i);295while (i-- > 0)296b1_put_byte(base, *dp++);297}298299static void b1_wr_reg(unsigned int base,300unsigned int reg,301unsigned int value)302{303b1_put_byte(base, WRITE_REGISTER);304b1_put_word(base, reg);305b1_put_word(base, value);306}307308static inline unsigned int b1_rd_reg(unsigned int base,309unsigned int reg)310{311b1_put_byte(base, READ_REGISTER);312b1_put_word(base, reg);313return b1_get_word(base);314315}316317static inline void b1_reset(unsigned int base)318{319b1outp(base, B1_RESET, 0);320mdelay(55 * 2); /* 2 TIC's */321322b1outp(base, B1_RESET, 1);323mdelay(55 * 2); /* 2 TIC's */324325b1outp(base, B1_RESET, 0);326mdelay(55 * 2); /* 2 TIC's */327}328329static inline unsigned char b1_disable_irq(unsigned int base)330{331return b1outp(base, B1_INSTAT, 0x00);332}333334/* ---------------------------------------------------------------- */335336static inline void b1_set_test_bit(unsigned int base,337enum avmcardtype cardtype,338int onoff)339{340b1_wr_reg(base, B1_STAT0(cardtype), onoff ? 0x21 : 0x20);341}342343static inline int b1_get_test_bit(unsigned int base,344enum avmcardtype cardtype)345{346return (b1_rd_reg(base, B1_STAT0(cardtype)) & 0x01) != 0;347}348349/* ---------------------------------------------------------------- */350351#define T1_FASTLINK 0x00352#define T1_SLOWLINK 0x08353354#define T1_READ B1_READ355#define T1_WRITE B1_WRITE356#define T1_INSTAT B1_INSTAT357#define T1_OUTSTAT B1_OUTSTAT358#define T1_IRQENABLE 0x05359#define T1_FIFOSTAT 0x06360#define T1_RESETLINK 0x10361#define T1_ANALYSE 0x11362#define T1_IRQMASTER 0x12363#define T1_IDENT 0x17364#define T1_RESETBOARD 0x1f365366#define T1F_IREADY 0x01367#define T1F_IHALF 0x02368#define T1F_IFULL 0x04369#define T1F_IEMPTY 0x08370#define T1F_IFLAGS 0xF0371372#define T1F_OREADY 0x10373#define T1F_OHALF 0x20374#define T1F_OEMPTY 0x40375#define T1F_OFULL 0x80376#define T1F_OFLAGS 0xF0377378/* there are HEMA cards with 1k and 4k FIFO out */379#define FIFO_OUTBSIZE 256380#define FIFO_INPBSIZE 512381382#define HEMA_VERSION_ID 0383#define HEMA_PAL_ID 0384385static inline void t1outp(unsigned int base,386unsigned short offset,387unsigned char value)388{389outb(value, base + offset);390}391392static inline unsigned char t1inp(unsigned int base,393unsigned short offset)394{395return inb(base + offset);396}397398static inline int t1_isfastlink(unsigned int base)399{400return (inb(base + T1_IDENT) & ~0x82) == 1;401}402403static inline unsigned char t1_fifostatus(unsigned int base)404{405return inb(base + T1_FIFOSTAT);406}407408static inline unsigned int t1_get_slice(unsigned int base,409unsigned char *dp)410{411unsigned int len, i;412#ifdef FASTLINK_DEBUG413unsigned wcnt = 0, bcnt = 0;414#endif415416len = i = b1_get_word(base);417if (t1_isfastlink(base)) {418int status;419while (i > 0) {420status = t1_fifostatus(base) & (T1F_IREADY|T1F_IHALF);421if (i >= FIFO_INPBSIZE) status |= T1F_IFULL;422423switch (status) {424case T1F_IREADY|T1F_IHALF|T1F_IFULL:425insb(base+B1_READ, dp, FIFO_INPBSIZE);426dp += FIFO_INPBSIZE;427i -= FIFO_INPBSIZE;428#ifdef FASTLINK_DEBUG429wcnt += FIFO_INPBSIZE;430#endif431break;432case T1F_IREADY|T1F_IHALF:433insb(base+B1_READ,dp, i);434#ifdef FASTLINK_DEBUG435wcnt += i;436#endif437dp += i;438i = 0;439break;440default:441*dp++ = b1_get_byte(base);442i--;443#ifdef FASTLINK_DEBUG444bcnt++;445#endif446break;447}448}449#ifdef FASTLINK_DEBUG450if (wcnt)451printk(KERN_DEBUG "b1lli(0x%x): get_slice l=%d w=%d b=%d\n",452base, len, wcnt, bcnt);453#endif454} else {455while (i-- > 0)456*dp++ = b1_get_byte(base);457}458return len;459}460461static inline void t1_put_slice(unsigned int base,462unsigned char *dp, unsigned int len)463{464unsigned i = len;465b1_put_word(base, i);466if (t1_isfastlink(base)) {467int status;468while (i > 0) {469status = t1_fifostatus(base) & (T1F_OREADY|T1F_OHALF);470if (i >= FIFO_OUTBSIZE) status |= T1F_OEMPTY;471switch (status) {472case T1F_OREADY|T1F_OHALF|T1F_OEMPTY:473outsb(base+B1_WRITE, dp, FIFO_OUTBSIZE);474dp += FIFO_OUTBSIZE;475i -= FIFO_OUTBSIZE;476break;477case T1F_OREADY|T1F_OHALF:478outsb(base+B1_WRITE, dp, i);479dp += i;480i = 0;481break;482default:483b1_put_byte(base, *dp++);484i--;485break;486}487}488} else {489while (i-- > 0)490b1_put_byte(base, *dp++);491}492}493494static inline void t1_disable_irq(unsigned int base)495{496t1outp(base, T1_IRQMASTER, 0x00);497}498499static inline void t1_reset(unsigned int base)500{501/* reset T1 Controller */502b1_reset(base);503/* disable irq on HEMA */504t1outp(base, B1_INSTAT, 0x00);505t1outp(base, B1_OUTSTAT, 0x00);506t1outp(base, T1_IRQMASTER, 0x00);507/* reset HEMA board configuration */508t1outp(base, T1_RESETBOARD, 0xf);509}510511static inline void b1_setinterrupt(unsigned int base, unsigned irq,512enum avmcardtype cardtype)513{514switch (cardtype) {515case avm_t1isa:516t1outp(base, B1_INSTAT, 0x00);517t1outp(base, B1_INSTAT, 0x02);518t1outp(base, T1_IRQMASTER, 0x08);519break;520case avm_b1isa:521b1outp(base, B1_INSTAT, 0x00);522b1outp(base, B1_RESET, b1_irq_table[irq]);523b1outp(base, B1_INSTAT, 0x02);524break;525default:526case avm_m1:527case avm_m2:528case avm_b1pci:529b1outp(base, B1_INSTAT, 0x00);530b1outp(base, B1_RESET, 0xf0);531b1outp(base, B1_INSTAT, 0x02);532break;533case avm_c4:534case avm_t1pci:535b1outp(base, B1_RESET, 0xf0);536break;537}538}539540/* b1.c */541avmcard *b1_alloc_card(int nr_controllers);542void b1_free_card(avmcard *card);543int b1_detect(unsigned int base, enum avmcardtype cardtype);544void b1_getrevision(avmcard *card);545int b1_load_t4file(avmcard *card, capiloaddatapart * t4file);546int b1_load_config(avmcard *card, capiloaddatapart * config);547int b1_loaded(avmcard *card);548549int b1_load_firmware(struct capi_ctr *ctrl, capiloaddata *data);550void b1_reset_ctr(struct capi_ctr *ctrl);551void b1_register_appl(struct capi_ctr *ctrl, u16 appl,552capi_register_params *rp);553void b1_release_appl(struct capi_ctr *ctrl, u16 appl);554u16 b1_send_message(struct capi_ctr *ctrl, struct sk_buff *skb);555void b1_parse_version(avmctrl_info *card);556irqreturn_t b1_interrupt(int interrupt, void *devptr);557558extern const struct file_operations b1ctl_proc_fops;559560avmcard_dmainfo *avmcard_dma_alloc(char *name, struct pci_dev *,561long rsize, long ssize);562void avmcard_dma_free(avmcard_dmainfo *);563564/* b1dma.c */565int b1pciv4_detect(avmcard *card);566int t1pci_detect(avmcard *card);567void b1dma_reset(avmcard *card);568irqreturn_t b1dma_interrupt(int interrupt, void *devptr);569570int b1dma_load_firmware(struct capi_ctr *ctrl, capiloaddata *data);571void b1dma_reset_ctr(struct capi_ctr *ctrl);572void b1dma_remove_ctr(struct capi_ctr *ctrl);573void b1dma_register_appl(struct capi_ctr *ctrl,574u16 appl,575capi_register_params *rp);576void b1dma_release_appl(struct capi_ctr *ctrl, u16 appl);577u16 b1dma_send_message(struct capi_ctr *ctrl, struct sk_buff *skb);578extern const struct file_operations b1dmactl_proc_fops;579580#endif /* _AVMCARD_H_ */581582583