elsa.c
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:32k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. /* $Id: elsa.c,v 1.1.4.1 2001/11/20 14:19:35 kai Exp $
  2.  *
  3.  * low level stuff for Elsa isdn cards
  4.  *
  5.  * Author       Karsten Keil
  6.  * Copyright    by Karsten Keil      <keil@isdn4linux.de>
  7.  * 
  8.  * This software may be used and distributed according to the terms
  9.  * of the GNU General Public License, incorporated herein by reference.
  10.  *
  11.  * For changes and modifications please read
  12.  * ../../../Documentation/isdn/HiSax.cert
  13.  *
  14.  * Thanks to    Elsa GmbH for documents and information
  15.  *
  16.  *              Klaus Lichtenwalder (Klaus.Lichtenwalder@WebForum.DE)
  17.  *              for ELSA PCMCIA support
  18.  *
  19.  */
  20. #define __NO_VERSION__
  21. #include <linux/init.h>
  22. #include <linux/config.h>
  23. #include "hisax.h"
  24. #include "arcofi.h"
  25. #include "isac.h"
  26. #include "ipac.h"
  27. #include "hscx.h"
  28. #include "isdnl1.h"
  29. #include <linux/pci.h>
  30. #include <linux/serial.h>
  31. #include <linux/serial_reg.h>
  32. extern const char *CardType[];
  33. const char *Elsa_revision = "$Revision: 1.1.4.1 $";
  34. const char *Elsa_Types[] =
  35. {"None", "PC", "PCC-8", "PCC-16", "PCF", "PCF-Pro",
  36.  "PCMCIA", "QS 1000", "QS 3000", "Microlink PCI", "QS 3000 PCI", 
  37.  "PCMCIA-IPAC" };
  38. const char *ITACVer[] =
  39. {"?0?", "?1?", "?2?", "?3?", "?4?", "V2.2",
  40.  "B1", "A1"};
  41. #define byteout(addr,val) outb(val,addr)
  42. #define bytein(addr) inb(addr)
  43. #define ELSA_ISAC 0
  44. #define ELSA_ISAC_PCM 1
  45. #define ELSA_ITAC 1
  46. #define ELSA_HSCX 2
  47. #define ELSA_ALE 3
  48. #define ELSA_ALE_PCM 4
  49. #define ELSA_CONTROL 4
  50. #define ELSA_CONFIG 5
  51. #define ELSA_START_TIMER 6
  52. #define ELSA_TRIG_IRQ 7
  53. #define ELSA_PC      1
  54. #define ELSA_PCC8    2
  55. #define ELSA_PCC16   3
  56. #define ELSA_PCF     4
  57. #define ELSA_PCFPRO  5
  58. #define ELSA_PCMCIA  6
  59. #define ELSA_QS1000  7
  60. #define ELSA_QS3000  8
  61. #define ELSA_QS1000PCI 9
  62. #define ELSA_QS3000PCI 10
  63. #define ELSA_PCMCIA_IPAC 11
  64. /* PCI stuff */
  65. #define ELSA_PCI_IRQ_MASK 0x04
  66. /* ITAC Registeradressen (only Microlink PC) */
  67. #define ITAC_SYS 0x34
  68. #define ITAC_ISEN 0x48
  69. #define ITAC_RFIE 0x4A
  70. #define ITAC_XFIE 0x4C
  71. #define ITAC_SCIE 0x4E
  72. #define ITAC_STIE 0x46
  73. /***                                                                    ***
  74.  ***   Makros als Befehle fuer die Kartenregister                       ***
  75.  ***   (mehrere Befehle werden durch Bit-Oderung kombiniert)            ***
  76.  ***                                                                    ***/
  77. /* Config-Register (Read) */
  78. #define ELSA_TIMER_RUN       0x02 /* Bit 1 des Config-Reg     */
  79. #define ELSA_TIMER_RUN_PCC8  0x01 /* Bit 0 des Config-Reg  bei PCC */
  80. #define ELSA_IRQ_IDX       0x38 /* Bit 3,4,5 des Config-Reg */
  81. #define ELSA_IRQ_IDX_PCC8  0x30 /* Bit 4,5 des Config-Reg */
  82. #define ELSA_IRQ_IDX_PC    0x0c /* Bit 2,3 des Config-Reg */
  83. /* Control-Register (Write) */
  84. #define ELSA_LINE_LED        0x02 /* Bit 1 Gelbe LED */
  85. #define ELSA_STAT_LED        0x08 /* Bit 3 Gruene LED */
  86. #define ELSA_ISDN_RESET      0x20 /* Bit 5 Reset-Leitung */
  87. #define ELSA_ENA_TIMER_INT   0x80 /* Bit 7 Freigabe Timer Interrupt */
  88. /* ALE-Register (Read) */
  89. #define ELSA_HW_RELEASE      0x07 /* Bit 0-2 Hardwarerkennung */
  90. #define ELSA_S0_POWER_BAD    0x08 /* Bit 3 S0-Bus Spannung fehlt */
  91. /* Status Flags */
  92. #define ELSA_TIMER_AKTIV 1
  93. #define ELSA_BAD_PWR     2
  94. #define ELSA_ASSIGN      4
  95. #define RS_ISR_PASS_LIMIT 256
  96. #define _INLINE_ inline
  97. #define FLG_MODEM_ACTIVE 1
  98. /* IPAC AUX */
  99. #define ELSA_IPAC_LINE_LED 0x40 /* Bit 6 Gelbe LED */
  100. #define ELSA_IPAC_STAT_LED 0x80 /* Bit 7 Gruene LED */
  101. #if ARCOFI_USE
  102. static struct arcofi_msg ARCOFI_XOP_F =
  103. {NULL,0,2,{0xa1,0x3f,0,0,0,0,0,0,0,0}}; /* Normal OP */
  104. static struct arcofi_msg ARCOFI_XOP_1 =
  105. {&ARCOFI_XOP_F,0,2,{0xa1,0x31,0,0,0,0,0,0,0,0}}; /* PWR UP */
  106. static struct arcofi_msg ARCOFI_SOP_F = 
  107. {&ARCOFI_XOP_1,0,10,{0xa1,0x1f,0x00,0x50,0x10,0x00,0x00,0x80,0x02,0x12}};
  108. static struct arcofi_msg ARCOFI_COP_9 =
  109. {&ARCOFI_SOP_F,0,10,{0xa1,0x29,0x80,0xcb,0xe9,0x88,0x00,0xc8,0xd8,0x80}}; /* RX */
  110. static struct arcofi_msg ARCOFI_COP_8 =
  111. {&ARCOFI_COP_9,0,10,{0xa1,0x28,0x49,0x31,0x8,0x13,0x6e,0x88,0x2a,0x61}}; /* TX */
  112. static struct arcofi_msg ARCOFI_COP_7 =
  113. {&ARCOFI_COP_8,0,4,{0xa1,0x27,0x80,0x80,0,0,0,0,0,0}}; /* GZ */
  114. static struct arcofi_msg ARCOFI_COP_6 =
  115. {&ARCOFI_COP_7,0,6,{0xa1,0x26,0,0,0x82,0x7c,0,0,0,0}}; /* GRL GRH */
  116. static struct arcofi_msg ARCOFI_COP_5 =
  117. {&ARCOFI_COP_6,0,4,{0xa1,0x25,0xbb,0x4a,0,0,0,0,0,0}}; /* GTX */
  118. static struct arcofi_msg ARCOFI_VERSION =
  119. {NULL,1,2,{0xa0,0,0,0,0,0,0,0,0,0}};
  120. static struct arcofi_msg ARCOFI_XOP_0 =
  121. {NULL,0,2,{0xa1,0x30,0,0,0,0,0,0,0,0}}; /* PWR Down */
  122. static void set_arcofi(struct IsdnCardState *cs, int bc);
  123. #include "elsa_ser.c"
  124. #endif /* ARCOFI_USE */
  125. static inline u_char
  126. readreg(unsigned int ale, unsigned int adr, u_char off)
  127. {
  128. register u_char ret;
  129. long flags;
  130. save_flags(flags);
  131. cli();
  132. byteout(ale, off);
  133. ret = bytein(adr);
  134. restore_flags(flags);
  135. return (ret);
  136. }
  137. static inline void
  138. readfifo(unsigned int ale, unsigned int adr, u_char off, u_char * data, int size)
  139. {
  140. /* fifo read without cli because it's allready done  */
  141. byteout(ale, off);
  142. insb(adr, data, size);
  143. }
  144. static inline void
  145. writereg(unsigned int ale, unsigned int adr, u_char off, u_char data)
  146. {
  147. long flags;
  148. save_flags(flags);
  149. cli();
  150. byteout(ale, off);
  151. byteout(adr, data);
  152. restore_flags(flags);
  153. }
  154. static inline void
  155. writefifo(unsigned int ale, unsigned int adr, u_char off, u_char * data, int size)
  156. {
  157. /* fifo write without cli because it's allready done  */
  158. byteout(ale, off);
  159. outsb(adr, data, size);
  160. }
  161. /* Interface functions */
  162. static u_char
  163. ReadISAC(struct IsdnCardState *cs, u_char offset)
  164. {
  165. return (readreg(cs->hw.elsa.ale, cs->hw.elsa.isac, offset));
  166. }
  167. static void
  168. WriteISAC(struct IsdnCardState *cs, u_char offset, u_char value)
  169. {
  170. writereg(cs->hw.elsa.ale, cs->hw.elsa.isac, offset, value);
  171. }
  172. static void
  173. ReadISACfifo(struct IsdnCardState *cs, u_char * data, int size)
  174. {
  175. readfifo(cs->hw.elsa.ale, cs->hw.elsa.isac, 0, data, size);
  176. }
  177. static void
  178. WriteISACfifo(struct IsdnCardState *cs, u_char * data, int size)
  179. {
  180. writefifo(cs->hw.elsa.ale, cs->hw.elsa.isac, 0, data, size);
  181. }
  182. static u_char
  183. ReadISAC_IPAC(struct IsdnCardState *cs, u_char offset)
  184. {
  185. return (readreg(cs->hw.elsa.ale, cs->hw.elsa.isac, offset+0x80));
  186. }
  187. static void
  188. WriteISAC_IPAC(struct IsdnCardState *cs, u_char offset, u_char value)
  189. {
  190. writereg(cs->hw.elsa.ale, cs->hw.elsa.isac, offset|0x80, value);
  191. }
  192. static void
  193. ReadISACfifo_IPAC(struct IsdnCardState *cs, u_char * data, int size)
  194. {
  195. readfifo(cs->hw.elsa.ale, cs->hw.elsa.isac, 0x80, data, size);
  196. }
  197. static void
  198. WriteISACfifo_IPAC(struct IsdnCardState *cs, u_char * data, int size)
  199. {
  200. writefifo(cs->hw.elsa.ale, cs->hw.elsa.isac, 0x80, data, size);
  201. }
  202. static u_char
  203. ReadHSCX(struct IsdnCardState *cs, int hscx, u_char offset)
  204. {
  205. return (readreg(cs->hw.elsa.ale,
  206. cs->hw.elsa.hscx, offset + (hscx ? 0x40 : 0)));
  207. }
  208. static void
  209. WriteHSCX(struct IsdnCardState *cs, int hscx, u_char offset, u_char value)
  210. {
  211. writereg(cs->hw.elsa.ale,
  212.  cs->hw.elsa.hscx, offset + (hscx ? 0x40 : 0), value);
  213. }
  214. static inline u_char
  215. readitac(struct IsdnCardState *cs, u_char off)
  216. {
  217. register u_char ret;
  218. long flags;
  219. save_flags(flags);
  220. cli();
  221. byteout(cs->hw.elsa.ale, off);
  222. ret = bytein(cs->hw.elsa.itac);
  223. restore_flags(flags);
  224. return (ret);
  225. }
  226. static inline void
  227. writeitac(struct IsdnCardState *cs, u_char off, u_char data)
  228. {
  229. long flags;
  230. save_flags(flags);
  231. cli();
  232. byteout(cs->hw.elsa.ale, off);
  233. byteout(cs->hw.elsa.itac, data);
  234. restore_flags(flags);
  235. }
  236. static inline int
  237. TimerRun(struct IsdnCardState *cs)
  238. {
  239. register u_char v;
  240. v = bytein(cs->hw.elsa.cfg);
  241. if ((cs->subtyp == ELSA_QS1000) || (cs->subtyp == ELSA_QS3000))
  242. return (0 == (v & ELSA_TIMER_RUN));
  243. else if (cs->subtyp == ELSA_PCC8)
  244. return (v & ELSA_TIMER_RUN_PCC8);
  245. return (v & ELSA_TIMER_RUN);
  246. }
  247. /*
  248.  * fast interrupt HSCX stuff goes here
  249.  */
  250. #define READHSCX(cs, nr, reg) readreg(cs->hw.elsa.ale, 
  251. cs->hw.elsa.hscx, reg + (nr ? 0x40 : 0))
  252. #define WRITEHSCX(cs, nr, reg, data) writereg(cs->hw.elsa.ale, 
  253. cs->hw.elsa.hscx, reg + (nr ? 0x40 : 0), data)
  254. #define READHSCXFIFO(cs, nr, ptr, cnt) readfifo(cs->hw.elsa.ale, 
  255. cs->hw.elsa.hscx, (nr ? 0x40 : 0), ptr, cnt)
  256. #define WRITEHSCXFIFO(cs, nr, ptr, cnt) writefifo(cs->hw.elsa.ale, 
  257. cs->hw.elsa.hscx, (nr ? 0x40 : 0), ptr, cnt)
  258. #include "hscx_irq.c"
  259. static void
  260. elsa_interrupt(int intno, void *dev_id, struct pt_regs *regs)
  261. {
  262. struct IsdnCardState *cs = dev_id;
  263. u_char val;
  264. int icnt=5;
  265. if (!cs) {
  266. printk(KERN_WARNING "Elsa: Spurious interrupt!n");
  267. return;
  268. }
  269. if ((cs->typ == ISDN_CTYPE_ELSA_PCMCIA) && (*cs->busy_flag == 1)) {
  270. /* The card tends to generate interrupts while being removed
  271.    causing us to just crash the kernel. bad. */
  272. printk(KERN_WARNING "Elsa: card not available!n");
  273. return;
  274. }
  275. #if ARCOFI_USE
  276. if (cs->hw.elsa.MFlag) {
  277. val = serial_inp(cs, UART_IIR);
  278. if (!(val & UART_IIR_NO_INT)) {
  279. debugl1(cs,"IIR %02x", val);
  280. rs_interrupt_elsa(intno, cs);
  281. }
  282. }
  283. #endif
  284. val = readreg(cs->hw.elsa.ale, cs->hw.elsa.hscx, HSCX_ISTA + 0x40);
  285.       Start_HSCX:
  286. if (val) {
  287. hscx_int_main(cs, val);
  288. }
  289. val = readreg(cs->hw.elsa.ale, cs->hw.elsa.isac, ISAC_ISTA);
  290.       Start_ISAC:
  291. if (val) {
  292. isac_interrupt(cs, val);
  293. }
  294. val = readreg(cs->hw.elsa.ale, cs->hw.elsa.hscx, HSCX_ISTA + 0x40);
  295. if (val && icnt) {
  296. if (cs->debug & L1_DEB_HSCX)
  297. debugl1(cs, "HSCX IntStat after IntRoutine");
  298. icnt--;
  299. goto Start_HSCX;
  300. }
  301. val = readreg(cs->hw.elsa.ale, cs->hw.elsa.isac, ISAC_ISTA);
  302. if (val && icnt) {
  303. if (cs->debug & L1_DEB_ISAC)
  304. debugl1(cs, "ISAC IntStat after IntRoutine");
  305. icnt--;
  306. goto Start_ISAC;
  307. }
  308. if (!icnt)
  309. printk(KERN_WARNING"ELSA IRQ LOOPn");
  310. writereg(cs->hw.elsa.ale, cs->hw.elsa.hscx, HSCX_MASK, 0xFF);
  311. writereg(cs->hw.elsa.ale, cs->hw.elsa.hscx, HSCX_MASK + 0x40, 0xFF);
  312. writereg(cs->hw.elsa.ale, cs->hw.elsa.isac, ISAC_MASK, 0xFF);
  313. if (cs->hw.elsa.status & ELSA_TIMER_AKTIV) {
  314. if (!TimerRun(cs)) {
  315. /* Timer Restart */
  316. byteout(cs->hw.elsa.timer, 0);
  317. cs->hw.elsa.counter++;
  318. }
  319. }
  320. #if ARCOFI_USE
  321. if (cs->hw.elsa.MFlag) {
  322. val = serial_inp(cs, UART_MCR);
  323. val ^= 0x8;
  324. serial_outp(cs, UART_MCR, val);
  325. val = serial_inp(cs, UART_MCR);
  326. val ^= 0x8;
  327. serial_outp(cs, UART_MCR, val);
  328. }
  329. #endif
  330. if (cs->hw.elsa.trig)
  331. byteout(cs->hw.elsa.trig, 0x00);
  332. writereg(cs->hw.elsa.ale, cs->hw.elsa.hscx, HSCX_MASK, 0x0);
  333. writereg(cs->hw.elsa.ale, cs->hw.elsa.hscx, HSCX_MASK + 0x40, 0x0);
  334. writereg(cs->hw.elsa.ale, cs->hw.elsa.isac, ISAC_MASK, 0x0);
  335. }
  336. static void
  337. elsa_interrupt_ipac(int intno, void *dev_id, struct pt_regs *regs)
  338. {
  339. struct IsdnCardState *cs = dev_id;
  340. u_char ista,val;
  341. int icnt=5;
  342. if (!cs) {
  343. printk(KERN_WARNING "Elsa: Spurious interrupt!n");
  344. return;
  345. }
  346. if (cs->subtyp == ELSA_QS1000PCI || cs->subtyp == ELSA_QS3000PCI) {
  347. val = bytein(cs->hw.elsa.cfg + 0x4c); /* PCI IRQ */
  348. if (!(val & ELSA_PCI_IRQ_MASK))
  349. return;
  350. }
  351. #if ARCOFI_USE
  352. if (cs->hw.elsa.MFlag) {
  353. val = serial_inp(cs, UART_IIR);
  354. if (!(val & UART_IIR_NO_INT)) {
  355. debugl1(cs,"IIR %02x", val);
  356. rs_interrupt_elsa(intno, cs);
  357. }
  358. }
  359. #endif
  360. ista = readreg(cs->hw.elsa.ale, cs->hw.elsa.isac, IPAC_ISTA);
  361. Start_IPAC:
  362. if (cs->debug & L1_DEB_IPAC)
  363. debugl1(cs, "IPAC ISTA %02X", ista);
  364. if (ista & 0x0f) {
  365. val = readreg(cs->hw.elsa.ale, cs->hw.elsa.hscx, HSCX_ISTA + 0x40);
  366. if (ista & 0x01)
  367. val |= 0x01;
  368. if (ista & 0x04)
  369. val |= 0x02;
  370. if (ista & 0x08)
  371. val |= 0x04;
  372. if (val)
  373. hscx_int_main(cs, val);
  374. }
  375. if (ista & 0x20) {
  376. val = 0xfe & readreg(cs->hw.elsa.ale, cs->hw.elsa.isac, ISAC_ISTA + 0x80);
  377. if (val) {
  378. isac_interrupt(cs, val);
  379. }
  380. }
  381. if (ista & 0x10) {
  382. val = 0x01;
  383. isac_interrupt(cs, val);
  384. }
  385. ista  = readreg(cs->hw.elsa.ale, cs->hw.elsa.isac, IPAC_ISTA);
  386. if ((ista & 0x3f) && icnt) {
  387. icnt--;
  388. goto Start_IPAC;
  389. }
  390. if (!icnt)
  391. printk(KERN_WARNING "ELSA IRQ LOOPn");
  392. writereg(cs->hw.elsa.ale, cs->hw.elsa.isac, IPAC_MASK, 0xFF);
  393. writereg(cs->hw.elsa.ale, cs->hw.elsa.isac, IPAC_MASK, 0xC0);
  394. }
  395. void
  396. release_io_elsa(struct IsdnCardState *cs)
  397. {
  398. int bytecnt = 8;
  399. del_timer(&cs->hw.elsa.tl);
  400. #if ARCOFI_USE
  401. clear_arcofi(cs);
  402. #endif
  403. if (cs->hw.elsa.ctrl)
  404. byteout(cs->hw.elsa.ctrl, 0); /* LEDs Out */
  405. if (cs->subtyp == ELSA_QS1000PCI) {
  406. byteout(cs->hw.elsa.cfg + 0x4c, 0x01);  /* disable IRQ */
  407. writereg(cs->hw.elsa.ale, cs->hw.elsa.isac, IPAC_ATX, 0xff);
  408. bytecnt = 2;
  409. release_region(cs->hw.elsa.cfg, 0x80);
  410. }
  411. if (cs->subtyp == ELSA_QS3000PCI) {
  412. byteout(cs->hw.elsa.cfg + 0x4c, 0x03); /* disable ELSA PCI IRQ */
  413. writereg(cs->hw.elsa.ale, cs->hw.elsa.isac, IPAC_ATX, 0xff);
  414. release_region(cs->hw.elsa.cfg, 0x80);
  415. }
  416.   if (cs->subtyp == ELSA_PCMCIA_IPAC) {
  417. writereg(cs->hw.elsa.ale, cs->hw.elsa.isac, IPAC_ATX, 0xff);
  418.   }
  419. if ((cs->subtyp == ELSA_PCFPRO) ||
  420. (cs->subtyp == ELSA_QS3000) ||
  421. (cs->subtyp == ELSA_PCF) ||
  422. (cs->subtyp == ELSA_QS3000PCI)) {
  423. bytecnt = 16;
  424. #if ARCOFI_USE
  425. release_modem(cs);
  426. #endif
  427. }
  428. if (cs->hw.elsa.base)
  429. release_region(cs->hw.elsa.base, bytecnt);
  430. }
  431. static void
  432. reset_elsa(struct IsdnCardState *cs)
  433. {
  434. long flags;
  435. if (cs->hw.elsa.timer) {
  436. /* Wait 1 Timer */
  437. byteout(cs->hw.elsa.timer, 0);
  438. while (TimerRun(cs));
  439. cs->hw.elsa.ctrl_reg |= 0x50;
  440. cs->hw.elsa.ctrl_reg &= ~ELSA_ISDN_RESET; /* Reset On */
  441. byteout(cs->hw.elsa.ctrl, cs->hw.elsa.ctrl_reg);
  442. /* Wait 1 Timer */
  443. byteout(cs->hw.elsa.timer, 0);
  444. while (TimerRun(cs));
  445. cs->hw.elsa.ctrl_reg |= ELSA_ISDN_RESET; /* Reset Off */
  446. byteout(cs->hw.elsa.ctrl, cs->hw.elsa.ctrl_reg);
  447. /* Wait 1 Timer */
  448. byteout(cs->hw.elsa.timer, 0);
  449. while (TimerRun(cs));
  450. if (cs->hw.elsa.trig)
  451. byteout(cs->hw.elsa.trig, 0xff);
  452. }
  453. if ((cs->subtyp == ELSA_QS1000PCI) || (cs->subtyp == ELSA_QS3000PCI) || (cs->subtyp == ELSA_PCMCIA_IPAC)) {
  454. save_flags(flags);
  455. sti();
  456. writereg(cs->hw.elsa.ale, cs->hw.elsa.isac, IPAC_POTA2, 0x20);
  457. set_current_state(TASK_UNINTERRUPTIBLE);
  458. schedule_timeout((10*HZ)/1000); /* Timeout 10ms */
  459. writereg(cs->hw.elsa.ale, cs->hw.elsa.isac, IPAC_POTA2, 0x00);
  460. set_current_state(TASK_UNINTERRUPTIBLE);
  461. writereg(cs->hw.elsa.ale, cs->hw.elsa.isac, IPAC_MASK, 0xc0);
  462. schedule_timeout((10*HZ)/1000); /* Timeout 10ms */
  463. restore_flags(flags);
  464. if (cs->subtyp != ELSA_PCMCIA_IPAC) {
  465. writereg(cs->hw.elsa.ale, cs->hw.elsa.isac, IPAC_ACFG, 0x0);
  466. writereg(cs->hw.elsa.ale, cs->hw.elsa.isac, IPAC_AOE, 0x3c);
  467. } else {
  468. writereg(cs->hw.elsa.ale, cs->hw.elsa.isac, IPAC_PCFG, 0x10);
  469. writereg(cs->hw.elsa.ale, cs->hw.elsa.isac, IPAC_ACFG, 0x4);
  470. writereg(cs->hw.elsa.ale, cs->hw.elsa.isac, IPAC_AOE, 0xf8);
  471. }
  472. writereg(cs->hw.elsa.ale, cs->hw.elsa.isac, IPAC_ATX, 0xff);
  473. if (cs->subtyp == ELSA_QS1000PCI)
  474. byteout(cs->hw.elsa.cfg + 0x4c, 0x41); /* enable ELSA PCI IRQ */
  475. else if (cs->subtyp == ELSA_QS3000PCI)
  476. byteout(cs->hw.elsa.cfg + 0x4c, 0x43); /* enable ELSA PCI IRQ */
  477. }
  478. }
  479. #if ARCOFI_USE
  480. static void
  481. set_arcofi(struct IsdnCardState *cs, int bc) {
  482. cs->dc.isac.arcofi_bc = bc;
  483. arcofi_fsm(cs, ARCOFI_START, &ARCOFI_COP_5);
  484. interruptible_sleep_on(&cs->dc.isac.arcofi_wait);
  485. }
  486. static int
  487. check_arcofi(struct IsdnCardState *cs)
  488. {
  489. int arcofi_present = 0;
  490. char tmp[40];
  491. char *t;
  492. u_char *p;
  493. if (!cs->dc.isac.mon_tx)
  494. if (!(cs->dc.isac.mon_tx=kmalloc(MAX_MON_FRAME, GFP_ATOMIC))) {
  495. if (cs->debug & L1_DEB_WARN)
  496. debugl1(cs, "ISAC MON TX out of buffers!");
  497. return(0);
  498. }
  499. cs->dc.isac.arcofi_bc = 0;
  500. arcofi_fsm(cs, ARCOFI_START, &ARCOFI_VERSION);
  501. interruptible_sleep_on(&cs->dc.isac.arcofi_wait);
  502. if (!test_and_clear_bit(FLG_ARCOFI_ERROR, &cs->HW_Flags)) {
  503. debugl1(cs, "Arcofi response received %d bytes", cs->dc.isac.mon_rxp);
  504. p = cs->dc.isac.mon_rx;
  505. t = tmp;
  506. t += sprintf(tmp, "Arcofi data");
  507. QuickHex(t, p, cs->dc.isac.mon_rxp);
  508. debugl1(cs, tmp);
  509. if ((cs->dc.isac.mon_rxp == 2) && (cs->dc.isac.mon_rx[0] == 0xa0)) {
  510. switch(cs->dc.isac.mon_rx[1]) {
  511. case 0x80:
  512. debugl1(cs, "Arcofi 2160 detected");
  513. arcofi_present = 1;
  514. break;
  515. case 0x82:
  516. debugl1(cs, "Arcofi 2165 detected");
  517. arcofi_present = 2;
  518. break;
  519. case 0x84:
  520. debugl1(cs, "Arcofi 2163 detected");
  521. arcofi_present = 3;
  522. break;
  523. default:
  524. debugl1(cs, "unknown Arcofi response");
  525. break;
  526. }
  527. } else
  528. debugl1(cs, "undefined Monitor response");
  529. cs->dc.isac.mon_rxp = 0;
  530. } else if (cs->dc.isac.mon_tx) {
  531. debugl1(cs, "Arcofi not detected");
  532. }
  533. if (arcofi_present) {
  534. if (cs->subtyp==ELSA_QS1000) {
  535. cs->subtyp = ELSA_QS3000;
  536. printk(KERN_INFO
  537. "Elsa: %s detected modem at 0x%lxn",
  538. Elsa_Types[cs->subtyp],
  539. cs->hw.elsa.base+8);
  540. release_region(cs->hw.elsa.base, 8);
  541. if (check_region(cs->hw.elsa.base, 16)) {
  542. printk(KERN_WARNING
  543. "HiSax: %s config port %lx-%lx already in usen",
  544. Elsa_Types[cs->subtyp],
  545. cs->hw.elsa.base + 8,
  546. cs->hw.elsa.base + 16);
  547. } else
  548. request_region(cs->hw.elsa.base, 16,
  549. "elsa isdn modem");
  550. } else if (cs->subtyp==ELSA_PCC16) {
  551. cs->subtyp = ELSA_PCF;
  552. printk(KERN_INFO
  553. "Elsa: %s detected modem at 0x%lxn",
  554. Elsa_Types[cs->subtyp],
  555. cs->hw.elsa.base+8);
  556. release_region(cs->hw.elsa.base, 8);
  557. if (check_region(cs->hw.elsa.base, 16)) {
  558. printk(KERN_WARNING
  559. "HiSax: %s config port %lx-%lx already in usen",
  560. Elsa_Types[cs->subtyp],
  561. cs->hw.elsa.base + 8,
  562. cs->hw.elsa.base + 16);
  563. } else
  564. request_region(cs->hw.elsa.base, 16,
  565. "elsa isdn modem");
  566. } else
  567. printk(KERN_INFO
  568. "Elsa: %s detected modem at 0x%lxn",
  569. Elsa_Types[cs->subtyp],
  570. cs->hw.elsa.base+8);
  571. arcofi_fsm(cs, ARCOFI_START, &ARCOFI_XOP_0);
  572. interruptible_sleep_on(&cs->dc.isac.arcofi_wait);
  573. return(1);
  574. }
  575. return(0);
  576. }
  577. #endif /* ARCOFI_USE */
  578. static void
  579. elsa_led_handler(struct IsdnCardState *cs)
  580. {
  581. int blink = 0;
  582. if (cs->subtyp == ELSA_PCMCIA || cs->subtyp == ELSA_PCMCIA_IPAC)
  583. return;
  584. del_timer(&cs->hw.elsa.tl);
  585. if (cs->hw.elsa.status & ELSA_ASSIGN)
  586. cs->hw.elsa.ctrl_reg |= ELSA_STAT_LED;
  587. else if (cs->hw.elsa.status & ELSA_BAD_PWR)
  588. cs->hw.elsa.ctrl_reg &= ~ELSA_STAT_LED;
  589. else {
  590. cs->hw.elsa.ctrl_reg ^= ELSA_STAT_LED;
  591. blink = 250;
  592. }
  593. if (cs->hw.elsa.status & 0xf000)
  594. cs->hw.elsa.ctrl_reg |= ELSA_LINE_LED;
  595. else if (cs->hw.elsa.status & 0x0f00) {
  596. cs->hw.elsa.ctrl_reg ^= ELSA_LINE_LED;
  597. blink = 500;
  598. } else
  599. cs->hw.elsa.ctrl_reg &= ~ELSA_LINE_LED;
  600. if ((cs->subtyp == ELSA_QS1000PCI) ||
  601. (cs->subtyp == ELSA_QS3000PCI)) {
  602. u_char led = 0xff;
  603. if (cs->hw.elsa.ctrl_reg & ELSA_LINE_LED)
  604. led ^= ELSA_IPAC_LINE_LED;
  605. if (cs->hw.elsa.ctrl_reg & ELSA_STAT_LED)
  606. led ^= ELSA_IPAC_STAT_LED;
  607. writereg(cs->hw.elsa.ale, cs->hw.elsa.isac, IPAC_ATX, led);
  608. } else
  609. byteout(cs->hw.elsa.ctrl, cs->hw.elsa.ctrl_reg);
  610. if (blink) {
  611. init_timer(&cs->hw.elsa.tl);
  612. cs->hw.elsa.tl.expires = jiffies + ((blink * HZ) / 1000);
  613. add_timer(&cs->hw.elsa.tl);
  614. }
  615. }
  616. static int
  617. Elsa_card_msg(struct IsdnCardState *cs, int mt, void *arg)
  618. {
  619. int ret = 0;
  620. long flags;
  621. switch (mt) {
  622. case CARD_RESET:
  623. reset_elsa(cs);
  624. return(0);
  625. case CARD_RELEASE:
  626. release_io_elsa(cs);
  627. return(0);
  628. case CARD_INIT:
  629. cs->debug |= L1_DEB_IPAC;
  630. inithscxisac(cs, 1);
  631. if ((cs->subtyp == ELSA_QS1000) ||
  632.     (cs->subtyp == ELSA_QS3000))
  633. {
  634. byteout(cs->hw.elsa.timer, 0);
  635. }
  636. if (cs->hw.elsa.trig)
  637. byteout(cs->hw.elsa.trig, 0xff);
  638. inithscxisac(cs, 2);
  639. return(0);
  640. case CARD_TEST:
  641. if ((cs->subtyp == ELSA_PCMCIA) ||
  642. (cs->subtyp == ELSA_PCMCIA_IPAC) ||
  643. (cs->subtyp == ELSA_QS1000PCI)) {
  644. return(0);
  645. } else if (cs->subtyp == ELSA_QS3000PCI) {
  646. ret = 0;
  647. } else {
  648. save_flags(flags);
  649. cs->hw.elsa.counter = 0;
  650. sti();
  651. cs->hw.elsa.ctrl_reg |= ELSA_ENA_TIMER_INT;
  652. cs->hw.elsa.status |= ELSA_TIMER_AKTIV;
  653. byteout(cs->hw.elsa.ctrl, cs->hw.elsa.ctrl_reg);
  654. byteout(cs->hw.elsa.timer, 0);
  655. set_current_state(TASK_UNINTERRUPTIBLE);
  656. schedule_timeout((110*HZ)/1000);
  657. restore_flags(flags);
  658. cs->hw.elsa.ctrl_reg &= ~ELSA_ENA_TIMER_INT;
  659. byteout(cs->hw.elsa.ctrl, cs->hw.elsa.ctrl_reg);
  660. cs->hw.elsa.status &= ~ELSA_TIMER_AKTIV;
  661. printk(KERN_INFO "Elsa: %d timer tics in 110 msekn",
  662.        cs->hw.elsa.counter);
  663. if ((cs->hw.elsa.counter > 10) &&
  664. (cs->hw.elsa.counter < 16)) {
  665. printk(KERN_INFO "Elsa: timer and irq OKn");
  666. ret = 0;
  667. } else {
  668. printk(KERN_WARNING
  669.        "Elsa: timer tic problem (%d/12) maybe an IRQ(%d) conflictn",
  670.        cs->hw.elsa.counter, cs->irq);
  671. ret = 1;
  672. }
  673. }
  674. #if ARCOFI_USE
  675. if (check_arcofi(cs)) {
  676. init_modem(cs);
  677. }
  678. #endif
  679. elsa_led_handler(cs);
  680. return(ret);
  681. case (MDL_REMOVE | REQUEST):
  682. cs->hw.elsa.status &= 0;
  683. break;
  684. case (MDL_ASSIGN | REQUEST):
  685. cs->hw.elsa.status |= ELSA_ASSIGN;
  686. break;
  687. case MDL_INFO_SETUP:
  688. if ((long) arg)
  689. cs->hw.elsa.status |= 0x0200;
  690. else
  691. cs->hw.elsa.status |= 0x0100;
  692. break;
  693. case MDL_INFO_CONN:
  694. if ((long) arg)
  695. cs->hw.elsa.status |= 0x2000;
  696. else
  697. cs->hw.elsa.status |= 0x1000;
  698. break;
  699. case MDL_INFO_REL:
  700. if ((long) arg) {
  701. cs->hw.elsa.status &= ~0x2000;
  702. cs->hw.elsa.status &= ~0x0200;
  703. } else {
  704. cs->hw.elsa.status &= ~0x1000;
  705. cs->hw.elsa.status &= ~0x0100;
  706. }
  707. break;
  708. #if ARCOFI_USE
  709. case CARD_AUX_IND:
  710. if (cs->hw.elsa.MFlag) {
  711. int len;
  712. u_char *msg;
  713. if (!arg)
  714. return(0);
  715. msg = arg;
  716. len = *msg;
  717. msg++;
  718. modem_write_cmd(cs, msg, len);
  719. }
  720. break;
  721. #endif
  722. }
  723. if (cs->typ == ISDN_CTYPE_ELSA) {
  724. int pwr = bytein(cs->hw.elsa.ale);
  725. if (pwr & 0x08)
  726. cs->hw.elsa.status |= ELSA_BAD_PWR;
  727. else
  728. cs->hw.elsa.status &= ~ELSA_BAD_PWR;
  729. }
  730. elsa_led_handler(cs);
  731. return(ret);
  732. }
  733. static unsigned char
  734. probe_elsa_adr(unsigned int adr, int typ)
  735. {
  736. int i, in1, in2, p16_1 = 0, p16_2 = 0, p8_1 = 0, p8_2 = 0, pc_1 = 0,
  737.  pc_2 = 0, pfp_1 = 0, pfp_2 = 0;
  738. long flags;
  739. /* In case of the elsa pcmcia card, this region is in use,
  740.    reserved for us by the card manager. So we do not check it
  741.    here, it would fail. */
  742. if (typ != ISDN_CTYPE_ELSA_PCMCIA && check_region(adr, 8)) {
  743. printk(KERN_WARNING
  744.        "Elsa: Probing Port 0x%x: already in usen",
  745.        adr);
  746. return (0);
  747. }
  748. save_flags(flags);
  749. cli();
  750. for (i = 0; i < 16; i++) {
  751. in1 = inb(adr + ELSA_CONFIG); /* 'toggelt' bei */
  752. in2 = inb(adr + ELSA_CONFIG); /* jedem Zugriff */
  753. p16_1 += 0x04 & in1;
  754. p16_2 += 0x04 & in2;
  755. p8_1 += 0x02 & in1;
  756. p8_2 += 0x02 & in2;
  757. pc_1 += 0x01 & in1;
  758. pc_2 += 0x01 & in2;
  759. pfp_1 += 0x40 & in1;
  760. pfp_2 += 0x40 & in2;
  761. }
  762. restore_flags(flags);
  763. printk(KERN_INFO "Elsa: Probing IO 0x%x", adr);
  764. if (65 == ++p16_1 * ++p16_2) {
  765. printk(" PCC-16/PCF foundn");
  766. return (ELSA_PCC16);
  767. } else if (1025 == ++pfp_1 * ++pfp_2) {
  768. printk(" PCF-Pro foundn");
  769. return (ELSA_PCFPRO);
  770. } else if (33 == ++p8_1 * ++p8_2) {
  771. printk(" PCC8 foundn");
  772. return (ELSA_PCC8);
  773. } else if (17 == ++pc_1 * ++pc_2) {
  774. printk(" PC foundn");
  775. return (ELSA_PC);
  776. } else {
  777. printk(" failedn");
  778. return (0);
  779. }
  780. }
  781. static unsigned int
  782. probe_elsa(struct IsdnCardState *cs)
  783. {
  784. int i;
  785. unsigned int CARD_portlist[] =
  786. {0x160, 0x170, 0x260, 0x360, 0};
  787. for (i = 0; CARD_portlist[i]; i++) {
  788. if ((cs->subtyp = probe_elsa_adr(CARD_portlist[i], cs->typ)))
  789. break;
  790. }
  791. return (CARD_portlist[i]);
  792. }
  793. static  struct pci_dev *dev_qs1000 __devinitdata = NULL;
  794. static  struct pci_dev *dev_qs3000 __devinitdata = NULL;
  795. int __devinit
  796. setup_elsa(struct IsdnCard *card)
  797. {
  798. long flags;
  799. int bytecnt;
  800. u_char val;
  801. struct IsdnCardState *cs = card->cs;
  802. char tmp[64];
  803. strcpy(tmp, Elsa_revision);
  804. printk(KERN_INFO "HiSax: Elsa driver Rev. %sn", HiSax_getrev(tmp));
  805. cs->hw.elsa.ctrl_reg = 0;
  806. cs->hw.elsa.status = 0;
  807. cs->hw.elsa.MFlag = 0;
  808. if (cs->typ == ISDN_CTYPE_ELSA) {
  809. cs->hw.elsa.base = card->para[0];
  810. printk(KERN_INFO "Elsa: Microlink IO probingn");
  811. if (cs->hw.elsa.base) {
  812. if (!(cs->subtyp = probe_elsa_adr(cs->hw.elsa.base,
  813.   cs->typ))) {
  814. printk(KERN_WARNING
  815.        "Elsa: no Elsa Microlink at %#lxn",
  816.        cs->hw.elsa.base);
  817. return (0);
  818. }
  819. } else
  820. cs->hw.elsa.base = probe_elsa(cs);
  821. if (cs->hw.elsa.base) {
  822. cs->hw.elsa.cfg = cs->hw.elsa.base + ELSA_CONFIG;
  823. cs->hw.elsa.ctrl = cs->hw.elsa.base + ELSA_CONTROL;
  824. cs->hw.elsa.ale = cs->hw.elsa.base + ELSA_ALE;
  825. cs->hw.elsa.isac = cs->hw.elsa.base + ELSA_ISAC;
  826. cs->hw.elsa.itac = cs->hw.elsa.base + ELSA_ITAC;
  827. cs->hw.elsa.hscx = cs->hw.elsa.base + ELSA_HSCX;
  828. cs->hw.elsa.trig = cs->hw.elsa.base + ELSA_TRIG_IRQ;
  829. cs->hw.elsa.timer = cs->hw.elsa.base + ELSA_START_TIMER;
  830. val = bytein(cs->hw.elsa.cfg);
  831. if (cs->subtyp == ELSA_PC) {
  832. const u_char CARD_IrqTab[8] =
  833. {7, 3, 5, 9, 0, 0, 0, 0};
  834. cs->irq = CARD_IrqTab[(val & ELSA_IRQ_IDX_PC) >> 2];
  835. } else if (cs->subtyp == ELSA_PCC8) {
  836. const u_char CARD_IrqTab[8] =
  837. {7, 3, 5, 9, 0, 0, 0, 0};
  838. cs->irq = CARD_IrqTab[(val & ELSA_IRQ_IDX_PCC8) >> 4];
  839. } else {
  840. const u_char CARD_IrqTab[8] =
  841. {15, 10, 15, 3, 11, 5, 11, 9};
  842. cs->irq = CARD_IrqTab[(val & ELSA_IRQ_IDX) >> 3];
  843. }
  844. val = bytein(cs->hw.elsa.ale) & ELSA_HW_RELEASE;
  845. if (val < 3)
  846. val |= 8;
  847. val += 'A' - 3;
  848. if (val == 'B' || val == 'C')
  849. val ^= 1;
  850. if ((cs->subtyp == ELSA_PCFPRO) && (val = 'G'))
  851. val = 'C';
  852. printk(KERN_INFO
  853.        "Elsa: %s found at %#lx Rev.:%c IRQ %dn",
  854.        Elsa_Types[cs->subtyp],
  855.        cs->hw.elsa.base,
  856.        val, cs->irq);
  857. val = bytein(cs->hw.elsa.ale) & ELSA_S0_POWER_BAD;
  858. if (val) {
  859. printk(KERN_WARNING
  860.    "Elsa: Microlink S0 bus power badn");
  861. cs->hw.elsa.status |= ELSA_BAD_PWR;
  862. }
  863. } else {
  864. printk(KERN_WARNING
  865.        "No Elsa Microlink foundn");
  866. return (0);
  867. }
  868. } else if (cs->typ == ISDN_CTYPE_ELSA_PNP) {
  869. cs->hw.elsa.base = card->para[1];
  870. cs->irq = card->para[0];
  871. cs->subtyp = ELSA_QS1000;
  872. cs->hw.elsa.cfg = cs->hw.elsa.base + ELSA_CONFIG;
  873. cs->hw.elsa.ale = cs->hw.elsa.base + ELSA_ALE;
  874. cs->hw.elsa.isac = cs->hw.elsa.base + ELSA_ISAC;
  875. cs->hw.elsa.hscx = cs->hw.elsa.base + ELSA_HSCX;
  876. cs->hw.elsa.trig = cs->hw.elsa.base + ELSA_TRIG_IRQ;
  877. cs->hw.elsa.timer = cs->hw.elsa.base + ELSA_START_TIMER;
  878. cs->hw.elsa.ctrl = cs->hw.elsa.base + ELSA_CONTROL;
  879. printk(KERN_INFO
  880.        "Elsa: %s defined at %#lx IRQ %dn",
  881.        Elsa_Types[cs->subtyp],
  882.        cs->hw.elsa.base,
  883.        cs->irq);
  884. } else if (cs->typ == ISDN_CTYPE_ELSA_PCMCIA) {
  885. cs->hw.elsa.base = card->para[1];
  886. cs->irq = card->para[0];
  887. val = readreg(cs->hw.elsa.base + 0, cs->hw.elsa.base + 2, IPAC_ID);
  888. if ((val == 1) || (val == 2)) { /* IPAC version 1.1/1.2 */
  889. cs->subtyp = ELSA_PCMCIA_IPAC;
  890. cs->hw.elsa.ale = cs->hw.elsa.base + 0;
  891. cs->hw.elsa.isac = cs->hw.elsa.base + 2;
  892. cs->hw.elsa.hscx = cs->hw.elsa.base + 2;
  893. test_and_set_bit(HW_IPAC, &cs->HW_Flags);
  894. } else {
  895. cs->subtyp = ELSA_PCMCIA;
  896. cs->hw.elsa.ale = cs->hw.elsa.base + ELSA_ALE_PCM;
  897. cs->hw.elsa.isac = cs->hw.elsa.base + ELSA_ISAC_PCM;
  898. cs->hw.elsa.hscx = cs->hw.elsa.base + ELSA_HSCX;
  899. }
  900. cs->hw.elsa.timer = 0;
  901. cs->hw.elsa.trig = 0;
  902. cs->hw.elsa.ctrl = 0;
  903. printk(KERN_INFO
  904.        "Elsa: %s defined at %#lx IRQ %dn",
  905.        Elsa_Types[cs->subtyp],
  906.        cs->hw.elsa.base,
  907.        cs->irq);
  908. } else if (cs->typ == ISDN_CTYPE_ELSA_PCI) {
  909. #if CONFIG_PCI
  910. if (!pci_present()) {
  911. printk(KERN_ERR "Elsa: no PCI bus presentn");
  912. return(0);
  913. }
  914. cs->subtyp = 0;
  915. if ((dev_qs1000 = pci_find_device(PCI_VENDOR_ID_ELSA,
  916. PCI_DEVICE_ID_ELSA_MICROLINK, dev_qs1000))) {
  917. if (pci_enable_device(dev_qs1000))
  918. return(0);
  919. cs->subtyp = ELSA_QS1000PCI;
  920. cs->irq = dev_qs1000->irq;
  921. cs->hw.elsa.cfg = pci_resource_start(dev_qs1000, 1);
  922. cs->hw.elsa.base = pci_resource_start(dev_qs1000, 3);
  923. } else if ((dev_qs3000 = pci_find_device(PCI_VENDOR_ID_ELSA,
  924. PCI_DEVICE_ID_ELSA_QS3000, dev_qs3000))) {
  925. if (pci_enable_device(dev_qs3000))
  926. return(0);
  927. cs->subtyp = ELSA_QS3000PCI;
  928. cs->irq = dev_qs3000->irq;
  929. cs->hw.elsa.cfg = pci_resource_start(dev_qs3000, 1);
  930. cs->hw.elsa.base = pci_resource_start(dev_qs3000, 3);
  931. } else {
  932. printk(KERN_WARNING "Elsa: No PCI card foundn");
  933. return(0);
  934. }
  935. if (!cs->irq) {
  936. printk(KERN_WARNING "Elsa: No IRQ for PCI card foundn");
  937. return(0);
  938. }
  939. if (!(cs->hw.elsa.base && cs->hw.elsa.cfg)) {
  940. printk(KERN_WARNING "Elsa: No IO-Adr for PCI card foundn");
  941. return(0);
  942. }
  943. if ((cs->hw.elsa.cfg & 0xff) || (cs->hw.elsa.base & 0xf)) {
  944. printk(KERN_WARNING "Elsa: You may have a wrong PCI biosn");
  945. printk(KERN_WARNING "Elsa: If your system hangs now, readn");
  946. printk(KERN_WARNING "Elsa: Documentation/isdn/README.HiSaxn");
  947. printk(KERN_WARNING "Elsa: Waiting 5 sec to sync discsn");
  948. save_flags(flags);
  949. sti();
  950. HZDELAY(500); /* wait 500*10 ms */
  951. restore_flags(flags);
  952. }
  953. cs->hw.elsa.ale  = cs->hw.elsa.base;
  954. cs->hw.elsa.isac = cs->hw.elsa.base +1;
  955. cs->hw.elsa.hscx = cs->hw.elsa.base +1; 
  956. test_and_set_bit(HW_IPAC, &cs->HW_Flags);
  957. cs->hw.elsa.timer = 0;
  958. cs->hw.elsa.trig  = 0;
  959. cs->irq_flags |= SA_SHIRQ;
  960. printk(KERN_INFO
  961.        "Elsa: %s defined at %#lx/0x%x IRQ %dn",
  962.        Elsa_Types[cs->subtyp],
  963.        cs->hw.elsa.base,
  964.        cs->hw.elsa.cfg,
  965.        cs->irq);
  966. #else
  967. printk(KERN_WARNING "Elsa: Elsa PCI and NO_PCI_BIOSn");
  968. printk(KERN_WARNING "Elsa: unable to config Elsa PCIn");
  969. return (0);
  970. #endif /* CONFIG_PCI */
  971. } else 
  972. return (0);
  973. switch (cs->subtyp) {
  974. case ELSA_PC:
  975. case ELSA_PCC8:
  976. case ELSA_PCC16:
  977. case ELSA_QS1000:
  978. case ELSA_PCMCIA:
  979. case ELSA_PCMCIA_IPAC:
  980. bytecnt = 8;
  981. break;
  982. case ELSA_PCFPRO:
  983. case ELSA_PCF:
  984. case ELSA_QS3000PCI:
  985. bytecnt = 16;
  986. break;
  987. case ELSA_QS1000PCI:
  988. bytecnt = 2;
  989. break;
  990. default:
  991. printk(KERN_WARNING
  992.        "Unknown ELSA subtype %dn", cs->subtyp);
  993. return (0);
  994. }
  995. /* In case of the elsa pcmcia card, this region is in use,
  996.    reserved for us by the card manager. So we do not check it
  997.    here, it would fail. */
  998. if (cs->typ != ISDN_CTYPE_ELSA_PCMCIA && check_region(cs->hw.elsa.base, bytecnt)) {
  999. printk(KERN_WARNING
  1000.        "HiSax: %s config port %#lx-%#lx already in usen",
  1001.        CardType[card->typ],
  1002.        cs->hw.elsa.base,
  1003.        cs->hw.elsa.base + bytecnt);
  1004. return (0);
  1005. } else {
  1006. request_region(cs->hw.elsa.base, bytecnt, "elsa isdn");
  1007. }
  1008. if ((cs->subtyp == ELSA_QS1000PCI) || (cs->subtyp == ELSA_QS3000PCI)) {
  1009. if (check_region(cs->hw.elsa.cfg, 0x80)) {
  1010. printk(KERN_WARNING
  1011.        "HiSax: %s pci port %x-%x already in usen",
  1012. CardType[card->typ],
  1013. cs->hw.elsa.cfg,
  1014. cs->hw.elsa.cfg + 0x80);
  1015. release_region(cs->hw.elsa.base, bytecnt);
  1016. return (0);
  1017. } else {
  1018. request_region(cs->hw.elsa.cfg, 0x80, "elsa isdn pci");
  1019. }
  1020. }
  1021. #if ARCOFI_USE
  1022. init_arcofi(cs);
  1023. #endif
  1024. cs->hw.elsa.tl.function = (void *) elsa_led_handler;
  1025. cs->hw.elsa.tl.data = (long) cs;
  1026. init_timer(&cs->hw.elsa.tl);
  1027. /* Teste Timer */
  1028. if (cs->hw.elsa.timer) {
  1029. byteout(cs->hw.elsa.trig, 0xff);
  1030. byteout(cs->hw.elsa.timer, 0);
  1031. if (!TimerRun(cs)) {
  1032. byteout(cs->hw.elsa.timer, 0); /* 2. Versuch */
  1033. if (!TimerRun(cs)) {
  1034. printk(KERN_WARNING
  1035.        "Elsa: timer do not startn");
  1036. release_io_elsa(cs);
  1037. return (0);
  1038. }
  1039. }
  1040. save_flags(flags);
  1041. sti();
  1042. HZDELAY(1); /* wait >=10 ms */
  1043. restore_flags(flags);
  1044. if (TimerRun(cs)) {
  1045. printk(KERN_WARNING "Elsa: timer do not run downn");
  1046. release_io_elsa(cs);
  1047. return (0);
  1048. }
  1049. printk(KERN_INFO "Elsa: timer OK; resetting cardn");
  1050. }
  1051. cs->BC_Read_Reg = &ReadHSCX;
  1052. cs->BC_Write_Reg = &WriteHSCX;
  1053. cs->BC_Send_Data = &hscx_fill_fifo;
  1054. cs->cardmsg = &Elsa_card_msg;
  1055. reset_elsa(cs);
  1056. if ((cs->subtyp == ELSA_QS1000PCI) || (cs->subtyp == ELSA_QS3000PCI) || (cs->subtyp == ELSA_PCMCIA_IPAC)) {
  1057. cs->readisac = &ReadISAC_IPAC;
  1058. cs->writeisac = &WriteISAC_IPAC;
  1059. cs->readisacfifo = &ReadISACfifo_IPAC;
  1060. cs->writeisacfifo = &WriteISACfifo_IPAC;
  1061. cs->irq_func = &elsa_interrupt_ipac;
  1062. val = readreg(cs->hw.elsa.ale, cs->hw.elsa.isac, IPAC_ID);
  1063. printk(KERN_INFO "Elsa: IPAC version %xn", val);
  1064. } else {
  1065. cs->readisac = &ReadISAC;
  1066. cs->writeisac = &WriteISAC;
  1067. cs->readisacfifo = &ReadISACfifo;
  1068. cs->writeisacfifo = &WriteISACfifo;
  1069. cs->irq_func = &elsa_interrupt;
  1070. ISACVersion(cs, "Elsa:");
  1071. if (HscxVersion(cs, "Elsa:")) {
  1072. printk(KERN_WARNING
  1073. "Elsa: wrong HSCX versions check IO addressn");
  1074. release_io_elsa(cs);
  1075. return (0);
  1076. }
  1077. }
  1078. if (cs->subtyp == ELSA_PC) {
  1079. val = readitac(cs, ITAC_SYS);
  1080. printk(KERN_INFO "Elsa: ITAC version %sn", ITACVer[val & 7]);
  1081. writeitac(cs, ITAC_ISEN, 0);
  1082. writeitac(cs, ITAC_RFIE, 0);
  1083. writeitac(cs, ITAC_XFIE, 0);
  1084. writeitac(cs, ITAC_SCIE, 0);
  1085. writeitac(cs, ITAC_STIE, 0);
  1086. }
  1087. return (1);
  1088. }