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

Linux/Unix编程

开发平台:

Unix_Linux

  1. /* $Id: hfc_pci.c,v 1.1.4.1 2001/11/20 14:19:35 kai Exp $
  2.  *
  3.  * low level driver for CCD磗 hfc-pci based cards
  4.  *
  5.  * Author       Werner Cornelius
  6.  *              based on existing driver for CCD hfc ISA cards
  7.  * Copyright    by Werner Cornelius  <werner@isdn4linux.de>
  8.  *              by Karsten Keil      <keil@isdn4linux.de>
  9.  * 
  10.  * This software may be used and distributed according to the terms
  11.  * of the GNU General Public License, incorporated herein by reference.
  12.  *
  13.  * For changes and modifications please read
  14.  * ../../../Documentation/isdn/HiSax.cert
  15.  *
  16.  */
  17. #include <linux/init.h>
  18. #include <linux/config.h>
  19. #define __NO_VERSION__
  20. #include "hisax.h"
  21. #include "hfc_pci.h"
  22. #include "isdnl1.h"
  23. #include <linux/pci.h>
  24. #include <linux/interrupt.h>
  25. extern const char *CardType[];
  26. static const char *hfcpci_revision = "$Revision: 1.1.4.1 $";
  27. /* table entry in the PCI devices list */
  28. typedef struct {
  29. int vendor_id;
  30. int device_id;
  31. char *vendor_name;
  32. char *card_name;
  33. } PCI_ENTRY;
  34. #define NT_T1_COUNT 20 /* number of 3.125ms interrupts for G2 timeout */
  35. #define CLKDEL_TE 0x0e /* CLKDEL in TE mode */
  36. #define CLKDEL_NT 0x6c /* CLKDEL in NT mode */
  37. static const PCI_ENTRY id_list[] =
  38. {
  39. {PCI_VENDOR_ID_CCD, PCI_DEVICE_ID_CCD_2BD0, "CCD/Billion/Asuscom", "2BD0"},
  40. {PCI_VENDOR_ID_CCD, PCI_DEVICE_ID_CCD_B000, "Billion", "B000"},
  41. {PCI_VENDOR_ID_CCD, PCI_DEVICE_ID_CCD_B006, "Billion", "B006"},
  42. {PCI_VENDOR_ID_CCD, PCI_DEVICE_ID_CCD_B007, "Billion", "B007"},
  43. {PCI_VENDOR_ID_CCD, PCI_DEVICE_ID_CCD_B008, "Billion", "B008"},
  44. {PCI_VENDOR_ID_CCD, PCI_DEVICE_ID_CCD_B009, "Billion", "B009"},
  45. {PCI_VENDOR_ID_CCD, PCI_DEVICE_ID_CCD_B00A, "Billion", "B00A"},
  46. {PCI_VENDOR_ID_CCD, PCI_DEVICE_ID_CCD_B00B, "Billion", "B00B"},
  47. {PCI_VENDOR_ID_CCD, PCI_DEVICE_ID_CCD_B00C, "Billion", "B00C"},
  48. {PCI_VENDOR_ID_CCD, PCI_DEVICE_ID_CCD_B100, "Seyeon", "B100"},
  49. {PCI_VENDOR_ID_ABOCOM, PCI_DEVICE_ID_ABOCOM_2BD1, "Abocom/Magitek", "2BD1"},
  50. {PCI_VENDOR_ID_ASUSTEK, PCI_DEVICE_ID_ASUSTEK_0675, "Asuscom/Askey", "675"},
  51. {PCI_VENDOR_ID_BERKOM, PCI_DEVICE_ID_BERKOM_T_CONCEPT, "German telekom", "T-Concept"},
  52. {PCI_VENDOR_ID_BERKOM, PCI_DEVICE_ID_BERKOM_A1T, "German telekom", "A1T"},
  53. {PCI_VENDOR_ID_ANIGMA, PCI_DEVICE_ID_ANIGMA_MC145575, "Motorola MC145575", "MC145575"},
  54. {PCI_VENDOR_ID_ZOLTRIX, PCI_DEVICE_ID_ZOLTRIX_2BD0, "Zoltrix", "2BD0"},
  55. {PCI_VENDOR_ID_DIGI, PCI_DEVICE_ID_DIGI_DF_M_IOM2_E,"Digi International", "Digi DataFire Micro V IOM2 (Europe)"},
  56. {PCI_VENDOR_ID_DIGI, PCI_DEVICE_ID_DIGI_DF_M_E,"Digi International", "Digi DataFire Micro V (Europe)"},
  57. {PCI_VENDOR_ID_DIGI, PCI_DEVICE_ID_DIGI_DF_M_IOM2_A,"Digi International", "Digi DataFire Micro V IOM2 (North America)"},
  58. {PCI_VENDOR_ID_DIGI, PCI_DEVICE_ID_DIGI_DF_M_A,"Digi International", "Digi DataFire Micro V (North America)"},
  59. {0, 0, NULL, NULL},
  60. };
  61. #if CONFIG_PCI
  62. /******************************************/
  63. /* free hardware resources used by driver */
  64. /******************************************/
  65. void
  66. release_io_hfcpci(struct IsdnCardState *cs)
  67. {
  68. unsigned long flags;
  69. printk(KERN_INFO "HiSax: release hfcpci at %pn",
  70. cs->hw.hfcpci.pci_io);
  71. save_flags(flags);
  72. cli();
  73. cs->hw.hfcpci.int_m2 = 0; /* interrupt output off ! */
  74. Write_hfc(cs, HFCPCI_INT_M2, cs->hw.hfcpci.int_m2);
  75. restore_flags(flags);
  76. Write_hfc(cs, HFCPCI_CIRM, HFCPCI_RESET); /* Reset On */
  77. sti();
  78. set_current_state(TASK_UNINTERRUPTIBLE);
  79. schedule_timeout((30 * HZ) / 1000); /* Timeout 30ms */
  80. Write_hfc(cs, HFCPCI_CIRM, 0); /* Reset Off */
  81. pcibios_write_config_word(cs->hw.hfcpci.pci_bus, cs->hw.hfcpci.pci_device_fn, PCI_COMMAND, 0); /* disable memory mapped ports + busmaster */
  82. del_timer(&cs->hw.hfcpci.timer);
  83. kfree(cs->hw.hfcpci.share_start);
  84. cs->hw.hfcpci.share_start = NULL;
  85. iounmap((void *)cs->hw.hfcpci.pci_io);
  86. }
  87. /********************************************************************************/
  88. /* function called to reset the HFC PCI chip. A complete software reset of chip */
  89. /* and fifos is done.                                                           */
  90. /********************************************************************************/
  91. static void
  92. reset_hfcpci(struct IsdnCardState *cs)
  93. {
  94. long flags;
  95. save_flags(flags);
  96. cli();
  97. pcibios_write_config_word(cs->hw.hfcpci.pci_bus, cs->hw.hfcpci.pci_device_fn, PCI_COMMAND, PCI_ENA_MEMIO); /* enable memory mapped ports, disable busmaster */
  98. cs->hw.hfcpci.int_m2 = 0; /* interrupt output off ! */
  99. Write_hfc(cs, HFCPCI_INT_M2, cs->hw.hfcpci.int_m2);
  100. printk(KERN_INFO "HFC_PCI: resetting cardn");
  101. pcibios_write_config_word(cs->hw.hfcpci.pci_bus, cs->hw.hfcpci.pci_device_fn, PCI_COMMAND, PCI_ENA_MEMIO + PCI_ENA_MASTER); /* enable memory ports + busmaster */
  102. Write_hfc(cs, HFCPCI_CIRM, HFCPCI_RESET); /* Reset On */
  103. sti();
  104. set_current_state(TASK_UNINTERRUPTIBLE);
  105. schedule_timeout((30 * HZ) / 1000); /* Timeout 30ms */
  106. Write_hfc(cs, HFCPCI_CIRM, 0); /* Reset Off */
  107. set_current_state(TASK_UNINTERRUPTIBLE);
  108. schedule_timeout((20 * HZ) / 1000); /* Timeout 20ms */
  109. if (Read_hfc(cs, HFCPCI_STATUS) & 2)
  110. printk(KERN_WARNING "HFC-PCI init bit busyn");
  111. cs->hw.hfcpci.fifo_en = 0x30; /* only D fifos enabled */
  112. Write_hfc(cs, HFCPCI_FIFO_EN, cs->hw.hfcpci.fifo_en);
  113. cs->hw.hfcpci.trm = 0 + HFCPCI_BTRANS_THRESMASK; /* no echo connect , threshold */
  114. Write_hfc(cs, HFCPCI_TRM, cs->hw.hfcpci.trm);
  115. Write_hfc(cs, HFCPCI_CLKDEL, CLKDEL_TE); /* ST-Bit delay for TE-Mode */
  116. cs->hw.hfcpci.sctrl_e = HFCPCI_AUTO_AWAKE;
  117. Write_hfc(cs, HFCPCI_SCTRL_E, cs->hw.hfcpci.sctrl_e); /* S/T Auto awake */
  118. cs->hw.hfcpci.bswapped = 0; /* no exchange */
  119. cs->hw.hfcpci.nt_mode = 0; /* we are in TE mode */
  120. cs->hw.hfcpci.ctmt = HFCPCI_TIM3_125 | HFCPCI_AUTO_TIMER;
  121. Write_hfc(cs, HFCPCI_CTMT, cs->hw.hfcpci.ctmt);
  122. cs->hw.hfcpci.int_m1 = HFCPCI_INTS_DTRANS | HFCPCI_INTS_DREC |
  123.     HFCPCI_INTS_L1STATE | HFCPCI_INTS_TIMER;
  124. Write_hfc(cs, HFCPCI_INT_M1, cs->hw.hfcpci.int_m1);
  125. /* Clear already pending ints */
  126. if (Read_hfc(cs, HFCPCI_INT_S1));
  127. Write_hfc(cs, HFCPCI_STATES, HFCPCI_LOAD_STATE | 2); /* HFC ST 2 */
  128. udelay(10);
  129. Write_hfc(cs, HFCPCI_STATES, 2); /* HFC ST 2 */
  130. cs->hw.hfcpci.mst_m = HFCPCI_MASTER; /* HFC Master Mode */
  131. Write_hfc(cs, HFCPCI_MST_MODE, cs->hw.hfcpci.mst_m);
  132. cs->hw.hfcpci.sctrl = 0x40; /* set tx_lo mode, error in datasheet ! */
  133. Write_hfc(cs, HFCPCI_SCTRL, cs->hw.hfcpci.sctrl);
  134. cs->hw.hfcpci.sctrl_r = 0;
  135. Write_hfc(cs, HFCPCI_SCTRL_R, cs->hw.hfcpci.sctrl_r);
  136. /* Init GCI/IOM2 in master mode */
  137. /* Slots 0 and 1 are set for B-chan 1 and 2 */
  138. /* D- and monitor/CI channel are not enabled */
  139. /* STIO1 is used as output for data, B1+B2 from ST->IOM+HFC */
  140. /* STIO2 is used as data input, B1+B2 from IOM->ST */
  141. /* ST B-channel send disabled -> continous 1s */
  142. /* The IOM slots are always enabled */
  143. cs->hw.hfcpci.conn = 0x36; /* set data flow directions */
  144. Write_hfc(cs, HFCPCI_CONNECT, cs->hw.hfcpci.conn);
  145. Write_hfc(cs, HFCPCI_B1_SSL, 0x80); /* B1-Slot 0 STIO1 out enabled */
  146. Write_hfc(cs, HFCPCI_B2_SSL, 0x81); /* B2-Slot 1 STIO1 out enabled */
  147. Write_hfc(cs, HFCPCI_B1_RSL, 0x80); /* B1-Slot 0 STIO2 in enabled */
  148. Write_hfc(cs, HFCPCI_B2_RSL, 0x81); /* B2-Slot 1 STIO2 in enabled */
  149. /* Finally enable IRQ output */
  150. cs->hw.hfcpci.int_m2 = HFCPCI_IRQ_ENABLE;
  151. Write_hfc(cs, HFCPCI_INT_M2, cs->hw.hfcpci.int_m2);
  152. if (Read_hfc(cs, HFCPCI_INT_S2));
  153. restore_flags(flags);
  154. }
  155. /***************************************************/
  156. /* Timer function called when kernel timer expires */
  157. /***************************************************/
  158. static void
  159. hfcpci_Timer(struct IsdnCardState *cs)
  160. {
  161. cs->hw.hfcpci.timer.expires = jiffies + 75;
  162. /* WD RESET */
  163. /*      WriteReg(cs, HFCD_DATA, HFCD_CTMT, cs->hw.hfcpci.ctmt | 0x80);
  164.    add_timer(&cs->hw.hfcpci.timer);
  165.  */
  166. }
  167. /*********************************/
  168. /* schedule a new D-channel task */
  169. /*********************************/
  170. static void
  171. sched_event_D_pci(struct IsdnCardState *cs, int event)
  172. {
  173. test_and_set_bit(event, &cs->event);
  174. queue_task(&cs->tqueue, &tq_immediate);
  175. mark_bh(IMMEDIATE_BH);
  176. }
  177. /*********************************/
  178. /* schedule a new b_channel task */
  179. /*********************************/
  180. static void
  181. hfcpci_sched_event(struct BCState *bcs, int event)
  182. {
  183. bcs->event |= 1 << event;
  184. queue_task(&bcs->tqueue, &tq_immediate);
  185. mark_bh(IMMEDIATE_BH);
  186. }
  187. /************************************************/
  188. /* select a b-channel entry matching and active */
  189. /************************************************/
  190. static
  191. struct BCState *
  192. Sel_BCS(struct IsdnCardState *cs, int channel)
  193. {
  194. if (cs->bcs[0].mode && (cs->bcs[0].channel == channel))
  195. return (&cs->bcs[0]);
  196. else if (cs->bcs[1].mode && (cs->bcs[1].channel == channel))
  197. return (&cs->bcs[1]);
  198. else
  199. return (NULL);
  200. }
  201. /***************************************/
  202. /* clear the desired B-channel rx fifo */
  203. /***************************************/
  204. static void hfcpci_clear_fifo_rx(struct IsdnCardState *cs, int fifo)
  205. {       u_char fifo_state;
  206.         bzfifo_type *bzr;
  207. if (fifo) {
  208.         bzr = &((fifo_area *) (cs->hw.hfcpci.fifos))->b_chans.rxbz_b2;
  209. fifo_state = cs->hw.hfcpci.fifo_en & HFCPCI_FIFOEN_B2RX;
  210. } else {
  211.         bzr = &((fifo_area *) (cs->hw.hfcpci.fifos))->b_chans.rxbz_b1;
  212. fifo_state = cs->hw.hfcpci.fifo_en & HFCPCI_FIFOEN_B1RX;
  213. }
  214. if (fifo_state)
  215.         cs->hw.hfcpci.fifo_en ^= fifo_state;
  216. Write_hfc(cs, HFCPCI_FIFO_EN, cs->hw.hfcpci.fifo_en);
  217. cs->hw.hfcpci.last_bfifo_cnt[fifo] = 0;
  218. bzr->za[MAX_B_FRAMES].z1 = B_FIFO_SIZE + B_SUB_VAL - 1;
  219. bzr->za[MAX_B_FRAMES].z2 = bzr->za[MAX_B_FRAMES].z1;
  220. bzr->f1 = MAX_B_FRAMES;
  221. bzr->f2 = bzr->f1; /* init F pointers to remain constant */
  222. if (fifo_state)
  223.         cs->hw.hfcpci.fifo_en |= fifo_state;
  224. Write_hfc(cs, HFCPCI_FIFO_EN, cs->hw.hfcpci.fifo_en);
  225. }   
  226. /***************************************/
  227. /* clear the desired B-channel tx fifo */
  228. /***************************************/
  229. static void hfcpci_clear_fifo_tx(struct IsdnCardState *cs, int fifo)
  230. {       u_char fifo_state;
  231.         bzfifo_type *bzt;
  232. if (fifo) {
  233.         bzt = &((fifo_area *) (cs->hw.hfcpci.fifos))->b_chans.txbz_b2;
  234. fifo_state = cs->hw.hfcpci.fifo_en & HFCPCI_FIFOEN_B2TX;
  235. } else {
  236.         bzt = &((fifo_area *) (cs->hw.hfcpci.fifos))->b_chans.txbz_b1;
  237. fifo_state = cs->hw.hfcpci.fifo_en & HFCPCI_FIFOEN_B1TX;
  238. }
  239. if (fifo_state)
  240.         cs->hw.hfcpci.fifo_en ^= fifo_state;
  241. Write_hfc(cs, HFCPCI_FIFO_EN, cs->hw.hfcpci.fifo_en);
  242. bzt->za[MAX_B_FRAMES].z1 = B_FIFO_SIZE + B_SUB_VAL - 1;
  243. bzt->za[MAX_B_FRAMES].z2 = bzt->za[MAX_B_FRAMES].z1;
  244. bzt->f1 = MAX_B_FRAMES;
  245. bzt->f2 = bzt->f1; /* init F pointers to remain constant */
  246. if (fifo_state)
  247.         cs->hw.hfcpci.fifo_en |= fifo_state;
  248. Write_hfc(cs, HFCPCI_FIFO_EN, cs->hw.hfcpci.fifo_en);
  249. }   
  250. /*********************************************/
  251. /* read a complete B-frame out of the buffer */
  252. /*********************************************/
  253. static struct sk_buff
  254. *
  255. hfcpci_empty_fifo(struct BCState *bcs, bzfifo_type * bz, u_char * bdata, int count)
  256. {
  257. u_char *ptr, *ptr1, new_f2;
  258. struct sk_buff *skb;
  259. struct IsdnCardState *cs = bcs->cs;
  260. unsigned long flags;
  261. int total, maxlen, new_z2;
  262. z_type *zp;
  263. save_flags(flags);
  264. sti();
  265. if ((cs->debug & L1_DEB_HSCX) && !(cs->debug & L1_DEB_HSCX_FIFO))
  266. debugl1(cs, "hfcpci_empty_fifo");
  267. zp = &bz->za[bz->f2]; /* point to Z-Regs */
  268. new_z2 = zp->z2 + count; /* new position in fifo */
  269. if (new_z2 >= (B_FIFO_SIZE + B_SUB_VAL))
  270. new_z2 -= B_FIFO_SIZE; /* buffer wrap */
  271. new_f2 = (bz->f2 + 1) & MAX_B_FRAMES;
  272. if ((count > HSCX_BUFMAX + 3) || (count < 4) ||
  273.     (*(bdata + (zp->z1 - B_SUB_VAL)))) {
  274. if (cs->debug & L1_DEB_WARN)
  275. debugl1(cs, "hfcpci_empty_fifo: incoming packet invalid length %d or crc", count);
  276. #ifdef ERROR_STATISTIC
  277. bcs->err_inv++;
  278. #endif
  279. bz->za[new_f2].z2 = new_z2;
  280. bz->f2 = new_f2; /* next buffer */
  281. skb = NULL;
  282. } else if (!(skb = dev_alloc_skb(count - 3)))
  283. printk(KERN_WARNING "HFCPCI: receive out of memoryn");
  284. else {
  285. total = count;
  286. count -= 3;
  287. ptr = skb_put(skb, count);
  288. if (zp->z2 + count <= B_FIFO_SIZE + B_SUB_VAL)
  289. maxlen = count; /* complete transfer */
  290. else
  291. maxlen = B_FIFO_SIZE + B_SUB_VAL - zp->z2; /* maximum */
  292. ptr1 = bdata + (zp->z2 - B_SUB_VAL); /* start of data */
  293. memcpy(ptr, ptr1, maxlen); /* copy data */
  294. count -= maxlen;
  295. if (count) { /* rest remaining */
  296. ptr += maxlen;
  297. ptr1 = bdata; /* start of buffer */
  298. memcpy(ptr, ptr1, count); /* rest */
  299. }
  300. bz->za[new_f2].z2 = new_z2;
  301. bz->f2 = new_f2; /* next buffer */
  302. }
  303. restore_flags(flags);
  304. return (skb);
  305. }
  306. /*******************************/
  307. /* D-channel receive procedure */
  308. /*******************************/
  309. static
  310. int
  311. receive_dmsg(struct IsdnCardState *cs)
  312. {
  313. struct sk_buff *skb;
  314. int maxlen;
  315. int rcnt, total;
  316. int count = 5;
  317. u_char *ptr, *ptr1;
  318. dfifo_type *df;
  319. z_type *zp;
  320. df = &((fifo_area *) (cs->hw.hfcpci.fifos))->d_chan.d_rx;
  321. if (test_and_set_bit(FLG_LOCK_ATOMIC, &cs->HW_Flags)) {
  322. debugl1(cs, "rec_dmsg blocked");
  323. return (1);
  324. }
  325. while (((df->f1 & D_FREG_MASK) != (df->f2 & D_FREG_MASK)) && count--) {
  326. zp = &df->za[df->f2 & D_FREG_MASK];
  327. rcnt = zp->z1 - zp->z2;
  328. if (rcnt < 0)
  329. rcnt += D_FIFO_SIZE;
  330. rcnt++;
  331. if (cs->debug & L1_DEB_ISAC)
  332. debugl1(cs, "hfcpci recd f1(%d) f2(%d) z1(%x) z2(%x) cnt(%d)",
  333. df->f1, df->f2, zp->z1, zp->z2, rcnt);
  334. if ((rcnt > MAX_DFRAME_LEN + 3) || (rcnt < 4) ||
  335.     (df->data[zp->z1])) {
  336. if (cs->debug & L1_DEB_WARN)
  337. debugl1(cs, "empty_fifo hfcpci paket inv. len %d or crc %d", rcnt, df->data[zp->z1]);
  338. #ifdef ERROR_STATISTIC
  339. cs->err_rx++;
  340. #endif
  341. df->f2 = ((df->f2 + 1) & MAX_D_FRAMES) | (MAX_D_FRAMES + 1); /* next buffer */
  342. df->za[df->f2 & D_FREG_MASK].z2 = (zp->z2 + rcnt) & (D_FIFO_SIZE - 1);
  343. } else if ((skb = dev_alloc_skb(rcnt - 3))) {
  344. total = rcnt;
  345. rcnt -= 3;
  346. ptr = skb_put(skb, rcnt);
  347. if (zp->z2 + rcnt <= D_FIFO_SIZE)
  348. maxlen = rcnt; /* complete transfer */
  349. else
  350. maxlen = D_FIFO_SIZE - zp->z2; /* maximum */
  351. ptr1 = df->data + zp->z2; /* start of data */
  352. memcpy(ptr, ptr1, maxlen); /* copy data */
  353. rcnt -= maxlen;
  354. if (rcnt) { /* rest remaining */
  355. ptr += maxlen;
  356. ptr1 = df->data; /* start of buffer */
  357. memcpy(ptr, ptr1, rcnt); /* rest */
  358. }
  359. df->f2 = ((df->f2 + 1) & MAX_D_FRAMES) | (MAX_D_FRAMES + 1); /* next buffer */
  360. df->za[df->f2 & D_FREG_MASK].z2 = (zp->z2 + total) & (D_FIFO_SIZE - 1);
  361. skb_queue_tail(&cs->rq, skb);
  362. sched_event_D_pci(cs, D_RCVBUFREADY);
  363. } else
  364. printk(KERN_WARNING "HFC-PCI: D receive out of memoryn");
  365. }
  366. test_and_clear_bit(FLG_LOCK_ATOMIC, &cs->HW_Flags);
  367. return (1);
  368. }
  369. /*******************************************************************************/
  370. /* check for transparent receive data and read max one threshold size if avail */
  371. /*******************************************************************************/
  372. int
  373. hfcpci_empty_fifo_trans(struct BCState *bcs, bzfifo_type * bz, u_char * bdata)
  374. {
  375. unsigned short *z1r, *z2r;
  376. int new_z2, fcnt, maxlen;
  377. struct sk_buff *skb;
  378. u_char *ptr, *ptr1;
  379. z1r = &bz->za[MAX_B_FRAMES].z1; /* pointer to z reg */
  380. z2r = z1r + 1;
  381. if (!(fcnt = *z1r - *z2r))
  382. return (0); /* no data avail */
  383. if (fcnt <= 0)
  384. fcnt += B_FIFO_SIZE; /* bytes actually buffered */
  385. if (fcnt > HFCPCI_BTRANS_THRESHOLD)
  386. fcnt = HFCPCI_BTRANS_THRESHOLD; /* limit size */
  387. new_z2 = *z2r + fcnt; /* new position in fifo */
  388. if (new_z2 >= (B_FIFO_SIZE + B_SUB_VAL))
  389. new_z2 -= B_FIFO_SIZE; /* buffer wrap */
  390. if (!(skb = dev_alloc_skb(fcnt)))
  391. printk(KERN_WARNING "HFCPCI: receive out of memoryn");
  392. else {
  393. ptr = skb_put(skb, fcnt);
  394. if (*z2r + fcnt <= B_FIFO_SIZE + B_SUB_VAL)
  395. maxlen = fcnt; /* complete transfer */
  396. else
  397. maxlen = B_FIFO_SIZE + B_SUB_VAL - *z2r; /* maximum */
  398. ptr1 = bdata + (*z2r - B_SUB_VAL); /* start of data */
  399. memcpy(ptr, ptr1, maxlen); /* copy data */
  400. fcnt -= maxlen;
  401. if (fcnt) { /* rest remaining */
  402. ptr += maxlen;
  403. ptr1 = bdata; /* start of buffer */
  404. memcpy(ptr, ptr1, fcnt); /* rest */
  405. }
  406. cli();
  407. skb_queue_tail(&bcs->rqueue, skb);
  408. sti();
  409. hfcpci_sched_event(bcs, B_RCVBUFREADY);
  410. }
  411. *z2r = new_z2; /* new position */
  412. return (1);
  413. } /* hfcpci_empty_fifo_trans */
  414. /**********************************/
  415. /* B-channel main receive routine */
  416. /**********************************/
  417. void
  418. main_rec_hfcpci(struct BCState *bcs)
  419. {
  420. long flags;
  421. struct IsdnCardState *cs = bcs->cs;
  422. int rcnt, real_fifo;
  423. int receive, count = 5;
  424. struct sk_buff *skb;
  425. bzfifo_type *bz;
  426. u_char *bdata;
  427. z_type *zp;
  428. save_flags(flags);
  429. if ((bcs->channel) && (!cs->hw.hfcpci.bswapped)) {
  430. bz = &((fifo_area *) (cs->hw.hfcpci.fifos))->b_chans.rxbz_b2;
  431. bdata = ((fifo_area *) (cs->hw.hfcpci.fifos))->b_chans.rxdat_b2;
  432. real_fifo = 1;
  433. } else {
  434. bz = &((fifo_area *) (cs->hw.hfcpci.fifos))->b_chans.rxbz_b1;
  435. bdata = ((fifo_area *) (cs->hw.hfcpci.fifos))->b_chans.rxdat_b1;
  436. real_fifo = 0;
  437. }
  438.       Begin:
  439. count--;
  440. cli();
  441. if (test_and_set_bit(FLG_LOCK_ATOMIC, &cs->HW_Flags)) {
  442. debugl1(cs, "rec_data %d blocked", bcs->channel);
  443. restore_flags(flags);
  444. return;
  445. }
  446. sti();
  447. if (bz->f1 != bz->f2) {
  448. if (cs->debug & L1_DEB_HSCX)
  449. debugl1(cs, "hfcpci rec %d f1(%d) f2(%d)",
  450. bcs->channel, bz->f1, bz->f2);
  451. zp = &bz->za[bz->f2];
  452. rcnt = zp->z1 - zp->z2;
  453. if (rcnt < 0)
  454. rcnt += B_FIFO_SIZE;
  455. rcnt++;
  456. if (cs->debug & L1_DEB_HSCX)
  457. debugl1(cs, "hfcpci rec %d z1(%x) z2(%x) cnt(%d)",
  458. bcs->channel, zp->z1, zp->z2, rcnt);
  459. if ((skb = hfcpci_empty_fifo(bcs, bz, bdata, rcnt))) {
  460. cli();
  461. skb_queue_tail(&bcs->rqueue, skb);
  462. sti();
  463. hfcpci_sched_event(bcs, B_RCVBUFREADY);
  464. }
  465. rcnt = bz->f1 - bz->f2;
  466. if (rcnt < 0)
  467. rcnt += MAX_B_FRAMES + 1;
  468. if (cs->hw.hfcpci.last_bfifo_cnt[real_fifo] > rcnt + 1) {
  469.         rcnt = 0;
  470. hfcpci_clear_fifo_rx(cs, real_fifo);
  471. }
  472. cs->hw.hfcpci.last_bfifo_cnt[real_fifo] = rcnt;
  473. if (rcnt > 1)
  474. receive = 1;
  475. else
  476. receive = 0;
  477. } else if (bcs->mode == L1_MODE_TRANS)
  478. receive = hfcpci_empty_fifo_trans(bcs, bz, bdata);
  479. else
  480. receive = 0;
  481. test_and_clear_bit(FLG_LOCK_ATOMIC, &cs->HW_Flags);
  482. if (count && receive)
  483. goto Begin;
  484. restore_flags(flags);
  485. return;
  486. }
  487. /**************************/
  488. /* D-channel send routine */
  489. /**************************/
  490. static void
  491. hfcpci_fill_dfifo(struct IsdnCardState *cs)
  492. {
  493. long flags;
  494. int fcnt;
  495. int count, new_z1, maxlen;
  496. dfifo_type *df;
  497. u_char *src, *dst, new_f1;
  498. if (!cs->tx_skb)
  499. return;
  500. if (cs->tx_skb->len <= 0)
  501. return;
  502. df = &((fifo_area *) (cs->hw.hfcpci.fifos))->d_chan.d_tx;
  503. if (cs->debug & L1_DEB_ISAC)
  504. debugl1(cs, "hfcpci_fill_Dfifo f1(%d) f2(%d) z1(f1)(%x)",
  505. df->f1, df->f2,
  506. df->za[df->f1 & D_FREG_MASK].z1);
  507. fcnt = df->f1 - df->f2; /* frame count actually buffered */
  508. if (fcnt < 0)
  509. fcnt += (MAX_D_FRAMES + 1); /* if wrap around */
  510. if (fcnt > (MAX_D_FRAMES - 1)) {
  511. if (cs->debug & L1_DEB_ISAC)
  512. debugl1(cs, "hfcpci_fill_Dfifo more as 14 frames");
  513. #ifdef ERROR_STATISTIC
  514. cs->err_tx++;
  515. #endif
  516. return;
  517. }
  518. /* now determine free bytes in FIFO buffer */
  519. count = df->za[df->f1 & D_FREG_MASK].z2 - df->za[df->f1 & D_FREG_MASK].z1;
  520. if (count <= 0)
  521. count += D_FIFO_SIZE; /* count now contains available bytes */
  522. if (cs->debug & L1_DEB_ISAC)
  523. debugl1(cs, "hfcpci_fill_Dfifo count(%ld/%d)",
  524. cs->tx_skb->len, count);
  525. if (count < cs->tx_skb->len) {
  526. if (cs->debug & L1_DEB_ISAC)
  527. debugl1(cs, "hfcpci_fill_Dfifo no fifo mem");
  528. return;
  529. }
  530. count = cs->tx_skb->len; /* get frame len */
  531. new_z1 = (df->za[df->f1 & D_FREG_MASK].z1 + count) & (D_FIFO_SIZE - 1);
  532. new_f1 = ((df->f1 + 1) & D_FREG_MASK) | (D_FREG_MASK + 1);
  533. src = cs->tx_skb->data; /* source pointer */
  534. dst = df->data + df->za[df->f1 & D_FREG_MASK].z1;
  535. maxlen = D_FIFO_SIZE - df->za[df->f1 & D_FREG_MASK].z1; /* end fifo */
  536. if (maxlen > count)
  537. maxlen = count; /* limit size */
  538. memcpy(dst, src, maxlen); /* first copy */
  539. count -= maxlen; /* remaining bytes */
  540. if (count) {
  541. dst = df->data; /* start of buffer */
  542. src += maxlen; /* new position */
  543. memcpy(dst, src, count);
  544. }
  545. save_flags(flags);
  546. cli();
  547. df->za[new_f1 & D_FREG_MASK].z1 = new_z1; /* for next buffer */
  548. df->za[df->f1 & D_FREG_MASK].z1 = new_z1; /* new pos actual buffer */
  549. df->f1 = new_f1; /* next frame */
  550. restore_flags(flags);
  551. dev_kfree_skb_any(cs->tx_skb);
  552. cs->tx_skb = NULL;
  553. return;
  554. }
  555. /**************************/
  556. /* B-channel send routine */
  557. /**************************/
  558. static void
  559. hfcpci_fill_fifo(struct BCState *bcs)
  560. {
  561. struct IsdnCardState *cs = bcs->cs;
  562. unsigned long flags;
  563. int maxlen, fcnt;
  564. int count, new_z1;
  565. bzfifo_type *bz;
  566. u_char *bdata;
  567. u_char new_f1, *src, *dst;
  568. unsigned short *z1t, *z2t;
  569. if (!bcs->tx_skb)
  570. return;
  571. if (bcs->tx_skb->len <= 0)
  572. return;
  573. save_flags(flags);
  574. sti();
  575. if ((bcs->channel) && (!cs->hw.hfcpci.bswapped)) {
  576. bz = &((fifo_area *) (cs->hw.hfcpci.fifos))->b_chans.txbz_b2;
  577. bdata = ((fifo_area *) (cs->hw.hfcpci.fifos))->b_chans.txdat_b2;
  578. } else {
  579. bz = &((fifo_area *) (cs->hw.hfcpci.fifos))->b_chans.txbz_b1;
  580. bdata = ((fifo_area *) (cs->hw.hfcpci.fifos))->b_chans.txdat_b1;
  581. }
  582. if (bcs->mode == L1_MODE_TRANS) {
  583. z1t = &bz->za[MAX_B_FRAMES].z1;
  584. z2t = z1t + 1;
  585. if (cs->debug & L1_DEB_HSCX)
  586. debugl1(cs, "hfcpci_fill_fifo_trans %d z1(%x) z2(%x)",
  587. bcs->channel, *z1t, *z2t);
  588. fcnt = *z2t - *z1t;
  589. if (fcnt <= 0)
  590. fcnt += B_FIFO_SIZE; /* fcnt contains available bytes in fifo */
  591. fcnt = B_FIFO_SIZE - fcnt; /* remaining bytes to send */
  592. while ((fcnt < 2 * HFCPCI_BTRANS_THRESHOLD) && (bcs->tx_skb)) {
  593. if (bcs->tx_skb->len < B_FIFO_SIZE - fcnt) {
  594. /* data is suitable for fifo */
  595. count = bcs->tx_skb->len;
  596. new_z1 = *z1t + count; /* new buffer Position */
  597. if (new_z1 >= (B_FIFO_SIZE + B_SUB_VAL))
  598. new_z1 -= B_FIFO_SIZE; /* buffer wrap */
  599. src = bcs->tx_skb->data; /* source pointer */
  600. dst = bdata + (*z1t - B_SUB_VAL);
  601. maxlen = (B_FIFO_SIZE + B_SUB_VAL) - *z1t; /* end of fifo */
  602. if (maxlen > count)
  603. maxlen = count; /* limit size */
  604. memcpy(dst, src, maxlen); /* first copy */
  605. count -= maxlen; /* remaining bytes */
  606. if (count) {
  607. dst = bdata; /* start of buffer */
  608. src += maxlen; /* new position */
  609. memcpy(dst, src, count);
  610. }
  611. bcs->tx_cnt -= bcs->tx_skb->len;
  612. fcnt += bcs->tx_skb->len;
  613. *z1t = new_z1; /* now send data */
  614. } else if (cs->debug & L1_DEB_HSCX)
  615. debugl1(cs, "hfcpci_fill_fifo_trans %d frame length %d discarded",
  616. bcs->channel, bcs->tx_skb->len);
  617. dev_kfree_skb_any(bcs->tx_skb);
  618. cli();
  619. bcs->tx_skb = skb_dequeue(&bcs->squeue); /* fetch next data */
  620. sti();
  621. }
  622. test_and_clear_bit(BC_FLG_BUSY, &bcs->Flag);
  623. restore_flags(flags);
  624. return;
  625. }
  626. if (cs->debug & L1_DEB_HSCX)
  627. debugl1(cs, "hfcpci_fill_fifo_hdlc %d f1(%d) f2(%d) z1(f1)(%x)",
  628. bcs->channel, bz->f1, bz->f2,
  629. bz->za[bz->f1].z1);
  630. fcnt = bz->f1 - bz->f2; /* frame count actually buffered */
  631. if (fcnt < 0)
  632. fcnt += (MAX_B_FRAMES + 1); /* if wrap around */
  633. if (fcnt > (MAX_B_FRAMES - 1)) {
  634. if (cs->debug & L1_DEB_HSCX)
  635. debugl1(cs, "hfcpci_fill_Bfifo more as 14 frames");
  636. restore_flags(flags);
  637. return;
  638. }
  639. /* now determine free bytes in FIFO buffer */
  640. count = bz->za[bz->f1].z2 - bz->za[bz->f1].z1;
  641. if (count <= 0)
  642. count += B_FIFO_SIZE; /* count now contains available bytes */
  643. if (cs->debug & L1_DEB_HSCX)
  644. debugl1(cs, "hfcpci_fill_fifo %d count(%ld/%d),%lx",
  645. bcs->channel, bcs->tx_skb->len,
  646. count, current->state);
  647. if (count < bcs->tx_skb->len) {
  648. if (cs->debug & L1_DEB_HSCX)
  649. debugl1(cs, "hfcpci_fill_fifo no fifo mem");
  650. restore_flags(flags);
  651. return;
  652. }
  653. count = bcs->tx_skb->len; /* get frame len */
  654. new_z1 = bz->za[bz->f1].z1 + count; /* new buffer Position */
  655. if (new_z1 >= (B_FIFO_SIZE + B_SUB_VAL))
  656. new_z1 -= B_FIFO_SIZE; /* buffer wrap */
  657. new_f1 = ((bz->f1 + 1) & MAX_B_FRAMES);
  658. src = bcs->tx_skb->data; /* source pointer */
  659. dst = bdata + (bz->za[bz->f1].z1 - B_SUB_VAL);
  660. maxlen = (B_FIFO_SIZE + B_SUB_VAL) - bz->za[bz->f1].z1; /* end fifo */
  661. if (maxlen > count)
  662. maxlen = count; /* limit size */
  663. memcpy(dst, src, maxlen); /* first copy */
  664. count -= maxlen; /* remaining bytes */
  665. if (count) {
  666. dst = bdata; /* start of buffer */
  667. src += maxlen; /* new position */
  668. memcpy(dst, src, count);
  669. }
  670. bcs->tx_cnt -= bcs->tx_skb->len;
  671. if (bcs->st->lli.l1writewakeup &&
  672.     (PACKET_NOACK != bcs->tx_skb->pkt_type))
  673. bcs->st->lli.l1writewakeup(bcs->st, bcs->tx_skb->len);
  674. cli();
  675. bz->za[new_f1].z1 = new_z1; /* for next buffer */
  676. bz->f1 = new_f1; /* next frame */
  677. restore_flags(flags);
  678. dev_kfree_skb_any(bcs->tx_skb);
  679. bcs->tx_skb = NULL;
  680. test_and_clear_bit(BC_FLG_BUSY, &bcs->Flag);
  681. return;
  682. }
  683. /**********************************************/
  684. /* D-channel l1 state call for leased NT-mode */
  685. /**********************************************/
  686. static void
  687. dch_nt_l2l1(struct PStack *st, int pr, void *arg)
  688. {
  689. struct IsdnCardState *cs = (struct IsdnCardState *) st->l1.hardware;
  690. switch (pr) {
  691. case (PH_DATA | REQUEST):
  692. case (PH_PULL | REQUEST):
  693. case (PH_PULL | INDICATION):
  694. st->l1.l1hw(st, pr, arg);
  695. break;
  696. case (PH_ACTIVATE | REQUEST):
  697. st->l1.l1l2(st, PH_ACTIVATE | CONFIRM, NULL);
  698. break;
  699. case (PH_TESTLOOP | REQUEST):
  700. if (1 & (long) arg)
  701. debugl1(cs, "PH_TEST_LOOP B1");
  702. if (2 & (long) arg)
  703. debugl1(cs, "PH_TEST_LOOP B2");
  704. if (!(3 & (long) arg))
  705. debugl1(cs, "PH_TEST_LOOP DISABLED");
  706. st->l1.l1hw(st, HW_TESTLOOP | REQUEST, arg);
  707. break;
  708. default:
  709. if (cs->debug)
  710. debugl1(cs, "dch_nt_l2l1 msg %04X unhandled", pr);
  711. break;
  712. }
  713. }
  714. /***********************/
  715. /* set/reset echo mode */
  716. /***********************/
  717. static int
  718. hfcpci_auxcmd(struct IsdnCardState *cs, isdn_ctrl * ic)
  719. {
  720. unsigned long flags;
  721. int i = *(unsigned int *) ic->parm.num;
  722. if ((ic->arg == 98) &&
  723.     (!(cs->hw.hfcpci.int_m1 & (HFCPCI_INTS_B2TRANS + HFCPCI_INTS_B2REC + HFCPCI_INTS_B1TRANS + HFCPCI_INTS_B1REC)))) {
  724. save_flags(flags);
  725. cli();
  726. Write_hfc(cs, HFCPCI_CLKDEL, CLKDEL_NT); /* ST-Bit delay for NT-Mode */
  727. Write_hfc(cs, HFCPCI_STATES, HFCPCI_LOAD_STATE | 0); /* HFC ST G0 */
  728. udelay(10);
  729. cs->hw.hfcpci.sctrl |= SCTRL_MODE_NT;
  730. Write_hfc(cs, HFCPCI_SCTRL, cs->hw.hfcpci.sctrl); /* set NT-mode */
  731. udelay(10);
  732. Write_hfc(cs, HFCPCI_STATES, HFCPCI_LOAD_STATE | 1); /* HFC ST G1 */
  733. udelay(10);
  734. Write_hfc(cs, HFCPCI_STATES, 1 | HFCPCI_ACTIVATE | HFCPCI_DO_ACTION);
  735. cs->dc.hfcpci.ph_state = 1;
  736. cs->hw.hfcpci.nt_mode = 1;
  737. cs->hw.hfcpci.nt_timer = 0;
  738. cs->stlist->l2.l2l1 = dch_nt_l2l1;
  739. restore_flags(flags);
  740. debugl1(cs, "NT mode activated");
  741. return (0);
  742. }
  743. if ((cs->chanlimit > 1) || (cs->hw.hfcpci.bswapped) ||
  744.     (cs->hw.hfcpci.nt_mode) || (ic->arg != 12))
  745. return (-EINVAL);
  746. save_flags(flags);
  747. cli();
  748. if (i) {
  749. cs->logecho = 1;
  750. cs->hw.hfcpci.trm |= 0x20; /* enable echo chan */
  751. cs->hw.hfcpci.int_m1 |= HFCPCI_INTS_B2REC;
  752. cs->hw.hfcpci.fifo_en |= HFCPCI_FIFOEN_B2RX;
  753. } else {
  754. cs->logecho = 0;
  755. cs->hw.hfcpci.trm &= ~0x20; /* disable echo chan */
  756. cs->hw.hfcpci.int_m1 &= ~HFCPCI_INTS_B2REC;
  757. cs->hw.hfcpci.fifo_en &= ~HFCPCI_FIFOEN_B2RX;
  758. }
  759. cs->hw.hfcpci.sctrl_r &= ~SCTRL_B2_ENA;
  760. cs->hw.hfcpci.sctrl &= ~SCTRL_B2_ENA;
  761. cs->hw.hfcpci.conn |= 0x10; /* B2-IOM -> B2-ST */
  762. cs->hw.hfcpci.ctmt &= ~2;
  763. Write_hfc(cs, HFCPCI_CTMT, cs->hw.hfcpci.ctmt);
  764. Write_hfc(cs, HFCPCI_SCTRL_R, cs->hw.hfcpci.sctrl_r);
  765. Write_hfc(cs, HFCPCI_SCTRL, cs->hw.hfcpci.sctrl);
  766. Write_hfc(cs, HFCPCI_CONNECT, cs->hw.hfcpci.conn);
  767. Write_hfc(cs, HFCPCI_TRM, cs->hw.hfcpci.trm);
  768. Write_hfc(cs, HFCPCI_FIFO_EN, cs->hw.hfcpci.fifo_en);
  769. Write_hfc(cs, HFCPCI_INT_M1, cs->hw.hfcpci.int_m1);
  770. restore_flags(flags);
  771. return (0);
  772. } /* hfcpci_auxcmd */
  773. /*****************************/
  774. /* E-channel receive routine */
  775. /*****************************/
  776. static void
  777. receive_emsg(struct IsdnCardState *cs)
  778. {
  779. long flags;
  780. int rcnt;
  781. int receive, count = 5;
  782. bzfifo_type *bz;
  783. u_char *bdata;
  784. z_type *zp;
  785. u_char *ptr, *ptr1, new_f2;
  786. int total, maxlen, new_z2;
  787. u_char e_buffer[256];
  788. save_flags(flags);
  789. bz = &((fifo_area *) (cs->hw.hfcpci.fifos))->b_chans.rxbz_b2;
  790. bdata = ((fifo_area *) (cs->hw.hfcpci.fifos))->b_chans.rxdat_b2;
  791.       Begin:
  792. count--;
  793. cli();
  794. if (test_and_set_bit(FLG_LOCK_ATOMIC, &cs->HW_Flags)) {
  795. debugl1(cs, "echo_rec_data blocked");
  796. restore_flags(flags);
  797. return;
  798. }
  799. sti();
  800. if (bz->f1 != bz->f2) {
  801. if (cs->debug & L1_DEB_ISAC)
  802. debugl1(cs, "hfcpci e_rec f1(%d) f2(%d)",
  803. bz->f1, bz->f2);
  804. zp = &bz->za[bz->f2];
  805. rcnt = zp->z1 - zp->z2;
  806. if (rcnt < 0)
  807. rcnt += B_FIFO_SIZE;
  808. rcnt++;
  809. if (cs->debug & L1_DEB_ISAC)
  810. debugl1(cs, "hfcpci e_rec z1(%x) z2(%x) cnt(%d)",
  811. zp->z1, zp->z2, rcnt);
  812. new_z2 = zp->z2 + rcnt; /* new position in fifo */
  813. if (new_z2 >= (B_FIFO_SIZE + B_SUB_VAL))
  814. new_z2 -= B_FIFO_SIZE; /* buffer wrap */
  815. new_f2 = (bz->f2 + 1) & MAX_B_FRAMES;
  816. if ((rcnt > 256 + 3) || (count < 4) ||
  817.     (*(bdata + (zp->z1 - B_SUB_VAL)))) {
  818. if (cs->debug & L1_DEB_WARN)
  819. debugl1(cs, "hfcpci_empty_echan: incoming packet invalid length %d or crc", rcnt);
  820. bz->za[new_f2].z2 = new_z2;
  821. bz->f2 = new_f2; /* next buffer */
  822. } else {
  823. total = rcnt;
  824. rcnt -= 3;
  825. ptr = e_buffer;
  826. if (zp->z2 <= B_FIFO_SIZE + B_SUB_VAL)
  827. maxlen = rcnt; /* complete transfer */
  828. else
  829. maxlen = B_FIFO_SIZE + B_SUB_VAL - zp->z2; /* maximum */
  830. ptr1 = bdata + (zp->z2 - B_SUB_VAL); /* start of data */
  831. memcpy(ptr, ptr1, maxlen); /* copy data */
  832. rcnt -= maxlen;
  833. if (rcnt) { /* rest remaining */
  834. ptr += maxlen;
  835. ptr1 = bdata; /* start of buffer */
  836. memcpy(ptr, ptr1, rcnt); /* rest */
  837. }
  838. bz->za[new_f2].z2 = new_z2;
  839. bz->f2 = new_f2; /* next buffer */
  840. if (cs->debug & DEB_DLOG_HEX) {
  841. ptr = cs->dlog;
  842. if ((total - 3) < MAX_DLOG_SPACE / 3 - 10) {
  843. *ptr++ = 'E';
  844. *ptr++ = 'C';
  845. *ptr++ = 'H';
  846. *ptr++ = 'O';
  847. *ptr++ = ':';
  848. ptr += QuickHex(ptr, e_buffer, total - 3);
  849. ptr--;
  850. *ptr++ = 'n';
  851. *ptr = 0;
  852. HiSax_putstatus(cs, NULL, cs->dlog);
  853. } else
  854. HiSax_putstatus(cs, "LogEcho: ", "warning Frame too big (%d)", total - 3);
  855. }
  856. }
  857. rcnt = bz->f1 - bz->f2;
  858. if (rcnt < 0)
  859. rcnt += MAX_B_FRAMES + 1;
  860. if (rcnt > 1)
  861. receive = 1;
  862. else
  863. receive = 0;
  864. } else
  865. receive = 0;
  866. test_and_clear_bit(FLG_LOCK_ATOMIC, &cs->HW_Flags);
  867. if (count && receive)
  868. goto Begin;
  869. restore_flags(flags);
  870. return;
  871. } /* receive_emsg */
  872. /*********************/
  873. /* Interrupt handler */
  874. /*********************/
  875. static void
  876. hfcpci_interrupt(int intno, void *dev_id, struct pt_regs *regs)
  877. {
  878. struct IsdnCardState *cs = dev_id;
  879. u_char exval;
  880. struct BCState *bcs;
  881. int count = 15;
  882. long flags;
  883. u_char val, stat;
  884. if (!cs) {
  885. printk(KERN_WARNING "HFC-PCI: Spurious interrupt!n");
  886. return;
  887. }
  888. if (!(cs->hw.hfcpci.int_m2 & 0x08))
  889. return; /* not initialised */
  890. if (HFCPCI_ANYINT & (stat = Read_hfc(cs, HFCPCI_STATUS))) {
  891. val = Read_hfc(cs, HFCPCI_INT_S1);
  892. if (cs->debug & L1_DEB_ISAC)
  893. debugl1(cs, "HFC-PCI: stat(%02x) s1(%02x)", stat, val);
  894. } else
  895. return;
  896. if (cs->debug & L1_DEB_ISAC)
  897. debugl1(cs, "HFC-PCI irq %x %s", val,
  898. test_bit(FLG_LOCK_ATOMIC, &cs->HW_Flags) ?
  899. "locked" : "unlocked");
  900. val &= cs->hw.hfcpci.int_m1;
  901. if (val & 0x40) { /* state machine irq */
  902. exval = Read_hfc(cs, HFCPCI_STATES) & 0xf;
  903. if (cs->debug & L1_DEB_ISAC)
  904. debugl1(cs, "ph_state chg %d->%d", cs->dc.hfcpci.ph_state,
  905. exval);
  906. cs->dc.hfcpci.ph_state = exval;
  907. sched_event_D_pci(cs, D_L1STATECHANGE);
  908. val &= ~0x40;
  909. }
  910. if (val & 0x80) { /* timer irq */
  911. if (cs->hw.hfcpci.nt_mode) {
  912. if ((--cs->hw.hfcpci.nt_timer) < 0)
  913. sched_event_D_pci(cs, D_L1STATECHANGE);
  914. }
  915. val &= ~0x80;
  916. Write_hfc(cs, HFCPCI_CTMT, cs->hw.hfcpci.ctmt | HFCPCI_CLTIMER);
  917. }
  918. while (val) {
  919. save_flags(flags);
  920. cli();
  921. if (test_bit(FLG_LOCK_ATOMIC, &cs->HW_Flags)) {
  922. cs->hw.hfcpci.int_s1 |= val;
  923. restore_flags(flags);
  924. return;
  925. }
  926. if (cs->hw.hfcpci.int_s1 & 0x18) {
  927. exval = val;
  928. val = cs->hw.hfcpci.int_s1;
  929. cs->hw.hfcpci.int_s1 = exval;
  930. }
  931. if (val & 0x08) {
  932. if (!(bcs = Sel_BCS(cs, cs->hw.hfcpci.bswapped ? 1 : 0))) {
  933. if (cs->debug)
  934. debugl1(cs, "hfcpci spurious 0x08 IRQ");
  935. } else
  936. main_rec_hfcpci(bcs);
  937. }
  938. if (val & 0x10) {
  939. if (cs->logecho)
  940. receive_emsg(cs);
  941. else if (!(bcs = Sel_BCS(cs, 1))) {
  942. if (cs->debug)
  943. debugl1(cs, "hfcpci spurious 0x10 IRQ");
  944. } else
  945. main_rec_hfcpci(bcs);
  946. }
  947. if (val & 0x01) {
  948. if (!(bcs = Sel_BCS(cs, cs->hw.hfcpci.bswapped ? 1 : 0))) {
  949. if (cs->debug)
  950. debugl1(cs, "hfcpci spurious 0x01 IRQ");
  951. } else {
  952. if (bcs->tx_skb) {
  953. if (!test_and_set_bit(FLG_LOCK_ATOMIC, &cs->HW_Flags)) {
  954. hfcpci_fill_fifo(bcs);
  955. test_and_clear_bit(FLG_LOCK_ATOMIC, &cs->HW_Flags);
  956. } else
  957. debugl1(cs, "fill_data %d blocked", bcs->channel);
  958. } else {
  959. if ((bcs->tx_skb = skb_dequeue(&bcs->squeue))) {
  960. if (!test_and_set_bit(FLG_LOCK_ATOMIC, &cs->HW_Flags)) {
  961. hfcpci_fill_fifo(bcs);
  962. test_and_clear_bit(FLG_LOCK_ATOMIC, &cs->HW_Flags);
  963. } else
  964. debugl1(cs, "fill_data %d blocked", bcs->channel);
  965. } else {
  966. hfcpci_sched_event(bcs, B_XMTBUFREADY);
  967. }
  968. }
  969. }
  970. }
  971. if (val & 0x02) {
  972. if (!(bcs = Sel_BCS(cs, 1))) {
  973. if (cs->debug)
  974. debugl1(cs, "hfcpci spurious 0x02 IRQ");
  975. } else {
  976. if (bcs->tx_skb) {
  977. if (!test_and_set_bit(FLG_LOCK_ATOMIC, &cs->HW_Flags)) {
  978. hfcpci_fill_fifo(bcs);
  979. test_and_clear_bit(FLG_LOCK_ATOMIC, &cs->HW_Flags);
  980. } else
  981. debugl1(cs, "fill_data %d blocked", bcs->channel);
  982. } else {
  983. if ((bcs->tx_skb = skb_dequeue(&bcs->squeue))) {
  984. if (!test_and_set_bit(FLG_LOCK_ATOMIC, &cs->HW_Flags)) {
  985. hfcpci_fill_fifo(bcs);
  986. test_and_clear_bit(FLG_LOCK_ATOMIC, &cs->HW_Flags);
  987. } else
  988. debugl1(cs, "fill_data %d blocked", bcs->channel);
  989. } else {
  990. hfcpci_sched_event(bcs, B_XMTBUFREADY);
  991. }
  992. }
  993. }
  994. }
  995. if (val & 0x20) { /* receive dframe */
  996. receive_dmsg(cs);
  997. }
  998. if (val & 0x04) { /* dframe transmitted */
  999. if (test_and_clear_bit(FLG_DBUSY_TIMER, &cs->HW_Flags))
  1000. del_timer(&cs->dbusytimer);
  1001. if (test_and_clear_bit(FLG_L1_DBUSY, &cs->HW_Flags))
  1002. sched_event_D_pci(cs, D_CLEARBUSY);
  1003. if (cs->tx_skb) {
  1004. if (cs->tx_skb->len) {
  1005. if (!test_and_set_bit(FLG_LOCK_ATOMIC, &cs->HW_Flags)) {
  1006. hfcpci_fill_dfifo(cs);
  1007. test_and_clear_bit(FLG_LOCK_ATOMIC, &cs->HW_Flags);
  1008. } else {
  1009. debugl1(cs, "hfcpci_fill_dfifo irq blocked");
  1010. }
  1011. goto afterXPR;
  1012. } else {
  1013. dev_kfree_skb_irq(cs->tx_skb);
  1014. cs->tx_cnt = 0;
  1015. cs->tx_skb = NULL;
  1016. }
  1017. }
  1018. if ((cs->tx_skb = skb_dequeue(&cs->sq))) {
  1019. cs->tx_cnt = 0;
  1020. if (!test_and_set_bit(FLG_LOCK_ATOMIC, &cs->HW_Flags)) {
  1021. hfcpci_fill_dfifo(cs);
  1022. test_and_clear_bit(FLG_LOCK_ATOMIC, &cs->HW_Flags);
  1023. } else {
  1024. debugl1(cs, "hfcpci_fill_dfifo irq blocked");
  1025. }
  1026. } else
  1027. sched_event_D_pci(cs, D_XMTBUFREADY);
  1028. }
  1029.       afterXPR:
  1030. if (cs->hw.hfcpci.int_s1 && count--) {
  1031. val = cs->hw.hfcpci.int_s1;
  1032. cs->hw.hfcpci.int_s1 = 0;
  1033. if (cs->debug & L1_DEB_ISAC)
  1034. debugl1(cs, "HFC-PCI irq %x loop %d", val, 15 - count);
  1035. } else
  1036. val = 0;
  1037. restore_flags(flags);
  1038. }
  1039. }
  1040. /********************************************************************/
  1041. /* timer callback for D-chan busy resolution. Currently no function */
  1042. /********************************************************************/
  1043. static void
  1044. hfcpci_dbusy_timer(struct IsdnCardState *cs)
  1045. {
  1046. }
  1047. /*************************************/
  1048. /* Layer 1 D-channel hardware access */
  1049. /*************************************/
  1050. static void
  1051. HFCPCI_l1hw(struct PStack *st, int pr, void *arg)
  1052. {
  1053. struct IsdnCardState *cs = (struct IsdnCardState *) st->l1.hardware;
  1054. struct sk_buff *skb = arg;
  1055. unsigned long flags;
  1056. switch (pr) {
  1057. case (PH_DATA | REQUEST):
  1058. if (cs->debug & DEB_DLOG_HEX)
  1059. LogFrame(cs, skb->data, skb->len);
  1060. if (cs->debug & DEB_DLOG_VERBOSE)
  1061. dlogframe(cs, skb, 0);
  1062. if (cs->tx_skb) {
  1063. skb_queue_tail(&cs->sq, skb);
  1064. #ifdef L2FRAME_DEBUG /* psa */
  1065. if (cs->debug & L1_DEB_LAPD)
  1066. Logl2Frame(cs, skb, "PH_DATA Queued", 0);
  1067. #endif
  1068. } else {
  1069. cs->tx_skb = skb;
  1070. cs->tx_cnt = 0;
  1071. #ifdef L2FRAME_DEBUG /* psa */
  1072. if (cs->debug & L1_DEB_LAPD)
  1073. Logl2Frame(cs, skb, "PH_DATA", 0);
  1074. #endif
  1075. if (!test_and_set_bit(FLG_LOCK_ATOMIC, &cs->HW_Flags)) {
  1076. hfcpci_fill_dfifo(cs);
  1077. test_and_clear_bit(FLG_LOCK_ATOMIC, &cs->HW_Flags);
  1078. } else
  1079. debugl1(cs, "hfcpci_fill_dfifo blocked");
  1080. }
  1081. break;
  1082. case (PH_PULL | INDICATION):
  1083. if (cs->tx_skb) {
  1084. if (cs->debug & L1_DEB_WARN)
  1085. debugl1(cs, " l2l1 tx_skb exist this shouldn't happen");
  1086. skb_queue_tail(&cs->sq, skb);
  1087. break;
  1088. }
  1089. if (cs->debug & DEB_DLOG_HEX)
  1090. LogFrame(cs, skb->data, skb->len);
  1091. if (cs->debug & DEB_DLOG_VERBOSE)
  1092. dlogframe(cs, skb, 0);
  1093. cs->tx_skb = skb;
  1094. cs->tx_cnt = 0;
  1095. #ifdef L2FRAME_DEBUG /* psa */
  1096. if (cs->debug & L1_DEB_LAPD)
  1097. Logl2Frame(cs, skb, "PH_DATA_PULLED", 0);
  1098. #endif
  1099. if (!test_and_set_bit(FLG_LOCK_ATOMIC, &cs->HW_Flags)) {
  1100. hfcpci_fill_dfifo(cs);
  1101. test_and_clear_bit(FLG_LOCK_ATOMIC, &cs->HW_Flags);
  1102. } else
  1103. debugl1(cs, "hfcpci_fill_dfifo blocked");
  1104. break;
  1105. case (PH_PULL | REQUEST):
  1106. #ifdef L2FRAME_DEBUG /* psa */
  1107. if (cs->debug & L1_DEB_LAPD)
  1108. debugl1(cs, "-> PH_REQUEST_PULL");
  1109. #endif
  1110. if (!cs->tx_skb) {
  1111. test_and_clear_bit(FLG_L1_PULL_REQ, &st->l1.Flags);
  1112. st->l1.l1l2(st, PH_PULL | CONFIRM, NULL);
  1113. } else
  1114. test_and_set_bit(FLG_L1_PULL_REQ, &st->l1.Flags);
  1115. break;
  1116. case (HW_RESET | REQUEST):
  1117. Write_hfc(cs, HFCPCI_STATES, HFCPCI_LOAD_STATE | 3); /* HFC ST 3 */
  1118. udelay(6);
  1119. Write_hfc(cs, HFCPCI_STATES, 3); /* HFC ST 2 */
  1120. cs->hw.hfcpci.mst_m |= HFCPCI_MASTER;
  1121. Write_hfc(cs, HFCPCI_MST_MODE, cs->hw.hfcpci.mst_m);
  1122. Write_hfc(cs, HFCPCI_STATES, HFCPCI_ACTIVATE | HFCPCI_DO_ACTION);
  1123. l1_msg(cs, HW_POWERUP | CONFIRM, NULL);
  1124. break;
  1125. case (HW_ENABLE | REQUEST):
  1126. Write_hfc(cs, HFCPCI_STATES, HFCPCI_DO_ACTION);
  1127. break;
  1128. case (HW_DEACTIVATE | REQUEST):
  1129. cs->hw.hfcpci.mst_m &= ~HFCPCI_MASTER;
  1130. Write_hfc(cs, HFCPCI_MST_MODE, cs->hw.hfcpci.mst_m);
  1131. break;
  1132. case (HW_INFO3 | REQUEST):
  1133. cs->hw.hfcpci.mst_m |= HFCPCI_MASTER;
  1134. Write_hfc(cs, HFCPCI_MST_MODE, cs->hw.hfcpci.mst_m);
  1135. break;
  1136. case (HW_TESTLOOP | REQUEST):
  1137. switch ((int) arg) {
  1138. case (1):
  1139. Write_hfc(cs, HFCPCI_B1_SSL, 0x80); /* tx slot */
  1140. Write_hfc(cs, HFCPCI_B1_RSL, 0x80); /* rx slot */
  1141. save_flags(flags);
  1142. cli();
  1143. cs->hw.hfcpci.conn = (cs->hw.hfcpci.conn & ~7) | 1;
  1144. Write_hfc(cs, HFCPCI_CONNECT, cs->hw.hfcpci.conn);
  1145. restore_flags(flags);
  1146. break;
  1147. case (2):
  1148. Write_hfc(cs, HFCPCI_B2_SSL, 0x81); /* tx slot */
  1149. Write_hfc(cs, HFCPCI_B2_RSL, 0x81); /* rx slot */
  1150. save_flags(flags);
  1151. cli();
  1152. cs->hw.hfcpci.conn = (cs->hw.hfcpci.conn & ~0x38) | 0x08;
  1153. Write_hfc(cs, HFCPCI_CONNECT, cs->hw.hfcpci.conn);
  1154. restore_flags(flags);
  1155. break;
  1156. default:
  1157. if (cs->debug & L1_DEB_WARN)
  1158. debugl1(cs, "hfcpci_l1hw loop invalid %4x", (int) arg);
  1159. return;
  1160. }
  1161. save_flags(flags);
  1162. cli();
  1163. cs->hw.hfcpci.trm |= 0x80; /* enable IOM-loop */
  1164. Write_hfc(cs, HFCPCI_TRM, cs->hw.hfcpci.trm);
  1165. restore_flags(flags);
  1166. break;
  1167. default:
  1168. if (cs->debug & L1_DEB_WARN)
  1169. debugl1(cs, "hfcpci_l1hw unknown pr %4x", pr);
  1170. break;
  1171. }
  1172. }
  1173. /***********************************************/
  1174. /* called during init setting l1 stack pointer */
  1175. /***********************************************/
  1176. void
  1177. setstack_hfcpci(struct PStack *st, struct IsdnCardState *cs)
  1178. {
  1179. st->l1.l1hw = HFCPCI_l1hw;
  1180. }
  1181. /**************************************/
  1182. /* send B-channel data if not blocked */
  1183. /**************************************/
  1184. static void
  1185. hfcpci_send_data(struct BCState *bcs)
  1186. {
  1187. struct IsdnCardState *cs = bcs->cs;
  1188. if (!test_and_set_bit(FLG_LOCK_ATOMIC, &cs->HW_Flags)) {
  1189. hfcpci_fill_fifo(bcs);
  1190. test_and_clear_bit(FLG_LOCK_ATOMIC, &cs->HW_Flags);
  1191. } else
  1192. debugl1(cs, "send_data %d blocked", bcs->channel);
  1193. }
  1194. /***************************************************************/
  1195. /* activate/deactivate hardware for selected channels and mode */
  1196. /***************************************************************/
  1197. void
  1198. mode_hfcpci(struct BCState *bcs, int mode, int bc)
  1199. {
  1200. struct IsdnCardState *cs = bcs->cs;
  1201. unsigned long flags;
  1202. int fifo2;
  1203. if (cs->debug & L1_DEB_HSCX)
  1204. debugl1(cs, "HFCPCI bchannel mode %d bchan %d/%d",
  1205. mode, bc, bcs->channel);
  1206. bcs->mode = mode;
  1207. bcs->channel = bc;
  1208. fifo2 = bc;
  1209. save_flags(flags);
  1210. cli();
  1211. if (cs->chanlimit > 1) {
  1212. cs->hw.hfcpci.bswapped = 0; /* B1 and B2 normal mode */
  1213. cs->hw.hfcpci.sctrl_e &= ~0x80;
  1214. } else {
  1215. if (bc) {
  1216. if (mode != L1_MODE_NULL) {
  1217. cs->hw.hfcpci.bswapped = 1; /* B1 and B2 exchanged */
  1218. cs->hw.hfcpci.sctrl_e |= 0x80;
  1219. } else {
  1220. cs->hw.hfcpci.bswapped = 0; /* B1 and B2 normal mode */
  1221. cs->hw.hfcpci.sctrl_e &= ~0x80;
  1222. }
  1223. fifo2 = 0;
  1224. } else {
  1225. cs->hw.hfcpci.bswapped = 0; /* B1 and B2 normal mode */
  1226. cs->hw.hfcpci.sctrl_e &= ~0x80;
  1227. }
  1228. }
  1229. switch (mode) {
  1230. case (L1_MODE_NULL):
  1231. if (bc) {
  1232. cs->hw.hfcpci.sctrl &= ~SCTRL_B2_ENA;
  1233. cs->hw.hfcpci.sctrl_r &= ~SCTRL_B2_ENA;
  1234. } else {
  1235. cs->hw.hfcpci.sctrl &= ~SCTRL_B1_ENA;
  1236. cs->hw.hfcpci.sctrl_r &= ~SCTRL_B1_ENA;
  1237. }
  1238. if (fifo2) {
  1239. cs->hw.hfcpci.fifo_en &= ~HFCPCI_FIFOEN_B2;
  1240. cs->hw.hfcpci.int_m1 &= ~(HFCPCI_INTS_B2TRANS + HFCPCI_INTS_B2REC);
  1241. } else {
  1242. cs->hw.hfcpci.fifo_en &= ~HFCPCI_FIFOEN_B1;
  1243. cs->hw.hfcpci.int_m1 &= ~(HFCPCI_INTS_B1TRANS + HFCPCI_INTS_B1REC);
  1244. }
  1245. break;
  1246. case (L1_MODE_TRANS):
  1247.         hfcpci_clear_fifo_rx(cs, fifo2);
  1248.         hfcpci_clear_fifo_tx(cs, fifo2);
  1249. if (bc) {
  1250. cs->hw.hfcpci.sctrl |= SCTRL_B2_ENA;
  1251. cs->hw.hfcpci.sctrl_r |= SCTRL_B2_ENA;
  1252. } else {
  1253. cs->hw.hfcpci.sctrl |= SCTRL_B1_ENA;
  1254. cs->hw.hfcpci.sctrl_r |= SCTRL_B1_ENA;
  1255. }
  1256. if (fifo2) {
  1257. cs->hw.hfcpci.fifo_en |= HFCPCI_FIFOEN_B2;
  1258. cs->hw.hfcpci.int_m1 |= (HFCPCI_INTS_B2TRANS + HFCPCI_INTS_B2REC);
  1259. cs->hw.hfcpci.ctmt |= 2;
  1260. cs->hw.hfcpci.conn &= ~0x18;
  1261. } else {
  1262. cs->hw.hfcpci.fifo_en |= HFCPCI_FIFOEN_B1;
  1263. cs->hw.hfcpci.int_m1 |= (HFCPCI_INTS_B1TRANS + HFCPCI_INTS_B1REC);
  1264. cs->hw.hfcpci.ctmt |= 1;
  1265. cs->hw.hfcpci.conn &= ~0x03;
  1266. }
  1267. break;
  1268. case (L1_MODE_HDLC):
  1269.         hfcpci_clear_fifo_rx(cs, fifo2);
  1270.         hfcpci_clear_fifo_tx(cs, fifo2);
  1271. if (bc) {
  1272. cs->hw.hfcpci.sctrl |= SCTRL_B2_ENA;
  1273. cs->hw.hfcpci.sctrl_r |= SCTRL_B2_ENA;
  1274. } else {
  1275. cs->hw.hfcpci.sctrl |= SCTRL_B1_ENA;
  1276. cs->hw.hfcpci.sctrl_r |= SCTRL_B1_ENA;
  1277. }
  1278. if (fifo2) {
  1279.         cs->hw.hfcpci.last_bfifo_cnt[1] = 0;  
  1280. cs->hw.hfcpci.fifo_en |= HFCPCI_FIFOEN_B2;
  1281. cs->hw.hfcpci.int_m1 |= (HFCPCI_INTS_B2TRANS + HFCPCI_INTS_B2REC);
  1282. cs->hw.hfcpci.ctmt &= ~2;
  1283. cs->hw.hfcpci.conn &= ~0x18;
  1284. } else {
  1285.         cs->hw.hfcpci.last_bfifo_cnt[0] = 0;  
  1286. cs->hw.hfcpci.fifo_en |= HFCPCI_FIFOEN_B1;
  1287. cs->hw.hfcpci.int_m1 |= (HFCPCI_INTS_B1TRANS + HFCPCI_INTS_B1REC);
  1288. cs->hw.hfcpci.ctmt &= ~1;
  1289. cs->hw.hfcpci.conn &= ~0x03;
  1290. }
  1291. break;
  1292. case (L1_MODE_EXTRN):
  1293. if (bc) {
  1294. cs->hw.hfcpci.conn |= 0x10;
  1295. cs->hw.hfcpci.sctrl |= SCTRL_B2_ENA;
  1296. cs->hw.hfcpci.sctrl_r |= SCTRL_B2_ENA;
  1297. cs->hw.hfcpci.fifo_en &= ~HFCPCI_FIFOEN_B2;
  1298. cs->hw.hfcpci.int_m1 &= ~(HFCPCI_INTS_B2TRANS + HFCPCI_INTS_B2REC);
  1299. } else {
  1300. cs->hw.hfcpci.conn |= 0x02;
  1301. cs->hw.hfcpci.sctrl |= SCTRL_B1_ENA;
  1302. cs->hw.hfcpci.sctrl_r |= SCTRL_B1_ENA;
  1303. cs->hw.hfcpci.fifo_en &= ~HFCPCI_FIFOEN_B1;
  1304. cs->hw.hfcpci.int_m1 &= ~(HFCPCI_INTS_B1TRANS + HFCPCI_INTS_B1REC);
  1305. }
  1306. break;
  1307. }
  1308. Write_hfc(cs, HFCPCI_SCTRL_E, cs->hw.hfcpci.sctrl_e);
  1309. Write_hfc(cs, HFCPCI_INT_M1, cs->hw.hfcpci.int_m1);
  1310. Write_hfc(cs, HFCPCI_FIFO_EN, cs->hw.hfcpci.fifo_en);
  1311. Write_hfc(cs, HFCPCI_SCTRL, cs->hw.hfcpci.sctrl);
  1312. Write_hfc(cs, HFCPCI_SCTRL_R, cs->hw.hfcpci.sctrl_r);
  1313. Write_hfc(cs, HFCPCI_CTMT, cs->hw.hfcpci.ctmt);
  1314. Write_hfc(cs, HFCPCI_CONNECT, cs->hw.hfcpci.conn);
  1315. restore_flags(flags);
  1316. }
  1317. /******************************/
  1318. /* Layer2 -> Layer 1 Transfer */
  1319. /******************************/
  1320. static void
  1321. hfcpci_l2l1(struct PStack *st, int pr, void *arg)
  1322. {
  1323. struct sk_buff *skb = arg;
  1324. long flags;
  1325. switch (pr) {
  1326. case (PH_DATA | REQUEST):
  1327. save_flags(flags);
  1328. cli();
  1329. if (st->l1.bcs->tx_skb) {
  1330. skb_queue_tail(&st->l1.bcs->squeue, skb);
  1331. restore_flags(flags);
  1332. } else {
  1333. st->l1.bcs->tx_skb = skb;
  1334. /*                              test_and_set_bit(BC_FLG_BUSY, &st->l1.bcs->Flag);
  1335.  */ st->l1.bcs->cs->BC_Send_Data(st->l1.bcs);
  1336. restore_flags(flags);
  1337. }
  1338. break;
  1339. case (PH_PULL | INDICATION):
  1340. if (st->l1.bcs->tx_skb) {
  1341. printk(KERN_WARNING "hfc_l2l1: this shouldn't happenn");
  1342. break;
  1343. }
  1344. save_flags(flags);
  1345. cli();
  1346. /*                      test_and_set_bit(BC_FLG_BUSY, &st->l1.bcs->Flag);
  1347.  */ st->l1.bcs->tx_skb = skb;
  1348. st->l1.bcs->cs->BC_Send_Data(st->l1.bcs);
  1349. restore_flags(flags);
  1350. break;
  1351. case (PH_PULL | REQUEST):
  1352. if (!st->l1.bcs->tx_skb) {
  1353. test_and_clear_bit(FLG_L1_PULL_REQ, &st->l1.Flags);
  1354. st->l1.l1l2(st, PH_PULL | CONFIRM, NULL);
  1355. } else
  1356. test_and_set_bit(FLG_L1_PULL_REQ, &st->l1.Flags);
  1357. break;
  1358. case (PH_ACTIVATE | REQUEST):
  1359. test_and_set_bit(BC_FLG_ACTIV, &st->l1.bcs->Flag);
  1360. mode_hfcpci(st->l1.bcs, st->l1.mode, st->l1.bc);
  1361. l1_msg_b(st, pr, arg);
  1362. break;
  1363. case (PH_DEACTIVATE | REQUEST):
  1364. l1_msg_b(st, pr, arg);
  1365. break;
  1366. case (PH_DEACTIVATE | CONFIRM):
  1367. test_and_clear_bit(BC_FLG_ACTIV, &st->l1.bcs->Flag);
  1368. test_and_clear_bit(BC_FLG_BUSY, &st->l1.bcs->Flag);
  1369. mode_hfcpci(st->l1.bcs, 0, st->l1.bc);
  1370. st->l1.l1l2(st, PH_DEACTIVATE | CONFIRM, NULL);
  1371. break;
  1372. }
  1373. }
  1374. /******************************************/
  1375. /* deactivate B-channel access and queues */
  1376. /******************************************/
  1377. static void
  1378. close_hfcpci(struct BCState *bcs)
  1379. {
  1380. mode_hfcpci(bcs, 0, bcs->channel);
  1381. if (test_and_clear_bit(BC_FLG_INIT, &bcs->Flag)) {
  1382. skb_queue_purge(&bcs->rqueue);
  1383. skb_queue_purge(&bcs->squeue);
  1384. if (bcs->tx_skb) {
  1385. dev_kfree_skb_any(bcs->tx_skb);
  1386. bcs->tx_skb = NULL;
  1387. test_and_clear_bit(BC_FLG_BUSY, &bcs->Flag);
  1388. }
  1389. }
  1390. }
  1391. /*************************************/
  1392. /* init B-channel queues and control */
  1393. /*************************************/
  1394. static int
  1395. open_hfcpcistate(struct IsdnCardState *cs, struct BCState *bcs)
  1396. {
  1397. if (!test_and_set_bit(BC_FLG_INIT, &bcs->Flag)) {
  1398. skb_queue_head_init(&bcs->rqueue);
  1399. skb_queue_head_init(&bcs->squeue);
  1400. }
  1401. bcs->tx_skb = NULL;
  1402. test_and_clear_bit(BC_FLG_BUSY, &bcs->Flag);
  1403. bcs->event = 0;
  1404. bcs->tx_cnt = 0;
  1405. return (0);
  1406. }
  1407. /*********************************/
  1408. /* inits the stack for B-channel */
  1409. /*********************************/
  1410. static int
  1411. setstack_2b(struct PStack *st, struct BCState *bcs)
  1412. {
  1413. bcs->channel = st->l1.bc;
  1414. if (open_hfcpcistate(st->l1.hardware, bcs))
  1415. return (-1);
  1416. st->l1.bcs = bcs;
  1417. st->l2.l2l1 = hfcpci_l2l1;
  1418. setstack_manager(st);
  1419. bcs->st = st;
  1420. setstack_l1_B(st);
  1421. return (0);
  1422. }
  1423. /***************************/
  1424. /* handle L1 state changes */
  1425. /***************************/
  1426. static void
  1427. hfcpci_bh(struct IsdnCardState *cs)
  1428. {
  1429. unsigned long flags;
  1430. /*      struct PStack *stptr;
  1431.  */
  1432. if (!cs)
  1433. return;
  1434. if (test_and_clear_bit(D_L1STATECHANGE, &cs->event)) {
  1435. if (!cs->hw.hfcpci.nt_mode)
  1436. switch (cs->dc.hfcpci.ph_state) {
  1437. case (0):
  1438. l1_msg(cs, HW_RESET | INDICATION, NULL);
  1439. break;
  1440. case (3):
  1441. l1_msg(cs, HW_DEACTIVATE | INDICATION, NULL);
  1442. break;
  1443. case (8):
  1444. l1_msg(cs, HW_RSYNC | INDICATION, NULL);
  1445. break;
  1446. case (6):
  1447. l1_msg(cs, HW_INFO2 | INDICATION, NULL);
  1448. break;
  1449. case (7):
  1450. l1_msg(cs, HW_INFO4_P8 | INDICATION, NULL);
  1451. break;
  1452. default:
  1453. break;
  1454. } else {
  1455. switch (cs->dc.hfcpci.ph_state) {
  1456. case (2):
  1457. save_flags(flags);
  1458. cli();
  1459. if (cs->hw.hfcpci.nt_timer < 0) {
  1460. cs->hw.hfcpci.nt_timer = 0;
  1461. cs->hw.hfcpci.int_m1 &= ~HFCPCI_INTS_TIMER;
  1462. Write_hfc(cs, HFCPCI_INT_M1, cs->hw.hfcpci.int_m1);
  1463. /* Clear already pending ints */
  1464. if (Read_hfc(cs, HFCPCI_INT_S1));
  1465. Write_hfc(cs, HFCPCI_STATES, 4 | HFCPCI_LOAD_STATE);
  1466. udelay(10);
  1467. Write_hfc(cs, HFCPCI_STATES, 4);
  1468. cs->dc.hfcpci.ph_state = 4;
  1469. } else {
  1470. cs->hw.hfcpci.int_m1 |= HFCPCI_INTS_TIMER;
  1471. Write_hfc(cs, HFCPCI_INT_M1, cs->hw.hfcpci.int_m1);
  1472. cs->hw.hfcpci.ctmt &= ~HFCPCI_AUTO_TIMER;
  1473. cs->hw.hfcpci.ctmt |= HFCPCI_TIM3_125;
  1474. Write_hfc(cs, HFCPCI_CTMT, cs->hw.hfcpci.ctmt | HFCPCI_CLTIMER);
  1475. Write_hfc(cs, HFCPCI_CTMT, cs->hw.hfcpci.ctmt | HFCPCI_CLTIMER);
  1476. cs->hw.hfcpci.nt_timer = NT_T1_COUNT;
  1477. Write_hfc(cs, HFCPCI_STATES, 2 | HFCPCI_NT_G2_G3); /* allow G2 -> G3 transition */
  1478. }
  1479. restore_flags(flags);
  1480. break;
  1481. case (1):
  1482. case (3):
  1483. case (4):
  1484. save_flags(flags);
  1485. cli();
  1486. cs->hw.hfcpci.nt_timer = 0;
  1487. cs->hw.hfcpci.int_m1 &= ~HFCPCI_INTS_TIMER;
  1488. Write_hfc(cs, HFCPCI_INT_M1, cs->hw.hfcpci.int_m1);
  1489. restore_flags(flags);
  1490. break;
  1491. default:
  1492. break;
  1493. }
  1494. }
  1495. }
  1496. if (test_and_clear_bit(D_RCVBUFREADY, &cs->event))
  1497. DChannel_proc_rcv(cs);
  1498. if (test_and_clear_bit(D_XMTBUFREADY, &cs->event))
  1499. DChannel_proc_xmt(cs);
  1500. }
  1501. /********************************/
  1502. /* called for card init message */
  1503. /********************************/
  1504. void __init
  1505. inithfcpci(struct IsdnCardState *cs)
  1506. {
  1507. cs->setstack_d = setstack_hfcpci;
  1508. cs->dbusytimer.function = (void *) hfcpci_dbusy_timer;
  1509. cs->dbusytimer.data = (long) cs;
  1510. init_timer(&cs->dbusytimer);
  1511. cs->tqueue.routine = (void *) (void *) hfcpci_bh;
  1512. cs->BC_Send_Data = &hfcpci_send_data;
  1513. cs->bcs[0].BC_SetStack = setstack_2b;
  1514. cs->bcs[1].BC_SetStack = setstack_2b;
  1515. cs->bcs[0].BC_Close = close_hfcpci;
  1516. cs->bcs[1].BC_Close = close_hfcpci;
  1517. mode_hfcpci(cs->bcs, 0, 0);
  1518. mode_hfcpci(cs->bcs + 1, 0, 1);
  1519. }
  1520. /*******************************************/
  1521. /* handle card messages from control layer */
  1522. /*******************************************/
  1523. static int
  1524. hfcpci_card_msg(struct IsdnCardState *cs, int mt, void *arg)
  1525. {
  1526. long flags;
  1527. if (cs->debug & L1_DEB_ISAC)
  1528. debugl1(cs, "HFCPCI: card_msg %x", mt);
  1529. switch (mt) {
  1530. case CARD_RESET:
  1531. reset_hfcpci(cs);
  1532. return (0);
  1533. case CARD_RELEASE:
  1534. release_io_hfcpci(cs);
  1535. return (0);
  1536. case CARD_INIT:
  1537. inithfcpci(cs);
  1538. save_flags(flags);
  1539. sti();
  1540. set_current_state(TASK_UNINTERRUPTIBLE);
  1541. schedule_timeout((80 * HZ) / 1000); /* Timeout 80ms */
  1542. /* now switch timer interrupt off */
  1543. cs->hw.hfcpci.int_m1 &= ~HFCPCI_INTS_TIMER;
  1544. Write_hfc(cs, HFCPCI_INT_M1, cs->hw.hfcpci.int_m1);
  1545. /* reinit mode reg */
  1546. Write_hfc(cs, HFCPCI_MST_MODE, cs->hw.hfcpci.mst_m);
  1547. restore_flags(flags);
  1548. return (0);
  1549. case CARD_TEST:
  1550. return (0);
  1551. }
  1552. return (0);
  1553. }
  1554. /* this variable is used as card index when more than one cards are present */
  1555. static struct pci_dev *dev_hfcpci __initdata = NULL;
  1556. #endif /* CONFIG_PCI */
  1557. int __init
  1558. setup_hfcpci(struct IsdnCard *card)
  1559. {
  1560. struct IsdnCardState *cs = card->cs;
  1561. char tmp[64];
  1562. int i;
  1563. struct pci_dev *tmp_hfcpci = NULL;
  1564. #ifdef __BIG_ENDIAN
  1565. #error "not running on big endian machines now"
  1566. #endif
  1567. strcpy(tmp, hfcpci_revision);
  1568. printk(KERN_INFO "HiSax: HFC-PCI driver Rev. %sn", HiSax_getrev(tmp));
  1569. #if CONFIG_PCI
  1570. cs->hw.hfcpci.int_s1 = 0;
  1571. cs->dc.hfcpci.ph_state = 0;
  1572. cs->hw.hfcpci.fifo = 255;
  1573. if (cs->typ == ISDN_CTYPE_HFC_PCI) {
  1574. i = 0;
  1575. while (id_list[i].vendor_id) {
  1576. tmp_hfcpci = pci_find_device(id_list[i].vendor_id,
  1577.      id_list[i].device_id,
  1578.      dev_hfcpci);
  1579. i++;
  1580. if (tmp_hfcpci) {
  1581. if (pci_enable_device(tmp_hfcpci))
  1582. continue;
  1583. pci_set_master(tmp_hfcpci);
  1584. if ((card->para[0]) && (card->para[0] != (tmp_hfcpci->resource[ 0].start & PCI_BASE_ADDRESS_IO_MASK)))
  1585. continue;
  1586. else
  1587. break;
  1588. }
  1589. }
  1590. if (tmp_hfcpci) {
  1591. i--;
  1592. dev_hfcpci = tmp_hfcpci; /* old device */
  1593. cs->hw.hfcpci.pci_bus = dev_hfcpci->bus->number;
  1594. cs->hw.hfcpci.pci_device_fn = dev_hfcpci->devfn;
  1595. cs->irq = dev_hfcpci->irq;
  1596. if (!cs->irq) {
  1597. printk(KERN_WARNING "HFC-PCI: No IRQ for PCI card foundn");
  1598. return (0);
  1599. }
  1600. cs->hw.hfcpci.pci_io = (char *) dev_hfcpci->resource[ 1].start;
  1601. printk(KERN_INFO "HiSax: HFC-PCI card manufacturer: %s card name: %sn", id_list[i].vendor_name, id_list[i].card_name);
  1602. } else {
  1603. printk(KERN_WARNING "HFC-PCI: No PCI card foundn");
  1604. return (0);
  1605. }
  1606. if (!cs->hw.hfcpci.pci_io) {
  1607. printk(KERN_WARNING "HFC-PCI: No IO-Mem for PCI card foundn");
  1608. return (0);
  1609. }
  1610. /* Allocate memory for FIFOS */
  1611. /* Because the HFC-PCI needs a 32K physical alignment, we */
  1612. /* need to allocate the double mem and align the address */
  1613. if (!((void *) cs->hw.hfcpci.share_start = kmalloc(65536, GFP_KERNEL))) {
  1614. printk(KERN_WARNING "HFC-PCI: Error allocating memory for FIFO!n");
  1615. return 0;
  1616. }
  1617. (ulong) cs->hw.hfcpci.fifos =
  1618.     (((ulong) cs->hw.hfcpci.share_start) & ~0x7FFF) + 0x8000;
  1619. pcibios_write_config_dword(cs->hw.hfcpci.pci_bus,
  1620.        cs->hw.hfcpci.pci_device_fn, 0x80,
  1621.        (u_int) virt_to_bus(cs->hw.hfcpci.fifos));
  1622. cs->hw.hfcpci.pci_io = ioremap((ulong) cs->hw.hfcpci.pci_io, 256);
  1623. printk(KERN_INFO
  1624.        "HFC-PCI: defined at mem %#x fifo %#x(%#x) IRQ %d HZ %dn",
  1625.        (u_int) cs->hw.hfcpci.pci_io,
  1626.        (u_int) cs->hw.hfcpci.fifos,
  1627.        (u_int) virt_to_bus(cs->hw.hfcpci.fifos),
  1628.        cs->irq, HZ);
  1629. pcibios_write_config_word(cs->hw.hfcpci.pci_bus, cs->hw.hfcpci.pci_device_fn, PCI_COMMAND, PCI_ENA_MEMIO); /* enable memory mapped ports, disable busmaster */
  1630. cs->hw.hfcpci.int_m2 = 0; /* disable alle interrupts */
  1631. cs->hw.hfcpci.int_m1 = 0;
  1632. Write_hfc(cs, HFCPCI_INT_M1, cs->hw.hfcpci.int_m1);
  1633. Write_hfc(cs, HFCPCI_INT_M2, cs->hw.hfcpci.int_m2);
  1634. /* At this point the needed PCI config is done */
  1635. /* fifos are still not enabled */
  1636. } else
  1637. return (0); /* no valid card type */
  1638. cs->readisac = NULL;
  1639. cs->writeisac = NULL;
  1640. cs->readisacfifo = NULL;
  1641. cs->writeisacfifo = NULL;
  1642. cs->BC_Read_Reg = NULL;
  1643. cs->BC_Write_Reg = NULL;
  1644. cs->irq_func = &hfcpci_interrupt;
  1645. cs->irq_flags |= SA_SHIRQ;
  1646. cs->hw.hfcpci.timer.function = (void *) hfcpci_Timer;
  1647. cs->hw.hfcpci.timer.data = (long) cs;
  1648. init_timer(&cs->hw.hfcpci.timer);
  1649. reset_hfcpci(cs);
  1650. cs->cardmsg = &hfcpci_card_msg;
  1651. cs->auxcmd = &hfcpci_auxcmd;
  1652. return (1);
  1653. #else
  1654. printk(KERN_WARNING "HFC-PCI: NO_PCI_BIOSn");
  1655. return (0);
  1656. #endif /* CONFIG_PCI */
  1657. }