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

Linux/Unix编程

开发平台:

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