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

Linux/Unix编程

开发平台:

Unix_Linux

  1. /* $Id: hfc_sx.c,v 1.1.4.1 2001/11/20 14:19:35 kai Exp $
  2.  *
  3.  * level driver for CCD磗 hfc-s+/sp based cards
  4.  *
  5.  * Author       Werner Cornelius
  6.  *              based on existing driver for CCD HFC PCI cards
  7.  * Copyright    by Werner Cornelius  <werner@isdn4linux.de>
  8.  * 
  9.  * This software may be used and distributed according to the terms
  10.  * of the GNU General Public License, incorporated herein by reference.
  11.  *
  12.  */
  13. #define __NO_VERSION__
  14. #include <linux/init.h>
  15. #include "hisax.h"
  16. #include "hfc_sx.h"
  17. #include "isdnl1.h"
  18. #include <linux/interrupt.h>
  19. #include <linux/isapnp.h>
  20. extern const char *CardType[];
  21. static const char *hfcsx_revision = "$Revision: 1.1.4.1 $";
  22. /***************************************/
  23. /* IRQ-table for CCDs demo board       */
  24. /* IRQs 6,5,10,11,12,15 are supported  */
  25. /***************************************/
  26. /* Teles 16.3c Vendor Id TAG2620, Version 1.0, Vendor version 2.1
  27.  *
  28.  * Thanks to Uwe Wisniewski
  29.  *
  30.  * ISA-SLOT  Signal      PIN
  31.  * B25        IRQ3     92 IRQ_G
  32.  * B23        IRQ5     94 IRQ_A
  33.  * B4         IRQ2/9   95 IRQ_B
  34.  * D3         IRQ10    96 IRQ_C
  35.  * D4         IRQ11    97 IRQ_D
  36.  * D5         IRQ12    98 IRQ_E
  37.  * D6         IRQ15    99 IRQ_F
  38.  */
  39. #undef CCD_DEMO_BOARD
  40. #ifdef CCD_DEMO_BOARD
  41. static u_char ccd_sp_irqtab[16] = {
  42.   0,0,0,0,0,2,1,0,0,0,3,4,5,0,0,6
  43. };
  44. #else /* Teles 16.3c */
  45. static u_char ccd_sp_irqtab[16] = {
  46.   0,0,0,7,0,1,0,0,0,2,3,4,5,0,0,6
  47. };
  48. #endif
  49. #define NT_T1_COUNT 20 /* number of 3.125ms interrupts for G2 timeout */
  50. #define byteout(addr,val) outb(val,addr)
  51. #define bytein(addr) inb(addr)
  52. /******************************/
  53. /* In/Out access to registers */
  54. /******************************/
  55. static inline void
  56. Write_hfc(struct IsdnCardState *cs, u_char regnum, u_char val)
  57. {       unsigned long flags;
  58.         save_flags(flags);
  59. cli();
  60.         byteout(cs->hw.hfcsx.base+1, regnum);
  61. byteout(cs->hw.hfcsx.base, val);
  62. restore_flags(flags);
  63. static inline u_char
  64. Read_hfc(struct IsdnCardState *cs, u_char regnum)
  65. {       unsigned long flags;
  66.         u_char ret; 
  67.         save_flags(flags);
  68. cli();
  69.         byteout(cs->hw.hfcsx.base+1, regnum);
  70. ret = bytein(cs->hw.hfcsx.base);
  71. restore_flags(flags);
  72. return(ret);
  73. /**************************************************/
  74. /* select a fifo and remember which one for reuse */
  75. /**************************************************/
  76. static void
  77. fifo_select(struct IsdnCardState *cs, u_char fifo)
  78. {       unsigned long flags;
  79.         if (fifo == cs->hw.hfcsx.last_fifo) 
  80.   return; /* still valid */
  81. save_flags(flags);
  82. cli();
  83.         byteout(cs->hw.hfcsx.base+1, HFCSX_FIF_SEL);
  84. byteout(cs->hw.hfcsx.base, fifo);
  85. while (bytein(cs->hw.hfcsx.base+1) & 1); /* wait for busy */
  86. udelay(4);
  87. byteout(cs->hw.hfcsx.base, fifo);
  88. while (bytein(cs->hw.hfcsx.base+1) & 1); /* wait for busy */
  89. restore_flags(flags);
  90. }
  91. /******************************************/
  92. /* reset the specified fifo to defaults.  */
  93. /* If its a send fifo init needed markers */
  94. /******************************************/
  95. static void
  96. reset_fifo(struct IsdnCardState *cs, u_char fifo)
  97. {       unsigned long flags;
  98.         save_flags(flags); 
  99. cli();
  100. fifo_select(cs, fifo); /* first select the fifo */
  101. byteout(cs->hw.hfcsx.base+1, HFCSX_CIRM);
  102. byteout(cs->hw.hfcsx.base, cs->hw.hfcsx.cirm | 0x80); /* reset cmd */
  103. udelay(1);
  104. while (bytein(cs->hw.hfcsx.base+1) & 1); /* wait for busy */
  105. restore_flags(flags);
  106. /*************************************************************/
  107. /* write_fifo writes the skb contents to the desired fifo    */
  108. /* if no space is available or an error occurs 0 is returned */
  109. /* the skb is not released in any way.                       */
  110. /*************************************************************/
  111. static int
  112. write_fifo(struct IsdnCardState *cs, struct sk_buff *skb, u_char fifo, int trans_max)
  113. {       unsigned short *msp;
  114.         int fifo_size, count, z1, z2;
  115. u_char f_msk, f1, f2, *src;
  116. if (skb->len <= 0) return(0);
  117.         if (fifo & 1) return(0); /* no write fifo */
  118. fifo_select(cs, fifo);
  119. if (fifo & 4) {
  120.   fifo_size = D_FIFO_SIZE; /* D-channel */
  121.   f_msk = MAX_D_FRAMES;
  122.   if (trans_max) return(0); /* only HDLC */
  123. }
  124. else {
  125.   fifo_size = cs->hw.hfcsx.b_fifo_size; /* B-channel */
  126.   f_msk = MAX_B_FRAMES;
  127. }
  128.         z1 = Read_hfc(cs, HFCSX_FIF_Z1H);
  129. z1 = ((z1 << 8) | Read_hfc(cs, HFCSX_FIF_Z1L));
  130. /* Check for transparent mode */
  131. if (trans_max) {
  132.   z2 = Read_hfc(cs, HFCSX_FIF_Z2H);
  133.   z2 = ((z2 << 8) | Read_hfc(cs, HFCSX_FIF_Z2L));
  134.   count = z2 - z1;
  135.   if (count <= 0)
  136.     count += fifo_size; /* free bytes */
  137.   if (count < skb->len+1) return(0); /* no room */
  138.   count = fifo_size - count; /* bytes still not send */
  139.   if (count > 2 * trans_max) return(0); /* delay to long */
  140.   count = skb->len;
  141.   src = skb->data;
  142.   while (count--)
  143.     Write_hfc(cs, HFCSX_FIF_DWR, *src++);
  144.   return(1); /* success */
  145. }
  146.         msp = ((struct hfcsx_extra *)(cs->hw.hfcsx.extra))->marker;
  147. msp += (((fifo >> 1) & 3) * (MAX_B_FRAMES+1));
  148. f1 = Read_hfc(cs, HFCSX_FIF_F1) & f_msk;
  149. f2 = Read_hfc(cs, HFCSX_FIF_F2) & f_msk;
  150. count = f1 - f2; /* frame count actually buffered */
  151. if (count < 0)
  152. count += (f_msk + 1); /* if wrap around */
  153. if (count > f_msk-1) {
  154.   if (cs->debug & L1_DEB_ISAC_FIFO)
  155.     debugl1(cs, "hfcsx_write_fifo %d more as %d frames",fifo,f_msk-1);
  156.   return(0);
  157. }
  158. *(msp + f1) = z1; /* remember marker */
  159. if (cs->debug & L1_DEB_ISAC_FIFO)
  160. debugl1(cs, "hfcsx_write_fifo %d f1(%x) f2(%x) z1(f1)(%x)",
  161. fifo, f1, f2, z1);
  162. /* now determine free bytes in FIFO buffer */
  163. count = *(msp + f2) - z1;
  164. if (count <= 0)
  165.   count += fifo_size; /* count now contains available bytes */
  166. if (cs->debug & L1_DEB_ISAC_FIFO)
  167.   debugl1(cs, "hfcsx_write_fifo %d count(%ld/%d)",
  168.   fifo, skb->len, count);
  169. if (count < skb->len) {
  170.   if (cs->debug & L1_DEB_ISAC_FIFO)
  171.     debugl1(cs, "hfcsx_write_fifo %d no fifo mem", fifo);
  172.   return(0);
  173. }
  174. count = skb->len; /* get frame len */
  175. src = skb->data; /* source pointer */
  176. while (count--)
  177.   Write_hfc(cs, HFCSX_FIF_DWR, *src++);
  178. Read_hfc(cs, HFCSX_FIF_INCF1); /* increment F1 */
  179. udelay(1);
  180. while (bytein(cs->hw.hfcsx.base+1) & 1); /* wait for busy */
  181. return(1);
  182. /***************************************************************/
  183. /* read_fifo reads data to an skb from the desired fifo        */
  184. /* if no data is available or an error occurs NULL is returned */
  185. /* the skb is not released in any way.                         */
  186. /***************************************************************/
  187. static struct sk_buff * 
  188. read_fifo(struct IsdnCardState *cs, u_char fifo, int trans_max)
  189. {       int fifo_size, count, z1, z2;
  190. u_char f_msk, f1, f2, *dst;
  191. struct sk_buff *skb;
  192.         if (!(fifo & 1)) return(NULL); /* no read fifo */
  193. fifo_select(cs, fifo);
  194. if (fifo & 4) {
  195.   fifo_size = D_FIFO_SIZE; /* D-channel */
  196.   f_msk = MAX_D_FRAMES;
  197.   if (trans_max) return(NULL); /* only hdlc */
  198. }
  199. else {
  200.   fifo_size = cs->hw.hfcsx.b_fifo_size; /* B-channel */
  201.   f_msk = MAX_B_FRAMES;
  202. }
  203. /* transparent mode */
  204. if (trans_max) {
  205.   z1 = Read_hfc(cs, HFCSX_FIF_Z1H);
  206.   z1 = ((z1 << 8) | Read_hfc(cs, HFCSX_FIF_Z1L));
  207.   z2 = Read_hfc(cs, HFCSX_FIF_Z2H);
  208.   z2 = ((z2 << 8) | Read_hfc(cs, HFCSX_FIF_Z2L));
  209.   /* now determine bytes in actual FIFO buffer */
  210.   count = z1 - z2;
  211.   if (count <= 0)
  212.     count += fifo_size; /* count now contains buffered bytes */
  213.   count++;
  214.   if (count > trans_max) 
  215.     count = trans_max; /* limit length */
  216.     if ((skb = dev_alloc_skb(count))) {
  217.       dst = skb_put(skb, count);
  218.       while (count--) 
  219. *dst++ = Read_hfc(cs, HFCSX_FIF_DRD);
  220.       return(skb);
  221.     }
  222.     else return(NULL); /* no memory */
  223. }
  224. do {
  225.   f1 = Read_hfc(cs, HFCSX_FIF_F1) & f_msk;
  226.   f2 = Read_hfc(cs, HFCSX_FIF_F2) & f_msk;
  227.   if (f1 == f2) return(NULL); /* no frame available */
  228.   z1 = Read_hfc(cs, HFCSX_FIF_Z1H);
  229.   z1 = ((z1 << 8) | Read_hfc(cs, HFCSX_FIF_Z1L));
  230.   z2 = Read_hfc(cs, HFCSX_FIF_Z2H);
  231.   z2 = ((z2 << 8) | Read_hfc(cs, HFCSX_FIF_Z2L));
  232.   if (cs->debug & L1_DEB_ISAC_FIFO)
  233.     debugl1(cs, "hfcsx_read_fifo %d f1(%x) f2(%x) z1(f2)(%x) z2(f2)(%x)",
  234. fifo, f1, f2, z1, z2);
  235.   /* now determine bytes in actual FIFO buffer */
  236.   count = z1 - z2;
  237.   if (count <= 0)
  238.     count += fifo_size; /* count now contains buffered bytes */
  239.   count++;
  240.   if (cs->debug & L1_DEB_ISAC_FIFO)
  241.     debugl1(cs, "hfcsx_read_fifo %d count %ld)",
  242.     fifo, count);
  243.   if ((count > fifo_size) || (count < 4)) {
  244.     if (cs->debug & L1_DEB_WARN)
  245.       debugl1(cs, "hfcsx_read_fifo %d paket inv. len %d ", fifo , count);
  246.     while (count) {
  247.       count--; /* empty fifo */
  248.       Read_hfc(cs, HFCSX_FIF_DRD);
  249.     }
  250.     skb = NULL;
  251.   } else 
  252.     if ((skb = dev_alloc_skb(count - 3))) {
  253.       count -= 3;
  254.       dst = skb_put(skb, count);
  255.       while (count--) 
  256. *dst++ = Read_hfc(cs, HFCSX_FIF_DRD);
  257.     
  258.       Read_hfc(cs, HFCSX_FIF_DRD); /* CRC 1 */
  259.       Read_hfc(cs, HFCSX_FIF_DRD); /* CRC 2 */
  260.       if (Read_hfc(cs, HFCSX_FIF_DRD)) {
  261. dev_kfree_skb_irq(skb);
  262. if (cs->debug & L1_DEB_ISAC_FIFO)
  263.   debugl1(cs, "hfcsx_read_fifo %d crc error", fifo);
  264. skb = NULL;
  265.       }
  266.     } else {
  267.       printk(KERN_WARNING "HFC-SX: receive out of memoryn");
  268.       return(NULL);
  269.     }
  270.   Read_hfc(cs, HFCSX_FIF_INCF2); /* increment F2 */
  271.   udelay(1);
  272.   while (bytein(cs->hw.hfcsx.base+1) & 1); /* wait for busy */
  273.   udelay(1);
  274. } while (!skb); /* retry in case of crc error */
  275. return(skb);
  276. /******************************************/
  277. /* free hardware resources used by driver */
  278. /******************************************/
  279. void
  280. release_io_hfcsx(struct IsdnCardState *cs)
  281. {
  282. unsigned long flags;
  283. save_flags(flags);
  284. cli();
  285. cs->hw.hfcsx.int_m2 = 0; /* interrupt output off ! */
  286. Write_hfc(cs, HFCSX_INT_M2, cs->hw.hfcsx.int_m2);
  287. restore_flags(flags);
  288. Write_hfc(cs, HFCSX_CIRM, HFCSX_RESET); /* Reset On */
  289. sti();
  290. set_current_state(TASK_UNINTERRUPTIBLE);
  291. schedule_timeout((30 * HZ) / 1000); /* Timeout 30ms */
  292. Write_hfc(cs, HFCSX_CIRM, 0); /* Reset Off */
  293. del_timer(&cs->hw.hfcsx.timer);
  294. release_region(cs->hw.hfcsx.base, 2); /* release IO-Block */
  295. kfree(cs->hw.hfcsx.extra);
  296. cs->hw.hfcsx.extra = NULL;
  297. }
  298. /**********************************************************/
  299. /* set_fifo_size determines the size of the RAM and FIFOs */
  300. /* returning 0 -> need to reset the chip again.           */
  301. /**********************************************************/
  302. static int set_fifo_size(struct IsdnCardState *cs)
  303. {
  304.         
  305.         if (cs->hw.hfcsx.b_fifo_size) return(1); /* already determined */
  306. if ((cs->hw.hfcsx.chip >> 4) == 9) {
  307.   cs->hw.hfcsx.b_fifo_size = B_FIFO_SIZE_32K;
  308.   return(1);
  309. }
  310.   cs->hw.hfcsx.b_fifo_size = B_FIFO_SIZE_8K;
  311.   cs->hw.hfcsx.cirm |= 0x10; /* only 8K of ram */
  312.   return(0);
  313. }
  314. /********************************************************************************/
  315. /* function called to reset the HFC SX chip. A complete software reset of chip */
  316. /* and fifos is done.                                                           */
  317. /********************************************************************************/
  318. static void
  319. reset_hfcsx(struct IsdnCardState *cs)
  320. {
  321. long flags;
  322. save_flags(flags);
  323. cli();
  324. cs->hw.hfcsx.int_m2 = 0; /* interrupt output off ! */
  325. Write_hfc(cs, HFCSX_INT_M2, cs->hw.hfcsx.int_m2);
  326. printk(KERN_INFO "HFC_SX: resetting cardn");
  327. while (1) {
  328.   Write_hfc(cs, HFCSX_CIRM, HFCSX_RESET | cs->hw.hfcsx.cirm ); /* Reset */
  329.   sti();
  330.   set_current_state(TASK_UNINTERRUPTIBLE);
  331.   schedule_timeout((30 * HZ) / 1000); /* Timeout 30ms */
  332.   Write_hfc(cs, HFCSX_CIRM, cs->hw.hfcsx.cirm); /* Reset Off */
  333.   set_current_state(TASK_UNINTERRUPTIBLE);
  334.   schedule_timeout((20 * HZ) / 1000); /* Timeout 20ms */
  335.   if (Read_hfc(cs, HFCSX_STATUS) & 2)
  336.     printk(KERN_WARNING "HFC-SX init bit busyn");
  337.   cs->hw.hfcsx.last_fifo = 0xff; /* invalidate */
  338.   if (!set_fifo_size(cs)) continue;
  339.   break;
  340. }
  341. cs->hw.hfcsx.trm = 0 + HFCSX_BTRANS_THRESMASK; /* no echo connect , threshold */
  342. Write_hfc(cs, HFCSX_TRM, cs->hw.hfcsx.trm);
  343. Write_hfc(cs, HFCSX_CLKDEL, 0x0e); /* ST-Bit delay for TE-Mode */
  344. cs->hw.hfcsx.sctrl_e = HFCSX_AUTO_AWAKE;
  345. Write_hfc(cs, HFCSX_SCTRL_E, cs->hw.hfcsx.sctrl_e); /* S/T Auto awake */
  346. cs->hw.hfcsx.bswapped = 0; /* no exchange */
  347. cs->hw.hfcsx.nt_mode = 0; /* we are in TE mode */
  348. cs->hw.hfcsx.ctmt = HFCSX_TIM3_125 | HFCSX_AUTO_TIMER;
  349. Write_hfc(cs, HFCSX_CTMT, cs->hw.hfcsx.ctmt);
  350. cs->hw.hfcsx.int_m1 = HFCSX_INTS_DTRANS | HFCSX_INTS_DREC | 
  351.     HFCSX_INTS_L1STATE | HFCSX_INTS_TIMER;
  352. Write_hfc(cs, HFCSX_INT_M1, cs->hw.hfcsx.int_m1);
  353. /* Clear already pending ints */
  354. if (Read_hfc(cs, HFCSX_INT_S1));
  355. Write_hfc(cs, HFCSX_STATES, HFCSX_LOAD_STATE | 2); /* HFC ST 2 */
  356. udelay(10);
  357. Write_hfc(cs, HFCSX_STATES, 2); /* HFC ST 2 */
  358. cs->hw.hfcsx.mst_m = HFCSX_MASTER; /* HFC Master Mode */
  359. Write_hfc(cs, HFCSX_MST_MODE, cs->hw.hfcsx.mst_m);
  360. cs->hw.hfcsx.sctrl = 0x40; /* set tx_lo mode, error in datasheet ! */
  361. Write_hfc(cs, HFCSX_SCTRL, cs->hw.hfcsx.sctrl);
  362. cs->hw.hfcsx.sctrl_r = 0;
  363. Write_hfc(cs, HFCSX_SCTRL_R, cs->hw.hfcsx.sctrl_r);
  364. /* Init GCI/IOM2 in master mode */
  365. /* Slots 0 and 1 are set for B-chan 1 and 2 */
  366. /* D- and monitor/CI channel are not enabled */
  367. /* STIO1 is used as output for data, B1+B2 from ST->IOM+HFC */
  368. /* STIO2 is used as data input, B1+B2 from IOM->ST */
  369. /* ST B-channel send disabled -> continous 1s */
  370. /* The IOM slots are always enabled */
  371. cs->hw.hfcsx.conn = 0x36; /* set data flow directions */
  372. Write_hfc(cs, HFCSX_CONNECT, cs->hw.hfcsx.conn);
  373. Write_hfc(cs, HFCSX_B1_SSL, 0x80); /* B1-Slot 0 STIO1 out enabled */
  374. Write_hfc(cs, HFCSX_B2_SSL, 0x81); /* B2-Slot 1 STIO1 out enabled */
  375. Write_hfc(cs, HFCSX_B1_RSL, 0x80); /* B1-Slot 0 STIO2 in enabled */
  376. Write_hfc(cs, HFCSX_B2_RSL, 0x81); /* B2-Slot 1 STIO2 in enabled */
  377. /* Finally enable IRQ output */
  378. cs->hw.hfcsx.int_m2 = HFCSX_IRQ_ENABLE;
  379. Write_hfc(cs, HFCSX_INT_M2, cs->hw.hfcsx.int_m2);
  380. if (Read_hfc(cs, HFCSX_INT_S2));
  381. restore_flags(flags);
  382. }
  383. /***************************************************/
  384. /* Timer function called when kernel timer expires */
  385. /***************************************************/
  386. static void
  387. hfcsx_Timer(struct IsdnCardState *cs)
  388. {
  389. cs->hw.hfcsx.timer.expires = jiffies + 75;
  390. /* WD RESET */
  391. /*      WriteReg(cs, HFCD_DATA, HFCD_CTMT, cs->hw.hfcsx.ctmt | 0x80);
  392.    add_timer(&cs->hw.hfcsx.timer);
  393.  */
  394. }
  395. /*********************************/
  396. /* schedule a new D-channel task */
  397. /*********************************/
  398. static void
  399. sched_event_D_sx(struct IsdnCardState *cs, int event)
  400. {
  401. test_and_set_bit(event, &cs->event);
  402. queue_task(&cs->tqueue, &tq_immediate);
  403. mark_bh(IMMEDIATE_BH);
  404. }
  405. /*********************************/
  406. /* schedule a new b_channel task */
  407. /*********************************/
  408. static void
  409. hfcsx_sched_event(struct BCState *bcs, int event)
  410. {
  411. bcs->event |= 1 << event;
  412. queue_task(&bcs->tqueue, &tq_immediate);
  413. mark_bh(IMMEDIATE_BH);
  414. }
  415. /************************************************/
  416. /* select a b-channel entry matching and active */
  417. /************************************************/
  418. static
  419. struct BCState *
  420. Sel_BCS(struct IsdnCardState *cs, int channel)
  421. {
  422. if (cs->bcs[0].mode && (cs->bcs[0].channel == channel))
  423. return (&cs->bcs[0]);
  424. else if (cs->bcs[1].mode && (cs->bcs[1].channel == channel))
  425. return (&cs->bcs[1]);
  426. else
  427. return (NULL);
  428. }
  429. /*******************************/
  430. /* D-channel receive procedure */
  431. /*******************************/
  432. static
  433. int
  434. receive_dmsg(struct IsdnCardState *cs)
  435. {
  436. struct sk_buff *skb;
  437. int count = 5;
  438. if (test_and_set_bit(FLG_LOCK_ATOMIC, &cs->HW_Flags)) {
  439. debugl1(cs, "rec_dmsg blocked");
  440. return (1);
  441. }
  442. do {
  443.   skb = read_fifo(cs, HFCSX_SEL_D_RX, 0);
  444.   if (skb) {
  445.     skb_queue_tail(&cs->rq, skb);
  446.     sched_event_D_sx(cs, D_RCVBUFREADY);
  447.   }
  448. } while (--count && skb);
  449. test_and_clear_bit(FLG_LOCK_ATOMIC, &cs->HW_Flags);
  450. return (1);
  451. }
  452. /**********************************/
  453. /* B-channel main receive routine */
  454. /**********************************/
  455. void
  456. main_rec_hfcsx(struct BCState *bcs)
  457. {
  458. long flags;
  459. struct IsdnCardState *cs = bcs->cs;
  460. int count = 5;
  461. struct sk_buff *skb;
  462. save_flags(flags);
  463.   
  464.       Begin:
  465. count--;
  466. cli();
  467. if (test_and_set_bit(FLG_LOCK_ATOMIC, &cs->HW_Flags)) {
  468. debugl1(cs, "rec_data %d blocked", bcs->channel);
  469. restore_flags(flags);
  470. return;
  471. }
  472. sti();
  473. skb = read_fifo(cs, ((bcs->channel) && (!cs->hw.hfcsx.bswapped)) ? 
  474. HFCSX_SEL_B2_RX : HFCSX_SEL_B1_RX,
  475. (bcs->mode == L1_MODE_TRANS) ? 
  476. HFCSX_BTRANS_THRESHOLD : 0);
  477. if (skb) {
  478.   cli();
  479.   skb_queue_tail(&bcs->rqueue, skb);
  480.   sti();
  481.   hfcsx_sched_event(bcs, B_RCVBUFREADY);
  482. }
  483. test_and_clear_bit(FLG_LOCK_ATOMIC, &cs->HW_Flags);
  484. if (count && skb)
  485. goto Begin;
  486. restore_flags(flags);
  487. return;
  488. }
  489. /**************************/
  490. /* D-channel send routine */
  491. /**************************/
  492. static void
  493. hfcsx_fill_dfifo(struct IsdnCardState *cs)
  494. {
  495. if (!cs->tx_skb)
  496. return;
  497. if (cs->tx_skb->len <= 0)
  498. return;
  499. if (write_fifo(cs, cs->tx_skb, HFCSX_SEL_D_TX, 0)) {
  500.   dev_kfree_skb_any(cs->tx_skb);
  501.   cs->tx_skb = NULL;
  502. }
  503. return;
  504. }
  505. /**************************/
  506. /* B-channel send routine */
  507. /**************************/
  508. static void
  509. hfcsx_fill_fifo(struct BCState *bcs)
  510. {
  511. struct IsdnCardState *cs = bcs->cs;
  512. unsigned long flags;
  513. if (!bcs->tx_skb)
  514. return;
  515. if (bcs->tx_skb->len <= 0)
  516. return;
  517. save_flags(flags);
  518. sti();
  519. if (write_fifo(cs, bcs->tx_skb, 
  520.        ((bcs->channel) && (!cs->hw.hfcsx.bswapped)) ? 
  521.        HFCSX_SEL_B2_TX : HFCSX_SEL_B1_TX,
  522.        (bcs->mode == L1_MODE_TRANS) ? 
  523.        HFCSX_BTRANS_THRESHOLD : 0)) {
  524.   bcs->tx_cnt -= bcs->tx_skb->len;
  525.   if (bcs->st->lli.l1writewakeup &&
  526.       (PACKET_NOACK != bcs->tx_skb->pkt_type))
  527.     bcs->st->lli.l1writewakeup(bcs->st, bcs->tx_skb->len);
  528.   dev_kfree_skb_any(bcs->tx_skb);
  529.   bcs->tx_skb = NULL;
  530.   test_and_clear_bit(BC_FLG_BUSY, &bcs->Flag);
  531. }
  532. cli();
  533. restore_flags(flags);
  534. return;
  535. }
  536. /**********************************************/
  537. /* D-channel l1 state call for leased NT-mode */
  538. /**********************************************/
  539. static void
  540. dch_nt_l2l1(struct PStack *st, int pr, void *arg)
  541. {
  542. struct IsdnCardState *cs = (struct IsdnCardState *) st->l1.hardware;
  543. switch (pr) {
  544. case (PH_DATA | REQUEST):
  545. case (PH_PULL | REQUEST):
  546. case (PH_PULL | INDICATION):
  547. st->l1.l1hw(st, pr, arg);
  548. break;
  549. case (PH_ACTIVATE | REQUEST):
  550. st->l1.l1l2(st, PH_ACTIVATE | CONFIRM, NULL);
  551. break;
  552. case (PH_TESTLOOP | REQUEST):
  553. if (1 & (long) arg)
  554. debugl1(cs, "PH_TEST_LOOP B1");
  555. if (2 & (long) arg)
  556. debugl1(cs, "PH_TEST_LOOP B2");
  557. if (!(3 & (long) arg))
  558. debugl1(cs, "PH_TEST_LOOP DISABLED");
  559. st->l1.l1hw(st, HW_TESTLOOP | REQUEST, arg);
  560. break;
  561. default:
  562. if (cs->debug)
  563. debugl1(cs, "dch_nt_l2l1 msg %04X unhandled", pr);
  564. break;
  565. }
  566. }
  567. /***********************/
  568. /* set/reset echo mode */
  569. /***********************/
  570. static int
  571. hfcsx_auxcmd(struct IsdnCardState *cs, isdn_ctrl * ic)
  572. {
  573. unsigned long flags;
  574. int i = *(unsigned int *) ic->parm.num;
  575. if ((ic->arg == 98) &&
  576.     (!(cs->hw.hfcsx.int_m1 & (HFCSX_INTS_B2TRANS + HFCSX_INTS_B2REC + HFCSX_INTS_B1TRANS + HFCSX_INTS_B1REC)))) {
  577. save_flags(flags);
  578. cli();
  579. Write_hfc(cs, HFCSX_STATES, HFCSX_LOAD_STATE | 0); /* HFC ST G0 */
  580. udelay(10);
  581. cs->hw.hfcsx.sctrl |= SCTRL_MODE_NT;
  582. Write_hfc(cs, HFCSX_SCTRL, cs->hw.hfcsx.sctrl); /* set NT-mode */
  583. udelay(10);
  584. Write_hfc(cs, HFCSX_STATES, HFCSX_LOAD_STATE | 1); /* HFC ST G1 */
  585. udelay(10);
  586. Write_hfc(cs, HFCSX_STATES, 1 | HFCSX_ACTIVATE | HFCSX_DO_ACTION);
  587. cs->dc.hfcsx.ph_state = 1;
  588. cs->hw.hfcsx.nt_mode = 1;
  589. cs->hw.hfcsx.nt_timer = 0;
  590. cs->stlist->l2.l2l1 = dch_nt_l2l1;
  591. restore_flags(flags);
  592. debugl1(cs, "NT mode activated");
  593. return (0);
  594. }
  595. if ((cs->chanlimit > 1) || (cs->hw.hfcsx.bswapped) ||
  596.     (cs->hw.hfcsx.nt_mode) || (ic->arg != 12))
  597. return (-EINVAL);
  598. save_flags(flags);
  599. cli();
  600. if (i) {
  601. cs->logecho = 1;
  602. cs->hw.hfcsx.trm |= 0x20; /* enable echo chan */
  603. cs->hw.hfcsx.int_m1 |= HFCSX_INTS_B2REC;
  604. /* reset Channel !!!!! */
  605. } else {
  606. cs->logecho = 0;
  607. cs->hw.hfcsx.trm &= ~0x20; /* disable echo chan */
  608. cs->hw.hfcsx.int_m1 &= ~HFCSX_INTS_B2REC;
  609. }
  610. cs->hw.hfcsx.sctrl_r &= ~SCTRL_B2_ENA;
  611. cs->hw.hfcsx.sctrl &= ~SCTRL_B2_ENA;
  612. cs->hw.hfcsx.conn |= 0x10; /* B2-IOM -> B2-ST */
  613. cs->hw.hfcsx.ctmt &= ~2;
  614. Write_hfc(cs, HFCSX_CTMT, cs->hw.hfcsx.ctmt);
  615. Write_hfc(cs, HFCSX_SCTRL_R, cs->hw.hfcsx.sctrl_r);
  616. Write_hfc(cs, HFCSX_SCTRL, cs->hw.hfcsx.sctrl);
  617. Write_hfc(cs, HFCSX_CONNECT, cs->hw.hfcsx.conn);
  618. Write_hfc(cs, HFCSX_TRM, cs->hw.hfcsx.trm);
  619. Write_hfc(cs, HFCSX_INT_M1, cs->hw.hfcsx.int_m1);
  620. restore_flags(flags);
  621. return (0);
  622. } /* hfcsx_auxcmd */
  623. /*****************************/
  624. /* E-channel receive routine */
  625. /*****************************/
  626. static void
  627. receive_emsg(struct IsdnCardState *cs)
  628. {
  629. unsigned long flags;
  630. int count = 5;
  631. u_char *ptr;
  632. struct sk_buff *skb;
  633. save_flags(flags);
  634. cli();
  635. if (test_and_set_bit(FLG_LOCK_ATOMIC, &cs->HW_Flags)) {
  636. debugl1(cs, "echo_rec_data blocked");
  637. restore_flags(flags);
  638. return;
  639. }
  640. sti();
  641. do {
  642.   skb = read_fifo(cs, HFCSX_SEL_B2_RX, 0);
  643.   if (skb) {
  644.     if (cs->debug & DEB_DLOG_HEX) {
  645.       ptr = cs->dlog;
  646.       if ((skb->len) < MAX_DLOG_SPACE / 3 - 10) {
  647. *ptr++ = 'E';
  648. *ptr++ = 'C';
  649. *ptr++ = 'H';
  650. *ptr++ = 'O';
  651. *ptr++ = ':';
  652. ptr += QuickHex(ptr, skb->data, skb->len);
  653. ptr--;
  654. *ptr++ = 'n';
  655. *ptr = 0;
  656. HiSax_putstatus(cs, NULL, cs->dlog);
  657.       } else
  658. HiSax_putstatus(cs, "LogEcho: ", "warning Frame too big (%d)", skb->len);
  659.     }
  660.     dev_kfree_skb_any(skb);
  661.   }
  662. } while (--count && skb);
  663. test_and_clear_bit(FLG_LOCK_ATOMIC, &cs->HW_Flags);
  664. restore_flags(flags);
  665. return;
  666. } /* receive_emsg */
  667. /*********************/
  668. /* Interrupt handler */
  669. /*********************/
  670. static void
  671. hfcsx_interrupt(int intno, void *dev_id, struct pt_regs *regs)
  672. {
  673. struct IsdnCardState *cs = dev_id;
  674. u_char exval;
  675. struct BCState *bcs;
  676. int count = 15;
  677. long flags;
  678. u_char val, stat;
  679. if (!cs) {
  680. printk(KERN_WARNING "HFC-SX: Spurious interrupt!n");
  681. return;
  682. }
  683. if (!(cs->hw.hfcsx.int_m2 & 0x08))
  684. return; /* not initialised */
  685. if (HFCSX_ANYINT & (stat = Read_hfc(cs, HFCSX_STATUS))) {
  686. val = Read_hfc(cs, HFCSX_INT_S1);
  687. if (cs->debug & L1_DEB_ISAC)
  688. debugl1(cs, "HFC-SX: stat(%02x) s1(%02x)", stat, val);
  689. } else
  690. return;
  691. if (cs->debug & L1_DEB_ISAC)
  692. debugl1(cs, "HFC-SX irq %x %s", val,
  693. test_bit(FLG_LOCK_ATOMIC, &cs->HW_Flags) ?
  694. "locked" : "unlocked");
  695. val &= cs->hw.hfcsx.int_m1;
  696. if (val & 0x40) { /* state machine irq */
  697. exval = Read_hfc(cs, HFCSX_STATES) & 0xf;
  698. if (cs->debug & L1_DEB_ISAC)
  699. debugl1(cs, "ph_state chg %d->%d", cs->dc.hfcsx.ph_state,
  700. exval);
  701. cs->dc.hfcsx.ph_state = exval;
  702. sched_event_D_sx(cs, D_L1STATECHANGE);
  703. val &= ~0x40;
  704. }
  705. if (val & 0x80) { /* timer irq */
  706. if (cs->hw.hfcsx.nt_mode) {
  707. if ((--cs->hw.hfcsx.nt_timer) < 0)
  708. sched_event_D_sx(cs, D_L1STATECHANGE);
  709. }
  710. val &= ~0x80;
  711. Write_hfc(cs, HFCSX_CTMT, cs->hw.hfcsx.ctmt | HFCSX_CLTIMER);
  712. }
  713. while (val) {
  714. save_flags(flags);
  715. cli();
  716. if (test_bit(FLG_LOCK_ATOMIC, &cs->HW_Flags)) {
  717. cs->hw.hfcsx.int_s1 |= val;
  718. restore_flags(flags);
  719. return;
  720. }
  721. if (cs->hw.hfcsx.int_s1 & 0x18) {
  722. exval = val;
  723. val = cs->hw.hfcsx.int_s1;
  724. cs->hw.hfcsx.int_s1 = exval;
  725. }
  726. if (val & 0x08) {
  727. if (!(bcs = Sel_BCS(cs, cs->hw.hfcsx.bswapped ? 1 : 0))) {
  728. if (cs->debug)
  729. debugl1(cs, "hfcsx spurious 0x08 IRQ");
  730. } else
  731. main_rec_hfcsx(bcs);
  732. }
  733. if (val & 0x10) {
  734. if (cs->logecho)
  735. receive_emsg(cs);
  736. else if (!(bcs = Sel_BCS(cs, 1))) {
  737. if (cs->debug)
  738. debugl1(cs, "hfcsx spurious 0x10 IRQ");
  739. } else
  740. main_rec_hfcsx(bcs);
  741. }
  742. if (val & 0x01) {
  743. if (!(bcs = Sel_BCS(cs, cs->hw.hfcsx.bswapped ? 1 : 0))) {
  744. if (cs->debug)
  745. debugl1(cs, "hfcsx spurious 0x01 IRQ");
  746. } else {
  747. if (bcs->tx_skb) {
  748. if (!test_and_set_bit(FLG_LOCK_ATOMIC, &cs->HW_Flags)) {
  749. hfcsx_fill_fifo(bcs);
  750. test_and_clear_bit(FLG_LOCK_ATOMIC, &cs->HW_Flags);
  751. } else
  752. debugl1(cs, "fill_data %d blocked", bcs->channel);
  753. } else {
  754. if ((bcs->tx_skb = skb_dequeue(&bcs->squeue))) {
  755. if (!test_and_set_bit(FLG_LOCK_ATOMIC, &cs->HW_Flags)) {
  756. hfcsx_fill_fifo(bcs);
  757. test_and_clear_bit(FLG_LOCK_ATOMIC, &cs->HW_Flags);
  758. } else
  759. debugl1(cs, "fill_data %d blocked", bcs->channel);
  760. } else {
  761. hfcsx_sched_event(bcs, B_XMTBUFREADY);
  762. }
  763. }
  764. }
  765. }
  766. if (val & 0x02) {
  767. if (!(bcs = Sel_BCS(cs, 1))) {
  768. if (cs->debug)
  769. debugl1(cs, "hfcsx spurious 0x02 IRQ");
  770. } else {
  771. if (bcs->tx_skb) {
  772. if (!test_and_set_bit(FLG_LOCK_ATOMIC, &cs->HW_Flags)) {
  773. hfcsx_fill_fifo(bcs);
  774. test_and_clear_bit(FLG_LOCK_ATOMIC, &cs->HW_Flags);
  775. } else
  776. debugl1(cs, "fill_data %d blocked", bcs->channel);
  777. } else {
  778. if ((bcs->tx_skb = skb_dequeue(&bcs->squeue))) {
  779. if (!test_and_set_bit(FLG_LOCK_ATOMIC, &cs->HW_Flags)) {
  780. hfcsx_fill_fifo(bcs);
  781. test_and_clear_bit(FLG_LOCK_ATOMIC, &cs->HW_Flags);
  782. } else
  783. debugl1(cs, "fill_data %d blocked", bcs->channel);
  784. } else {
  785. hfcsx_sched_event(bcs, B_XMTBUFREADY);
  786. }
  787. }
  788. }
  789. }
  790. if (val & 0x20) { /* receive dframe */
  791. receive_dmsg(cs);
  792. }
  793. if (val & 0x04) { /* dframe transmitted */
  794. if (test_and_clear_bit(FLG_DBUSY_TIMER, &cs->HW_Flags))
  795. del_timer(&cs->dbusytimer);
  796. if (test_and_clear_bit(FLG_L1_DBUSY, &cs->HW_Flags))
  797. sched_event_D_sx(cs, D_CLEARBUSY);
  798. if (cs->tx_skb) {
  799. if (cs->tx_skb->len) {
  800. if (!test_and_set_bit(FLG_LOCK_ATOMIC, &cs->HW_Flags)) {
  801. hfcsx_fill_dfifo(cs);
  802. test_and_clear_bit(FLG_LOCK_ATOMIC, &cs->HW_Flags);
  803. } else {
  804. debugl1(cs, "hfcsx_fill_dfifo irq blocked");
  805. }
  806. goto afterXPR;
  807. } else {
  808. dev_kfree_skb_irq(cs->tx_skb);
  809. cs->tx_cnt = 0;
  810. cs->tx_skb = NULL;
  811. }
  812. }
  813. if ((cs->tx_skb = skb_dequeue(&cs->sq))) {
  814. cs->tx_cnt = 0;
  815. if (!test_and_set_bit(FLG_LOCK_ATOMIC, &cs->HW_Flags)) {
  816. hfcsx_fill_dfifo(cs);
  817. test_and_clear_bit(FLG_LOCK_ATOMIC, &cs->HW_Flags);
  818. } else {
  819. debugl1(cs, "hfcsx_fill_dfifo irq blocked");
  820. }
  821. } else
  822. sched_event_D_sx(cs, D_XMTBUFREADY);
  823. }
  824.       afterXPR:
  825. if (cs->hw.hfcsx.int_s1 && count--) {
  826. val = cs->hw.hfcsx.int_s1;
  827. cs->hw.hfcsx.int_s1 = 0;
  828. if (cs->debug & L1_DEB_ISAC)
  829. debugl1(cs, "HFC-SX irq %x loop %d", val, 15 - count);
  830. } else
  831. val = 0;
  832. restore_flags(flags);
  833. }
  834. }
  835. /********************************************************************/
  836. /* timer callback for D-chan busy resolution. Currently no function */
  837. /********************************************************************/
  838. static void
  839. hfcsx_dbusy_timer(struct IsdnCardState *cs)
  840. {
  841. }
  842. /*************************************/
  843. /* Layer 1 D-channel hardware access */
  844. /*************************************/
  845. static void
  846. HFCSX_l1hw(struct PStack *st, int pr, void *arg)
  847. {
  848. struct IsdnCardState *cs = (struct IsdnCardState *) st->l1.hardware;
  849. struct sk_buff *skb = arg;
  850. unsigned long flags;
  851. switch (pr) {
  852. case (PH_DATA | REQUEST):
  853. if (cs->debug & DEB_DLOG_HEX)
  854. LogFrame(cs, skb->data, skb->len);
  855. if (cs->debug & DEB_DLOG_VERBOSE)
  856. dlogframe(cs, skb, 0);
  857. if (cs->tx_skb) {
  858. skb_queue_tail(&cs->sq, skb);
  859. #ifdef L2FRAME_DEBUG /* psa */
  860. if (cs->debug & L1_DEB_LAPD)
  861. Logl2Frame(cs, skb, "PH_DATA Queued", 0);
  862. #endif
  863. } else {
  864. cs->tx_skb = skb;
  865. cs->tx_cnt = 0;
  866. #ifdef L2FRAME_DEBUG /* psa */
  867. if (cs->debug & L1_DEB_LAPD)
  868. Logl2Frame(cs, skb, "PH_DATA", 0);
  869. #endif
  870. if (!test_and_set_bit(FLG_LOCK_ATOMIC, &cs->HW_Flags)) {
  871.         hfcsx_fill_dfifo(cs); 
  872. test_and_clear_bit(FLG_LOCK_ATOMIC, &cs->HW_Flags);
  873. } else
  874. debugl1(cs, "hfcsx_fill_dfifo blocked");
  875. }
  876. break;
  877. case (PH_PULL | INDICATION):
  878. if (cs->tx_skb) {
  879. if (cs->debug & L1_DEB_WARN)
  880. debugl1(cs, " l2l1 tx_skb exist this shouldn't happen");
  881. skb_queue_tail(&cs->sq, skb);
  882. break;
  883. }
  884. if (cs->debug & DEB_DLOG_HEX)
  885. LogFrame(cs, skb->data, skb->len);
  886. if (cs->debug & DEB_DLOG_VERBOSE)
  887. dlogframe(cs, skb, 0);
  888. cs->tx_skb = skb;
  889. cs->tx_cnt = 0;
  890. #ifdef L2FRAME_DEBUG /* psa */
  891. if (cs->debug & L1_DEB_LAPD)
  892. Logl2Frame(cs, skb, "PH_DATA_PULLED", 0);
  893. #endif
  894. if (!test_and_set_bit(FLG_LOCK_ATOMIC, &cs->HW_Flags)) {
  895. hfcsx_fill_dfifo(cs); 
  896. test_and_clear_bit(FLG_LOCK_ATOMIC, &cs->HW_Flags);
  897. } else
  898. debugl1(cs, "hfcsx_fill_dfifo blocked");
  899. break;
  900. case (PH_PULL | REQUEST):
  901. #ifdef L2FRAME_DEBUG /* psa */
  902. if (cs->debug & L1_DEB_LAPD)
  903. debugl1(cs, "-> PH_REQUEST_PULL");
  904. #endif
  905. if (!cs->tx_skb) {
  906. test_and_clear_bit(FLG_L1_PULL_REQ, &st->l1.Flags);
  907. st->l1.l1l2(st, PH_PULL | CONFIRM, NULL);
  908. } else
  909. test_and_set_bit(FLG_L1_PULL_REQ, &st->l1.Flags);
  910. break;
  911. case (HW_RESET | REQUEST):
  912. Write_hfc(cs, HFCSX_STATES, HFCSX_LOAD_STATE | 3); /* HFC ST 3 */
  913. udelay(6);
  914. Write_hfc(cs, HFCSX_STATES, 3); /* HFC ST 2 */
  915. cs->hw.hfcsx.mst_m |= HFCSX_MASTER;
  916. Write_hfc(cs, HFCSX_MST_MODE, cs->hw.hfcsx.mst_m);
  917. Write_hfc(cs, HFCSX_STATES, HFCSX_ACTIVATE | HFCSX_DO_ACTION);
  918. l1_msg(cs, HW_POWERUP | CONFIRM, NULL);
  919. break;
  920. case (HW_ENABLE | REQUEST):
  921. Write_hfc(cs, HFCSX_STATES, HFCSX_ACTIVATE | HFCSX_DO_ACTION);
  922. break;
  923. case (HW_DEACTIVATE | REQUEST):
  924. cs->hw.hfcsx.mst_m &= ~HFCSX_MASTER;
  925. Write_hfc(cs, HFCSX_MST_MODE, cs->hw.hfcsx.mst_m);
  926. break;
  927. case (HW_INFO3 | REQUEST):
  928. cs->hw.hfcsx.mst_m |= HFCSX_MASTER;
  929. Write_hfc(cs, HFCSX_MST_MODE, cs->hw.hfcsx.mst_m);
  930. break;
  931. case (HW_TESTLOOP | REQUEST):
  932. switch ((int) arg) {
  933. case (1):
  934. Write_hfc(cs, HFCSX_B1_SSL, 0x80); /* tx slot */
  935. Write_hfc(cs, HFCSX_B1_RSL, 0x80); /* rx slot */
  936. save_flags(flags);
  937. cli();
  938. cs->hw.hfcsx.conn = (cs->hw.hfcsx.conn & ~7) | 1;
  939. Write_hfc(cs, HFCSX_CONNECT, cs->hw.hfcsx.conn);
  940. restore_flags(flags);
  941. break;
  942. case (2):
  943. Write_hfc(cs, HFCSX_B2_SSL, 0x81); /* tx slot */
  944. Write_hfc(cs, HFCSX_B2_RSL, 0x81); /* rx slot */
  945. save_flags(flags);
  946. cli();
  947. cs->hw.hfcsx.conn = (cs->hw.hfcsx.conn & ~0x38) | 0x08;
  948. Write_hfc(cs, HFCSX_CONNECT, cs->hw.hfcsx.conn);
  949. restore_flags(flags);
  950. break;
  951. default:
  952. if (cs->debug & L1_DEB_WARN)
  953. debugl1(cs, "hfcsx_l1hw loop invalid %4x", (int) arg);
  954. return;
  955. }
  956. save_flags(flags);
  957. cli();
  958. cs->hw.hfcsx.trm |= 0x80; /* enable IOM-loop */
  959. Write_hfc(cs, HFCSX_TRM, cs->hw.hfcsx.trm);
  960. restore_flags(flags);
  961. break;
  962. default:
  963. if (cs->debug & L1_DEB_WARN)
  964. debugl1(cs, "hfcsx_l1hw unknown pr %4x", pr);
  965. break;
  966. }
  967. }
  968. /***********************************************/
  969. /* called during init setting l1 stack pointer */
  970. /***********************************************/
  971. void
  972. setstack_hfcsx(struct PStack *st, struct IsdnCardState *cs)
  973. {
  974. st->l1.l1hw = HFCSX_l1hw;
  975. }
  976. /**************************************/
  977. /* send B-channel data if not blocked */
  978. /**************************************/
  979. static void
  980. hfcsx_send_data(struct BCState *bcs)
  981. {
  982. struct IsdnCardState *cs = bcs->cs;
  983. if (!test_and_set_bit(FLG_LOCK_ATOMIC, &cs->HW_Flags)) {
  984.   hfcsx_fill_fifo(bcs);
  985. test_and_clear_bit(FLG_LOCK_ATOMIC, &cs->HW_Flags);
  986. } else
  987. debugl1(cs, "send_data %d blocked", bcs->channel);
  988. }
  989. /***************************************************************/
  990. /* activate/deactivate hardware for selected channels and mode */
  991. /***************************************************************/
  992. void
  993. mode_hfcsx(struct BCState *bcs, int mode, int bc)
  994. {
  995. struct IsdnCardState *cs = bcs->cs;
  996. unsigned long flags;
  997. int fifo2;
  998. if (cs->debug & L1_DEB_HSCX)
  999. debugl1(cs, "HFCSX bchannel mode %d bchan %d/%d",
  1000. mode, bc, bcs->channel);
  1001. bcs->mode = mode;
  1002. bcs->channel = bc;
  1003. fifo2 = bc;
  1004. save_flags(flags);
  1005. cli();
  1006. if (cs->chanlimit > 1) {
  1007. cs->hw.hfcsx.bswapped = 0; /* B1 and B2 normal mode */
  1008. cs->hw.hfcsx.sctrl_e &= ~0x80;
  1009. } else {
  1010. if (bc) {
  1011. if (mode != L1_MODE_NULL) {
  1012. cs->hw.hfcsx.bswapped = 1; /* B1 and B2 exchanged */
  1013. cs->hw.hfcsx.sctrl_e |= 0x80;
  1014. } else {
  1015. cs->hw.hfcsx.bswapped = 0; /* B1 and B2 normal mode */
  1016. cs->hw.hfcsx.sctrl_e &= ~0x80;
  1017. }
  1018. fifo2 = 0;
  1019. } else {
  1020. cs->hw.hfcsx.bswapped = 0; /* B1 and B2 normal mode */
  1021. cs->hw.hfcsx.sctrl_e &= ~0x80;
  1022. }
  1023. }
  1024. switch (mode) {
  1025. case (L1_MODE_NULL):
  1026. if (bc) {
  1027. cs->hw.hfcsx.sctrl &= ~SCTRL_B2_ENA;
  1028. cs->hw.hfcsx.sctrl_r &= ~SCTRL_B2_ENA;
  1029. } else {
  1030. cs->hw.hfcsx.sctrl &= ~SCTRL_B1_ENA;
  1031. cs->hw.hfcsx.sctrl_r &= ~SCTRL_B1_ENA;
  1032. }
  1033. if (fifo2) {
  1034. cs->hw.hfcsx.int_m1 &= ~(HFCSX_INTS_B2TRANS + HFCSX_INTS_B2REC);
  1035. } else {
  1036. cs->hw.hfcsx.int_m1 &= ~(HFCSX_INTS_B1TRANS + HFCSX_INTS_B1REC);
  1037. }
  1038. break;
  1039. case (L1_MODE_TRANS):
  1040. if (bc) {
  1041. cs->hw.hfcsx.sctrl |= SCTRL_B2_ENA;
  1042. cs->hw.hfcsx.sctrl_r |= SCTRL_B2_ENA;
  1043. } else {
  1044. cs->hw.hfcsx.sctrl |= SCTRL_B1_ENA;
  1045. cs->hw.hfcsx.sctrl_r |= SCTRL_B1_ENA;
  1046. }
  1047. if (fifo2) {
  1048. cs->hw.hfcsx.int_m1 |= (HFCSX_INTS_B2TRANS + HFCSX_INTS_B2REC);
  1049. cs->hw.hfcsx.ctmt |= 2;
  1050. cs->hw.hfcsx.conn &= ~0x18;
  1051. } else {
  1052. cs->hw.hfcsx.int_m1 |= (HFCSX_INTS_B1TRANS + HFCSX_INTS_B1REC);
  1053. cs->hw.hfcsx.ctmt |= 1;
  1054. cs->hw.hfcsx.conn &= ~0x03;
  1055. }
  1056. break;
  1057. case (L1_MODE_HDLC):
  1058. if (bc) {
  1059. cs->hw.hfcsx.sctrl |= SCTRL_B2_ENA;
  1060. cs->hw.hfcsx.sctrl_r |= SCTRL_B2_ENA;
  1061. } else {
  1062. cs->hw.hfcsx.sctrl |= SCTRL_B1_ENA;
  1063. cs->hw.hfcsx.sctrl_r |= SCTRL_B1_ENA;
  1064. }
  1065. if (fifo2) {
  1066. cs->hw.hfcsx.int_m1 |= (HFCSX_INTS_B2TRANS + HFCSX_INTS_B2REC);
  1067. cs->hw.hfcsx.ctmt &= ~2;
  1068. cs->hw.hfcsx.conn &= ~0x18;
  1069. } else {
  1070. cs->hw.hfcsx.int_m1 |= (HFCSX_INTS_B1TRANS + HFCSX_INTS_B1REC);
  1071. cs->hw.hfcsx.ctmt &= ~1;
  1072. cs->hw.hfcsx.conn &= ~0x03;
  1073. }
  1074. break;
  1075. case (L1_MODE_EXTRN):
  1076. if (bc) {
  1077. cs->hw.hfcsx.conn |= 0x10;
  1078. cs->hw.hfcsx.sctrl |= SCTRL_B2_ENA;
  1079. cs->hw.hfcsx.sctrl_r |= SCTRL_B2_ENA;
  1080. cs->hw.hfcsx.int_m1 &= ~(HFCSX_INTS_B2TRANS + HFCSX_INTS_B2REC);
  1081. } else {
  1082. cs->hw.hfcsx.conn |= 0x02;
  1083. cs->hw.hfcsx.sctrl |= SCTRL_B1_ENA;
  1084. cs->hw.hfcsx.sctrl_r |= SCTRL_B1_ENA;
  1085. cs->hw.hfcsx.int_m1 &= ~(HFCSX_INTS_B1TRANS + HFCSX_INTS_B1REC);
  1086. }
  1087. break;
  1088. }
  1089. Write_hfc(cs, HFCSX_SCTRL_E, cs->hw.hfcsx.sctrl_e);
  1090. Write_hfc(cs, HFCSX_INT_M1, cs->hw.hfcsx.int_m1);
  1091. Write_hfc(cs, HFCSX_SCTRL, cs->hw.hfcsx.sctrl);
  1092. Write_hfc(cs, HFCSX_SCTRL_R, cs->hw.hfcsx.sctrl_r);
  1093. Write_hfc(cs, HFCSX_CTMT, cs->hw.hfcsx.ctmt);
  1094. Write_hfc(cs, HFCSX_CONNECT, cs->hw.hfcsx.conn);
  1095. if (mode != L1_MODE_EXTRN) {
  1096.   reset_fifo(cs, fifo2 ? HFCSX_SEL_B2_RX : HFCSX_SEL_B1_RX);
  1097.   reset_fifo(cs, fifo2 ? HFCSX_SEL_B2_TX : HFCSX_SEL_B1_TX);
  1098. }
  1099. restore_flags(flags);
  1100. }
  1101. /******************************/
  1102. /* Layer2 -> Layer 1 Transfer */
  1103. /******************************/
  1104. static void
  1105. hfcsx_l2l1(struct PStack *st, int pr, void *arg)
  1106. {
  1107. struct sk_buff *skb = arg;
  1108. long flags;
  1109. switch (pr) {
  1110. case (PH_DATA | REQUEST):
  1111. save_flags(flags);
  1112. cli();
  1113. if (st->l1.bcs->tx_skb) {
  1114. skb_queue_tail(&st->l1.bcs->squeue, skb);
  1115. restore_flags(flags);
  1116. } else {
  1117. st->l1.bcs->tx_skb = skb;
  1118. /*                              test_and_set_bit(BC_FLG_BUSY, &st->l1.bcs->Flag);
  1119.  */ st->l1.bcs->cs->BC_Send_Data(st->l1.bcs);
  1120. restore_flags(flags);
  1121. }
  1122. break;
  1123. case (PH_PULL | INDICATION):
  1124. if (st->l1.bcs->tx_skb) {
  1125. printk(KERN_WARNING "hfc_l2l1: this shouldn't happenn");
  1126. break;
  1127. }
  1128. save_flags(flags);
  1129. cli();
  1130. /*                      test_and_set_bit(BC_FLG_BUSY, &st->l1.bcs->Flag);
  1131.  */ st->l1.bcs->tx_skb = skb;
  1132. st->l1.bcs->cs->BC_Send_Data(st->l1.bcs);
  1133. restore_flags(flags);
  1134. break;
  1135. case (PH_PULL | REQUEST):
  1136. if (!st->l1.bcs->tx_skb) {
  1137. test_and_clear_bit(FLG_L1_PULL_REQ, &st->l1.Flags);
  1138. st->l1.l1l2(st, PH_PULL | CONFIRM, NULL);
  1139. } else
  1140. test_and_set_bit(FLG_L1_PULL_REQ, &st->l1.Flags);
  1141. break;
  1142. case (PH_ACTIVATE | REQUEST):
  1143. test_and_set_bit(BC_FLG_ACTIV, &st->l1.bcs->Flag);
  1144. mode_hfcsx(st->l1.bcs, st->l1.mode, st->l1.bc);
  1145. l1_msg_b(st, pr, arg);
  1146. break;
  1147. case (PH_DEACTIVATE | REQUEST):
  1148. l1_msg_b(st, pr, arg);
  1149. break;
  1150. case (PH_DEACTIVATE | CONFIRM):
  1151. test_and_clear_bit(BC_FLG_ACTIV, &st->l1.bcs->Flag);
  1152. test_and_clear_bit(BC_FLG_BUSY, &st->l1.bcs->Flag);
  1153. mode_hfcsx(st->l1.bcs, 0, st->l1.bc);
  1154. st->l1.l1l2(st, PH_DEACTIVATE | CONFIRM, NULL);
  1155. break;
  1156. }
  1157. }
  1158. /******************************************/
  1159. /* deactivate B-channel access and queues */
  1160. /******************************************/
  1161. static void
  1162. close_hfcsx(struct BCState *bcs)
  1163. {
  1164. mode_hfcsx(bcs, 0, bcs->channel);
  1165. if (test_and_clear_bit(BC_FLG_INIT, &bcs->Flag)) {
  1166. skb_queue_purge(&bcs->rqueue);
  1167. skb_queue_purge(&bcs->squeue);
  1168. if (bcs->tx_skb) {
  1169. dev_kfree_skb_any(bcs->tx_skb);
  1170. bcs->tx_skb = NULL;
  1171. test_and_clear_bit(BC_FLG_BUSY, &bcs->Flag);
  1172. }
  1173. }
  1174. }
  1175. /*************************************/
  1176. /* init B-channel queues and control */
  1177. /*************************************/
  1178. static int
  1179. open_hfcsxstate(struct IsdnCardState *cs, struct BCState *bcs)
  1180. {
  1181. if (!test_and_set_bit(BC_FLG_INIT, &bcs->Flag)) {
  1182. skb_queue_head_init(&bcs->rqueue);
  1183. skb_queue_head_init(&bcs->squeue);
  1184. }
  1185. bcs->tx_skb = NULL;
  1186. test_and_clear_bit(BC_FLG_BUSY, &bcs->Flag);
  1187. bcs->event = 0;
  1188. bcs->tx_cnt = 0;
  1189. return (0);
  1190. }
  1191. /*********************************/
  1192. /* inits the stack for B-channel */
  1193. /*********************************/
  1194. static int
  1195. setstack_2b(struct PStack *st, struct BCState *bcs)
  1196. {
  1197. bcs->channel = st->l1.bc;
  1198. if (open_hfcsxstate(st->l1.hardware, bcs))
  1199. return (-1);
  1200. st->l1.bcs = bcs;
  1201. st->l2.l2l1 = hfcsx_l2l1;
  1202. setstack_manager(st);
  1203. bcs->st = st;
  1204. setstack_l1_B(st);
  1205. return (0);
  1206. }
  1207. /***************************/
  1208. /* handle L1 state changes */
  1209. /***************************/
  1210. static void
  1211. hfcsx_bh(struct IsdnCardState *cs)
  1212. {
  1213. unsigned long flags;
  1214. /*      struct PStack *stptr;
  1215.  */
  1216. if (!cs)
  1217. return;
  1218. if (test_and_clear_bit(D_L1STATECHANGE, &cs->event)) {
  1219. if (!cs->hw.hfcsx.nt_mode)
  1220. switch (cs->dc.hfcsx.ph_state) {
  1221. case (0):
  1222. l1_msg(cs, HW_RESET | INDICATION, NULL);
  1223. break;
  1224. case (3):
  1225. l1_msg(cs, HW_DEACTIVATE | INDICATION, NULL);
  1226. break;
  1227. case (8):
  1228. l1_msg(cs, HW_RSYNC | INDICATION, NULL);
  1229. break;
  1230. case (6):
  1231. l1_msg(cs, HW_INFO2 | INDICATION, NULL);
  1232. break;
  1233. case (7):
  1234. l1_msg(cs, HW_INFO4_P8 | INDICATION, NULL);
  1235. break;
  1236. default:
  1237. break;
  1238. } else {
  1239. switch (cs->dc.hfcsx.ph_state) {
  1240. case (2):
  1241. save_flags(flags);
  1242. cli();
  1243. if (cs->hw.hfcsx.nt_timer < 0) {
  1244. cs->hw.hfcsx.nt_timer = 0;
  1245. cs->hw.hfcsx.int_m1 &= ~HFCSX_INTS_TIMER;
  1246. Write_hfc(cs, HFCSX_INT_M1, cs->hw.hfcsx.int_m1);
  1247. /* Clear already pending ints */
  1248. if (Read_hfc(cs, HFCSX_INT_S1));
  1249. Write_hfc(cs, HFCSX_STATES, 4 | HFCSX_LOAD_STATE);
  1250. udelay(10);
  1251. Write_hfc(cs, HFCSX_STATES, 4);
  1252. cs->dc.hfcsx.ph_state = 4;
  1253. } else {
  1254. cs->hw.hfcsx.int_m1 |= HFCSX_INTS_TIMER;
  1255. Write_hfc(cs, HFCSX_INT_M1, cs->hw.hfcsx.int_m1);
  1256. cs->hw.hfcsx.ctmt &= ~HFCSX_AUTO_TIMER;
  1257. cs->hw.hfcsx.ctmt |= HFCSX_TIM3_125;
  1258. Write_hfc(cs, HFCSX_CTMT, cs->hw.hfcsx.ctmt | HFCSX_CLTIMER);
  1259. Write_hfc(cs, HFCSX_CTMT, cs->hw.hfcsx.ctmt | HFCSX_CLTIMER);
  1260. cs->hw.hfcsx.nt_timer = NT_T1_COUNT;
  1261. Write_hfc(cs, HFCSX_STATES, 2 | HFCSX_NT_G2_G3); /* allow G2 -> G3 transition */
  1262. }
  1263. restore_flags(flags);
  1264. break;
  1265. case (1):
  1266. case (3):
  1267. case (4):
  1268. save_flags(flags);
  1269. cli();
  1270. cs->hw.hfcsx.nt_timer = 0;
  1271. cs->hw.hfcsx.int_m1 &= ~HFCSX_INTS_TIMER;
  1272. Write_hfc(cs, HFCSX_INT_M1, cs->hw.hfcsx.int_m1);
  1273. restore_flags(flags);
  1274. break;
  1275. default:
  1276. break;
  1277. }
  1278. }
  1279. }
  1280. if (test_and_clear_bit(D_RCVBUFREADY, &cs->event))
  1281. DChannel_proc_rcv(cs);
  1282. if (test_and_clear_bit(D_XMTBUFREADY, &cs->event))
  1283. DChannel_proc_xmt(cs);
  1284. }
  1285. /********************************/
  1286. /* called for card init message */
  1287. /********************************/
  1288. void __devinit
  1289. inithfcsx(struct IsdnCardState *cs)
  1290. {
  1291. cs->setstack_d = setstack_hfcsx;
  1292. cs->dbusytimer.function = (void *) hfcsx_dbusy_timer;
  1293. cs->dbusytimer.data = (long) cs;
  1294. init_timer(&cs->dbusytimer);
  1295. cs->tqueue.routine = (void *) (void *) hfcsx_bh;
  1296. cs->BC_Send_Data = &hfcsx_send_data;
  1297. cs->bcs[0].BC_SetStack = setstack_2b;
  1298. cs->bcs[1].BC_SetStack = setstack_2b;
  1299. cs->bcs[0].BC_Close = close_hfcsx;
  1300. cs->bcs[1].BC_Close = close_hfcsx;
  1301. mode_hfcsx(cs->bcs, 0, 0);
  1302. mode_hfcsx(cs->bcs + 1, 0, 1);
  1303. }
  1304. /*******************************************/
  1305. /* handle card messages from control layer */
  1306. /*******************************************/
  1307. static int
  1308. hfcsx_card_msg(struct IsdnCardState *cs, int mt, void *arg)
  1309. {
  1310. long flags;
  1311. if (cs->debug & L1_DEB_ISAC)
  1312. debugl1(cs, "HFCSX: card_msg %x", mt);
  1313. switch (mt) {
  1314. case CARD_RESET:
  1315. reset_hfcsx(cs);
  1316. return (0);
  1317. case CARD_RELEASE:
  1318. release_io_hfcsx(cs);
  1319. return (0);
  1320. case CARD_INIT:
  1321. inithfcsx(cs);
  1322. save_flags(flags);
  1323. sti();
  1324. set_current_state(TASK_UNINTERRUPTIBLE);
  1325. schedule_timeout((80 * HZ) / 1000); /* Timeout 80ms */
  1326. /* now switch timer interrupt off */
  1327. cs->hw.hfcsx.int_m1 &= ~HFCSX_INTS_TIMER;
  1328. Write_hfc(cs, HFCSX_INT_M1, cs->hw.hfcsx.int_m1);
  1329. /* reinit mode reg */
  1330. Write_hfc(cs, HFCSX_MST_MODE, cs->hw.hfcsx.mst_m);
  1331. restore_flags(flags);
  1332. return (0);
  1333. case CARD_TEST:
  1334. return (0);
  1335. }
  1336. return (0);
  1337. }
  1338. #ifdef __ISAPNP__
  1339. static struct isapnp_device_id hfc_ids[] __initdata = {
  1340. { ISAPNP_VENDOR('T', 'A', 'G'), ISAPNP_FUNCTION(0x2620),
  1341.   ISAPNP_VENDOR('T', 'A', 'G'), ISAPNP_FUNCTION(0x2620), 
  1342.   (unsigned long) "Teles 16.3c2" },
  1343. { 0, }
  1344. };
  1345. static struct isapnp_device_id *hdev = &hfc_ids[0];
  1346. static struct pci_bus *pnp_c __devinitdata = NULL;
  1347. #endif
  1348. int __devinit
  1349. setup_hfcsx(struct IsdnCard *card)
  1350. {
  1351. struct IsdnCardState *cs = card->cs;
  1352. char tmp[64];
  1353. unsigned long flags;
  1354. strcpy(tmp, hfcsx_revision);
  1355. printk(KERN_INFO "HiSax: HFC-SX driver Rev. %sn", HiSax_getrev(tmp));
  1356. #ifdef __ISAPNP__
  1357. if (!card->para[1] && isapnp_present()) {
  1358. struct pci_bus *pb;
  1359. struct pci_dev *pd;
  1360. while(hdev->card_vendor) {
  1361. if ((pb = isapnp_find_card(hdev->card_vendor,
  1362. hdev->card_device, pnp_c))) {
  1363. pnp_c = pb;
  1364. pd = NULL;
  1365. if ((pd = isapnp_find_dev(pnp_c,
  1366. hdev->vendor, hdev->function, pd))) {
  1367. printk(KERN_INFO "HiSax: %s detectedn",
  1368. (char *)hdev->driver_data);
  1369. pd->prepare(pd);
  1370. pd->deactivate(pd);
  1371. pd->activate(pd);
  1372. card->para[1] = pd->resource[0].start;
  1373. card->para[0] = pd->irq_resource[0].start;
  1374. if (!card->para[0] || !card->para[1]) {
  1375. printk(KERN_ERR "HFC PnP:some resources are missing %ld/%lxn",
  1376. card->para[0], card->para[1]);
  1377. pd->deactivate(pd);
  1378. return(0);
  1379. }
  1380. break;
  1381. } else {
  1382. printk(KERN_ERR "HFC PnP: PnP error card found, no devicen");
  1383. }
  1384. }
  1385. hdev++;
  1386. pnp_c=NULL;
  1387. if (!hdev->card_vendor) {
  1388. printk(KERN_INFO "HFC PnP: no ISAPnP card foundn");
  1389. return(0);
  1390. }
  1391. }
  1392. #endif
  1393. cs->hw.hfcsx.base = card->para[1] & 0xfffe;
  1394. cs->irq = card->para[0];
  1395. cs->hw.hfcsx.int_s1 = 0;
  1396. cs->dc.hfcsx.ph_state = 0;
  1397. cs->hw.hfcsx.fifo = 255;
  1398. if ((cs->typ == ISDN_CTYPE_HFC_SX) || 
  1399.     (cs->typ == ISDN_CTYPE_HFC_SP_PCMCIA)) {
  1400.         if ((!cs->hw.hfcsx.base) || 
  1401.     check_region((cs->hw.hfcsx.base), 2)) {
  1402.   printk(KERN_WARNING
  1403.  "HiSax: HFC-SX io-base %#lx already in usen",
  1404.           cs->hw.hfcsx.base);
  1405.   return(0);
  1406. } else {
  1407.   request_region(cs->hw.hfcsx.base, 2, "HFCSX isdn");
  1408. }
  1409. byteout(cs->hw.hfcsx.base, cs->hw.hfcsx.base & 0xFF);
  1410. byteout(cs->hw.hfcsx.base + 1,
  1411. ((cs->hw.hfcsx.base >> 8) & 3) | 0x54);
  1412. udelay(10);
  1413.         cs->hw.hfcsx.chip = Read_hfc(cs,HFCSX_CHIP_ID);
  1414.                 switch (cs->hw.hfcsx.chip >> 4) {
  1415.   case 1: 
  1416.     tmp[0] ='+';
  1417.     break;
  1418.   case 9: 
  1419.     tmp[0] ='P';
  1420.     break;
  1421.   default:
  1422.     printk(KERN_WARNING
  1423.    "HFC-SX: invalid chip id 0x%xn",
  1424.    cs->hw.hfcsx.chip >> 4);
  1425.     release_region(cs->hw.hfcsx.base, 2);
  1426.     return(0);
  1427. }  
  1428. if (!ccd_sp_irqtab[cs->irq & 0xF]) {
  1429.   printk(KERN_WARNING 
  1430.  "HFC_SX: invalid irq %d specifiedn",cs->irq & 0xF);
  1431.   release_region(cs->hw.hfcsx.base, 2);
  1432.   return(0);
  1433. }  
  1434. save_flags(flags);
  1435. cli();
  1436. if (!(cs->hw.hfcsx.extra = (void *)
  1437.       kmalloc(sizeof(struct hfcsx_extra), GFP_ATOMIC))) {
  1438.   restore_flags(flags);
  1439.   release_region(cs->hw.hfcsx.base, 2);
  1440.   printk(KERN_WARNING "HFC-SX: unable to allocate memoryn");
  1441.   return(0);
  1442. }
  1443. restore_flags(flags);
  1444. printk(KERN_INFO
  1445.        "HFC-S%c chip detected at base 0x%x IRQ %d HZ %dn",
  1446.        tmp[0], (u_int) cs->hw.hfcsx.base,
  1447.        cs->irq, HZ);
  1448. cs->hw.hfcsx.int_m2 = 0; /* disable alle interrupts */
  1449. cs->hw.hfcsx.int_m1 = 0;
  1450. Write_hfc(cs, HFCSX_INT_M1, cs->hw.hfcsx.int_m1);
  1451. Write_hfc(cs, HFCSX_INT_M2, cs->hw.hfcsx.int_m2);
  1452. } else
  1453. return (0); /* no valid card type */
  1454. cs->readisac = NULL;
  1455. cs->writeisac = NULL;
  1456. cs->readisacfifo = NULL;
  1457. cs->writeisacfifo = NULL;
  1458. cs->BC_Read_Reg = NULL;
  1459. cs->BC_Write_Reg = NULL;
  1460. cs->irq_func = &hfcsx_interrupt;
  1461. cs->hw.hfcsx.timer.function = (void *) hfcsx_Timer;
  1462. cs->hw.hfcsx.timer.data = (long) cs;
  1463. cs->hw.hfcsx.b_fifo_size = 0; /* fifo size still unknown */
  1464. cs->hw.hfcsx.cirm = ccd_sp_irqtab[cs->irq & 0xF]; /* RAM not evaluated */
  1465. init_timer(&cs->hw.hfcsx.timer);
  1466. reset_hfcsx(cs);
  1467. cs->cardmsg = &hfcsx_card_msg;
  1468. cs->auxcmd = &hfcsx_auxcmd;
  1469. return (1);
  1470. }