avmcard.h
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:13k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. /* $Id: avmcard.h,v 1.1.4.1 2001/11/20 14:19:34 kai Exp $
  2.  *
  3.  * Copyright 1999 by Carsten Paeth <calle@calle.de>
  4.  *
  5.  * This software may be used and distributed according to the terms
  6.  * of the GNU General Public License, incorporated herein by reference.
  7.  *
  8.  */
  9. #ifndef _AVMCARD_H_
  10. #define _AVMCARD_H_
  11. #define AVMB1_PORTLEN 0x1f
  12. #define AVM_MAXVERSION 8
  13. #define AVM_NCCI_PER_CHANNEL 4
  14. /*
  15.  * Versions
  16.  */
  17. #define VER_DRIVER 0
  18. #define VER_CARDTYPE 1
  19. #define VER_HWID 2
  20. #define VER_SERIAL 3
  21. #define VER_OPTION 4
  22. #define VER_PROTO 5
  23. #define VER_PROFILE 6
  24. #define VER_CAPI 7
  25. enum avmcardtype {
  26. avm_b1isa,
  27. avm_b1pci,
  28. avm_b1pcmcia,
  29. avm_m1,
  30. avm_m2,
  31. avm_t1isa,
  32. avm_t1pci,
  33. avm_c4,
  34. avm_c2
  35. };
  36. typedef struct avmcard_dmainfo {
  37. __u32 recvlen;   
  38. __u8  recvbuf[128+2048];
  39. struct sk_buff_head send_queue;
  40. __u8  sendbuf[128+2048];
  41. } avmcard_dmainfo;
  42. typedef struct avmcard {
  43. char name[32];
  44. unsigned int port;
  45. unsigned irq;
  46. unsigned long membase;
  47. enum avmcardtype cardtype;
  48. unsigned char revision;
  49. unsigned char class;
  50. int cardnr; /* for t1isa */
  51. char msgbuf[128]; /* capimsg msg part */
  52. char databuf[2048]; /* capimsg data part */
  53. int interrupt;
  54. void *mbase;
  55. volatile __u32 csr;
  56. avmcard_dmainfo *dma;
  57. struct avmctrl_info {
  58. char cardname[32];
  59. int versionlen;
  60. char versionbuf[1024];
  61. char *version[AVM_MAXVERSION];
  62. char infobuf[128]; /* for function procinfo */
  63. struct avmcard  *card;
  64. struct capi_ctr *capi_ctrl;
  65. } *ctrlinfo;
  66. int nlogcontr;
  67. } avmcard;
  68. typedef struct avmctrl_info avmctrl_info;
  69. extern int b1_irq_table[16];
  70. /*
  71.  * LLI Messages to the ISDN-ControllerISDN Controller 
  72.  */
  73. #define SEND_POLL 0x72 /*
  74.    * after load <- RECEIVE_POLL 
  75.  */
  76. #define SEND_INIT 0x11 /*
  77.    * first message <- RECEIVE_INIT
  78.    * int32 NumApplications  int32
  79.    * NumNCCIs int32 BoardNumber 
  80.  */
  81. #define SEND_REGISTER 0x12 /*
  82.    * register an application int32
  83.    * ApplIDId int32 NumMessages
  84.    * int32 NumB3Connections int32
  85.    * NumB3Blocks int32 B3Size
  86.    * 
  87.    * AnzB3Connection != 0 &&
  88.    * AnzB3Blocks >= 1 && B3Size >= 1 
  89.  */
  90. #define SEND_RELEASE 0x14 /*
  91.    * deregister an application int32 
  92.    * ApplID 
  93.  */
  94. #define SEND_MESSAGE 0x15 /*
  95.    * send capi-message int32 length
  96.    * capi-data ... 
  97.  */
  98. #define SEND_DATA_B3_REQ 0x13 /*
  99.    * send capi-data-message int32
  100.    * MsgLength capi-data ... int32
  101.    * B3Length data .... 
  102.  */
  103. #define SEND_CONFIG 0x21    /*
  104.                                          */
  105. #define SEND_POLLACK 0x73    /* T1 Watchdog */
  106. /*
  107.  * LLI Messages from the ISDN-ControllerISDN Controller 
  108.  */
  109. #define RECEIVE_POLL 0x32 /*
  110.    * <- after SEND_POLL 
  111.  */
  112. #define RECEIVE_INIT 0x27 /*
  113.    * <- after SEND_INIT int32 length
  114.    * byte total length b1struct board 
  115.    * driver revision b1struct card
  116.    * type b1struct reserved b1struct
  117.    * serial number b1struct driver
  118.    * capability b1struct d-channel
  119.    * protocol b1struct CAPI-2.0
  120.    * profile b1struct capi version 
  121.  */
  122. #define RECEIVE_MESSAGE 0x21 /*
  123.    * <- after SEND_MESSAGE int32
  124.    * AppllID int32 Length capi-data
  125.    * .... 
  126.  */
  127. #define RECEIVE_DATA_B3_IND 0x22 /*
  128.    * received data int32 AppllID
  129.    * int32 Length capi-data ...
  130.    * int32 B3Length data ... 
  131.  */
  132. #define RECEIVE_START 0x23 /*
  133.    * Handshake 
  134.  */
  135. #define RECEIVE_STOP 0x24 /*
  136.    * Handshake 
  137.  */
  138. #define RECEIVE_NEW_NCCI 0x25 /*
  139.    * int32 AppllID int32 NCCI int32
  140.    * WindowSize 
  141.  */
  142. #define RECEIVE_FREE_NCCI 0x26 /*
  143.    * int32 AppllID int32 NCCI 
  144.  */
  145. #define RECEIVE_RELEASE 0x26 /*
  146.    * int32 AppllID int32 0xffffffff 
  147.  */
  148. #define RECEIVE_TASK_READY 0x31 /*
  149.    * int32 tasknr
  150.    * int32 Length Taskname ...
  151.  */
  152. #define RECEIVE_DEBUGMSG 0x71 /*
  153.    * int32 Length message
  154.    * 
  155.  */
  156. #define RECEIVE_POLLDWORD 0x75 /* t1pci in dword mode */
  157. #define WRITE_REGISTER 0x00
  158. #define READ_REGISTER 0x01
  159. /*
  160.  * port offsets
  161.  */
  162. #define B1_READ 0x00
  163. #define B1_WRITE 0x01
  164. #define B1_INSTAT 0x02
  165. #define B1_OUTSTAT 0x03
  166. #define B1_ANALYSE 0x04
  167. #define B1_REVISION 0x05
  168. #define B1_RESET 0x10
  169. #define B1_STAT0(cardtype)  ((cardtype) == avm_m1 ? 0x81200000l : 0x80A00000l)
  170. #define B1_STAT1(cardtype)  (0x80E00000l)
  171. /* ---------------------------------------------------------------- */
  172. static inline unsigned char b1outp(unsigned int base,
  173.    unsigned short offset,
  174.    unsigned char value)
  175. {
  176. outb(value, base + offset);
  177. return inb(base + B1_ANALYSE);
  178. }
  179. static inline int b1_rx_full(unsigned int base)
  180. {
  181. return inb(base + B1_INSTAT) & 0x1;
  182. }
  183. static inline unsigned char b1_get_byte(unsigned int base)
  184. {
  185. unsigned long stop = jiffies + 1 * HZ; /* maximum wait time 1 sec */
  186. while (!b1_rx_full(base) && time_before(jiffies, stop));
  187. if (b1_rx_full(base))
  188. return inb(base + B1_READ);
  189. printk(KERN_CRIT "b1lli(0x%x): rx not full after 1 secondn", base);
  190. return 0;
  191. }
  192. static inline unsigned int b1_get_word(unsigned int base)
  193. {
  194. unsigned int val = 0;
  195. val |= b1_get_byte(base);
  196. val |= (b1_get_byte(base) << 8);
  197. val |= (b1_get_byte(base) << 16);
  198. val |= (b1_get_byte(base) << 24);
  199. return val;
  200. }
  201. static inline int b1_tx_empty(unsigned int base)
  202. {
  203. return inb(base + B1_OUTSTAT) & 0x1;
  204. }
  205. static inline void b1_put_byte(unsigned int base, unsigned char val)
  206. {
  207. while (!b1_tx_empty(base));
  208. b1outp(base, B1_WRITE, val);
  209. }
  210. static inline int b1_save_put_byte(unsigned int base, unsigned char val)
  211. {
  212. unsigned long stop = jiffies + 2 * HZ;
  213. while (!b1_tx_empty(base) && time_before(jiffies,stop));
  214. if (!b1_tx_empty(base)) return -1;
  215. b1outp(base, B1_WRITE, val);
  216. return 0;
  217. }
  218. static inline void b1_put_word(unsigned int base, unsigned int val)
  219. {
  220. b1_put_byte(base, val & 0xff);
  221. b1_put_byte(base, (val >> 8) & 0xff);
  222. b1_put_byte(base, (val >> 16) & 0xff);
  223. b1_put_byte(base, (val >> 24) & 0xff);
  224. }
  225. static inline unsigned int b1_get_slice(unsigned int base,
  226. unsigned char *dp)
  227. {
  228. unsigned int len, i;
  229. len = i = b1_get_word(base);
  230. while (i-- > 0) *dp++ = b1_get_byte(base);
  231. return len;
  232. }
  233. static inline void b1_put_slice(unsigned int base,
  234. unsigned char *dp, unsigned int len)
  235. {
  236. unsigned i = len;
  237. b1_put_word(base, i);
  238. while (i-- > 0)
  239. b1_put_byte(base, *dp++);
  240. }
  241. static void b1_wr_reg(unsigned int base,
  242.                       unsigned int reg,
  243.       unsigned int value)
  244. {
  245. b1_put_byte(base, WRITE_REGISTER);
  246.         b1_put_word(base, reg);
  247.         b1_put_word(base, value);
  248. }
  249. static inline unsigned int b1_rd_reg(unsigned int base,
  250.                                      unsigned int reg)
  251. {
  252. b1_put_byte(base, READ_REGISTER);
  253.         b1_put_word(base, reg);
  254.         return b1_get_word(base);
  255. }
  256. static inline void b1_reset(unsigned int base)
  257. {
  258. b1outp(base, B1_RESET, 0);
  259. mdelay(55 * 2); /* 2 TIC's */
  260. b1outp(base, B1_RESET, 1);
  261. mdelay(55 * 2); /* 2 TIC's */
  262. b1outp(base, B1_RESET, 0);
  263. mdelay(55 * 2); /* 2 TIC's */
  264. }
  265. static inline unsigned char b1_disable_irq(unsigned int base)
  266. {
  267. return b1outp(base, B1_INSTAT, 0x00);
  268. }
  269. /* ---------------------------------------------------------------- */
  270. static inline void b1_set_test_bit(unsigned int base,
  271.    enum avmcardtype cardtype,
  272.    int onoff)
  273. {
  274.     b1_wr_reg(base, B1_STAT0(cardtype), onoff ? 0x21 : 0x20);
  275. }
  276. static inline int b1_get_test_bit(unsigned int base,
  277.                                   enum avmcardtype cardtype)
  278. {
  279.     return (b1_rd_reg(base, B1_STAT0(cardtype)) & 0x01) != 0;
  280. }
  281. /* ---------------------------------------------------------------- */
  282. #define T1_FASTLINK 0x00
  283. #define T1_SLOWLINK 0x08
  284. #define T1_READ B1_READ
  285. #define T1_WRITE B1_WRITE
  286. #define T1_INSTAT B1_INSTAT
  287. #define T1_OUTSTAT B1_OUTSTAT
  288. #define T1_IRQENABLE 0x05
  289. #define T1_FIFOSTAT 0x06
  290. #define T1_RESETLINK 0x10
  291. #define T1_ANALYSE 0x11
  292. #define T1_IRQMASTER 0x12
  293. #define T1_IDENT 0x17
  294. #define T1_RESETBOARD 0x1f
  295. #define T1F_IREADY 0x01
  296. #define T1F_IHALF 0x02
  297. #define T1F_IFULL 0x04
  298. #define T1F_IEMPTY 0x08
  299. #define T1F_IFLAGS 0xF0
  300. #define T1F_OREADY 0x10
  301. #define T1F_OHALF 0x20
  302. #define T1F_OEMPTY 0x40
  303. #define T1F_OFULL 0x80
  304. #define T1F_OFLAGS 0xF0
  305. /* there are HEMA cards with 1k and 4k FIFO out */
  306. #define FIFO_OUTBSIZE 256
  307. #define FIFO_INPBSIZE 512
  308. #define HEMA_VERSION_ID 0
  309. #define HEMA_PAL_ID 0
  310. static inline void t1outp(unsigned int base,
  311.   unsigned short offset,
  312.   unsigned char value)
  313. {
  314. outb(value, base + offset);
  315. }
  316. static inline unsigned char t1inp(unsigned int base,
  317.           unsigned short offset)
  318. {
  319. return inb(base + offset);
  320. }
  321. static inline int t1_isfastlink(unsigned int base)
  322. {
  323. return (inb(base + T1_IDENT) & ~0x82) == 1;
  324. }
  325. static inline unsigned char t1_fifostatus(unsigned int base)
  326. {
  327. return inb(base + T1_FIFOSTAT);
  328. }
  329. static inline unsigned int t1_get_slice(unsigned int base,
  330. unsigned char *dp)
  331. {
  332. unsigned int len, i;
  333. #ifdef FASTLINK_DEBUG
  334. unsigned wcnt = 0, bcnt = 0;
  335. #endif
  336. len = i = b1_get_word(base);
  337.         if (t1_isfastlink(base)) {
  338. int status;
  339. while (i > 0) {
  340. status = t1_fifostatus(base) & (T1F_IREADY|T1F_IHALF);
  341. if (i >= FIFO_INPBSIZE) status |= T1F_IFULL;
  342. switch (status) {
  343. case T1F_IREADY|T1F_IHALF|T1F_IFULL:
  344. insb(base+B1_READ, dp, FIFO_INPBSIZE);
  345. dp += FIFO_INPBSIZE;
  346. i -= FIFO_INPBSIZE;
  347. #ifdef FASTLINK_DEBUG
  348. wcnt += FIFO_INPBSIZE;
  349. #endif
  350. break;
  351. case T1F_IREADY|T1F_IHALF: 
  352. insb(base+B1_READ,dp, i);
  353. #ifdef FASTLINK_DEBUG
  354. wcnt += i;
  355. #endif
  356. dp += i;
  357. i = 0;
  358. if (i == 0)
  359. break;
  360. /* fall through */
  361. default:
  362. *dp++ = b1_get_byte(base);
  363. i--;
  364. #ifdef FASTLINK_DEBUG
  365. bcnt++;
  366. #endif
  367. break;
  368. }
  369.     }
  370. #ifdef FASTLINK_DEBUG
  371.     if (wcnt)
  372.     printk(KERN_DEBUG "b1lli(0x%x): get_slice l=%d w=%d b=%dn",
  373. base, len, wcnt, bcnt);
  374. #endif
  375. } else {
  376. while (i-- > 0)
  377. *dp++ = b1_get_byte(base);
  378. }
  379. return len;
  380. }
  381. static inline void t1_put_slice(unsigned int base,
  382. unsigned char *dp, unsigned int len)
  383. {
  384. unsigned i = len;
  385. b1_put_word(base, i);
  386.         if (t1_isfastlink(base)) {
  387. int status;
  388. while (i > 0) {
  389. status = t1_fifostatus(base) & (T1F_OREADY|T1F_OHALF);
  390. if (i >= FIFO_OUTBSIZE) status |= T1F_OEMPTY;
  391. switch (status) {
  392. case T1F_OREADY|T1F_OHALF|T1F_OEMPTY: 
  393. outsb(base+B1_WRITE, dp, FIFO_OUTBSIZE);
  394. dp += FIFO_OUTBSIZE;
  395. i -= FIFO_OUTBSIZE;
  396. break;
  397. case T1F_OREADY|T1F_OHALF: 
  398. outsb(base+B1_WRITE, dp, i);
  399. dp += i;
  400. i = 0;
  401.         break;
  402. default:
  403. b1_put_byte(base, *dp++);
  404. i--;
  405. break;
  406. }
  407. }
  408. } else {
  409. while (i-- > 0)
  410. b1_put_byte(base, *dp++);
  411. }
  412. }
  413. static inline void t1_disable_irq(unsigned int base)
  414. {
  415.       t1outp(base, T1_IRQMASTER, 0x00);
  416. }
  417. static inline void t1_reset(unsigned int base)
  418. {
  419.         /* reset T1 Controller */
  420.         b1_reset(base);
  421.         /* disable irq on HEMA */
  422.         t1outp(base, B1_INSTAT, 0x00);
  423.         t1outp(base, B1_OUTSTAT, 0x00);
  424.         t1outp(base, T1_IRQMASTER, 0x00);
  425.         /* reset HEMA board configuration */
  426. t1outp(base, T1_RESETBOARD, 0xf);
  427. }
  428. static inline void b1_setinterrupt(unsigned int base, unsigned irq,
  429.    enum avmcardtype cardtype)
  430. {
  431. switch (cardtype) {
  432.    case avm_t1isa:
  433.               t1outp(base, B1_INSTAT, 0x00);
  434.               t1outp(base, B1_INSTAT, 0x02);
  435.       t1outp(base, T1_IRQMASTER, 0x08);
  436.       break;
  437.    case avm_b1isa:
  438.       b1outp(base, B1_INSTAT, 0x00);
  439.       b1outp(base, B1_RESET, b1_irq_table[irq]);
  440.       b1outp(base, B1_INSTAT, 0x02);
  441.       break;
  442.    default:
  443.    case avm_m1:
  444.    case avm_m2:
  445.    case avm_b1pci:
  446.       b1outp(base, B1_INSTAT, 0x00);
  447.       b1outp(base, B1_RESET, 0xf0);
  448.       b1outp(base, B1_INSTAT, 0x02);
  449.       break;
  450.    case avm_c4:
  451.    case avm_t1pci:
  452.       b1outp(base, B1_RESET, 0xf0);
  453.       break;
  454.  }
  455. }
  456. /* b1.c */
  457. int b1_detect(unsigned int base, enum avmcardtype cardtype);
  458. void b1_getrevision(avmcard *card);
  459. int b1_load_t4file(avmcard *card, capiloaddatapart * t4file);
  460. int b1_load_config(avmcard *card, capiloaddatapart * config);
  461. int b1_loaded(avmcard *card);
  462. int b1_load_firmware(struct capi_ctr *ctrl, capiloaddata *data);
  463. void b1_reset_ctr(struct capi_ctr *ctrl);
  464. void b1_register_appl(struct capi_ctr *ctrl, __u16 appl,
  465. capi_register_params *rp);
  466. void b1_release_appl(struct capi_ctr *ctrl, __u16 appl);
  467. void b1_send_message(struct capi_ctr *ctrl, struct sk_buff *skb);
  468. void b1_parse_version(avmctrl_info *card);
  469. void b1_handle_interrupt(avmcard * card);
  470. int b1ctl_read_proc(char *page, char **start, off_t off,
  471.          int count, int *eof, struct capi_ctr *ctrl);
  472. /* b1dma.c */
  473. int b1pciv4_detect(avmcard *card);
  474. int t1pci_detect(avmcard *card);
  475. void b1dma_reset(avmcard *card);
  476. void b1dma_interrupt(int interrupt, void *devptr, struct pt_regs *regs);
  477. int b1dma_load_firmware(struct capi_ctr *ctrl, capiloaddata *data);
  478. void b1dma_reset_ctr(struct capi_ctr *ctrl);
  479. void b1dma_remove_ctr(struct capi_ctr *ctrl);
  480. void b1dma_register_appl(struct capi_ctr *ctrl,
  481. __u16 appl,
  482. capi_register_params *rp);
  483. void b1dma_release_appl(struct capi_ctr *ctrl, __u16 appl);
  484. void b1dma_send_message(struct capi_ctr *ctrl, struct sk_buff *skb);
  485. int b1dmactl_read_proc(char *page, char **start, off_t off,
  486.          int count, int *eof, struct capi_ctr *ctrl);
  487. #endif /* _AVMCARD_H_ */