w6692.c 36 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432
  1. /*
  2. * w6692.c mISDN driver for Winbond w6692 based cards
  3. *
  4. * Author Karsten Keil <kkeil@suse.de>
  5. * based on the w6692 I4L driver from Petr Novak <petr.novak@i.cz>
  6. *
  7. * Copyright 2009 by Karsten Keil <keil@isdn4linux.de>
  8. *
  9. * This program is free software; you can redistribute it and/or modify
  10. * it under the terms of the GNU General Public License version 2 as
  11. * published by the Free Software Foundation.
  12. *
  13. * This program is distributed in the hope that it will be useful,
  14. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  15. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  16. * GNU General Public License for more details.
  17. *
  18. * You should have received a copy of the GNU General Public License
  19. * along with this program; if not, write to the Free Software
  20. * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  21. *
  22. */
  23. #include <linux/interrupt.h>
  24. #include <linux/module.h>
  25. #include <linux/pci.h>
  26. #include <linux/delay.h>
  27. #include <linux/mISDNhw.h>
  28. #include <linux/slab.h>
  29. #include "w6692.h"
  30. #define W6692_REV "2.0"
  31. #define DBUSY_TIMER_VALUE 80
  32. enum {
  33. W6692_ASUS,
  34. W6692_WINBOND,
  35. W6692_USR
  36. };
  37. /* private data in the PCI devices list */
  38. struct w6692map {
  39. u_int subtype;
  40. char *name;
  41. };
  42. static const struct w6692map w6692_map[] =
  43. {
  44. {W6692_ASUS, "Dynalink/AsusCom IS64PH"},
  45. {W6692_WINBOND, "Winbond W6692"},
  46. {W6692_USR, "USR W6692"}
  47. };
  48. #define PCI_DEVICE_ID_USR_6692 0x3409
  49. struct w6692_ch {
  50. struct bchannel bch;
  51. u32 addr;
  52. struct timer_list timer;
  53. u8 b_mode;
  54. };
  55. struct w6692_hw {
  56. struct list_head list;
  57. struct pci_dev *pdev;
  58. char name[MISDN_MAX_IDLEN];
  59. u32 irq;
  60. u32 irqcnt;
  61. u32 addr;
  62. u32 fmask; /* feature mask - bit set per card nr */
  63. int subtype;
  64. spinlock_t lock; /* hw lock */
  65. u8 imask;
  66. u8 pctl;
  67. u8 xaddr;
  68. u8 xdata;
  69. u8 state;
  70. struct w6692_ch bc[2];
  71. struct dchannel dch;
  72. char log[64];
  73. };
  74. static LIST_HEAD(Cards);
  75. static DEFINE_RWLOCK(card_lock); /* protect Cards */
  76. static int w6692_cnt;
  77. static int debug;
  78. static u32 led;
  79. static u32 pots;
  80. static void
  81. _set_debug(struct w6692_hw *card)
  82. {
  83. card->dch.debug = debug;
  84. card->bc[0].bch.debug = debug;
  85. card->bc[1].bch.debug = debug;
  86. }
  87. static int
  88. set_debug(const char *val, const struct kernel_param *kp)
  89. {
  90. int ret;
  91. struct w6692_hw *card;
  92. ret = param_set_uint(val, kp);
  93. if (!ret) {
  94. read_lock(&card_lock);
  95. list_for_each_entry(card, &Cards, list)
  96. _set_debug(card);
  97. read_unlock(&card_lock);
  98. }
  99. return ret;
  100. }
  101. MODULE_AUTHOR("Karsten Keil");
  102. MODULE_LICENSE("GPL v2");
  103. MODULE_VERSION(W6692_REV);
  104. module_param_call(debug, set_debug, param_get_uint, &debug, S_IRUGO | S_IWUSR);
  105. MODULE_PARM_DESC(debug, "W6692 debug mask");
  106. module_param(led, uint, S_IRUGO | S_IWUSR);
  107. MODULE_PARM_DESC(led, "W6692 LED support bitmask (one bit per card)");
  108. module_param(pots, uint, S_IRUGO | S_IWUSR);
  109. MODULE_PARM_DESC(pots, "W6692 POTS support bitmask (one bit per card)");
  110. static inline u8
  111. ReadW6692(struct w6692_hw *card, u8 offset)
  112. {
  113. return inb(card->addr + offset);
  114. }
  115. static inline void
  116. WriteW6692(struct w6692_hw *card, u8 offset, u8 value)
  117. {
  118. outb(value, card->addr + offset);
  119. }
  120. static inline u8
  121. ReadW6692B(struct w6692_ch *bc, u8 offset)
  122. {
  123. return inb(bc->addr + offset);
  124. }
  125. static inline void
  126. WriteW6692B(struct w6692_ch *bc, u8 offset, u8 value)
  127. {
  128. outb(value, bc->addr + offset);
  129. }
  130. static void
  131. enable_hwirq(struct w6692_hw *card)
  132. {
  133. WriteW6692(card, W_IMASK, card->imask);
  134. }
  135. static void
  136. disable_hwirq(struct w6692_hw *card)
  137. {
  138. WriteW6692(card, W_IMASK, 0xff);
  139. }
  140. static const char *W6692Ver[] = {"V00", "V01", "V10", "V11"};
  141. static void
  142. W6692Version(struct w6692_hw *card)
  143. {
  144. int val;
  145. val = ReadW6692(card, W_D_RBCH);
  146. pr_notice("%s: Winbond W6692 version: %s\n", card->name,
  147. W6692Ver[(val >> 6) & 3]);
  148. }
  149. static void
  150. w6692_led_handler(struct w6692_hw *card, int on)
  151. {
  152. if ((!(card->fmask & led)) || card->subtype == W6692_USR)
  153. return;
  154. if (on) {
  155. card->xdata &= 0xfb; /* LED ON */
  156. WriteW6692(card, W_XDATA, card->xdata);
  157. } else {
  158. card->xdata |= 0x04; /* LED OFF */
  159. WriteW6692(card, W_XDATA, card->xdata);
  160. }
  161. }
  162. static void
  163. ph_command(struct w6692_hw *card, u8 cmd)
  164. {
  165. pr_debug("%s: ph_command %x\n", card->name, cmd);
  166. WriteW6692(card, W_CIX, cmd);
  167. }
  168. static void
  169. W6692_new_ph(struct w6692_hw *card)
  170. {
  171. if (card->state == W_L1CMD_RST)
  172. ph_command(card, W_L1CMD_DRC);
  173. schedule_event(&card->dch, FLG_PHCHANGE);
  174. }
  175. static void
  176. W6692_ph_bh(struct dchannel *dch)
  177. {
  178. struct w6692_hw *card = dch->hw;
  179. switch (card->state) {
  180. case W_L1CMD_RST:
  181. dch->state = 0;
  182. l1_event(dch->l1, HW_RESET_IND);
  183. break;
  184. case W_L1IND_CD:
  185. dch->state = 3;
  186. l1_event(dch->l1, HW_DEACT_CNF);
  187. break;
  188. case W_L1IND_DRD:
  189. dch->state = 3;
  190. l1_event(dch->l1, HW_DEACT_IND);
  191. break;
  192. case W_L1IND_CE:
  193. dch->state = 4;
  194. l1_event(dch->l1, HW_POWERUP_IND);
  195. break;
  196. case W_L1IND_LD:
  197. if (dch->state <= 5) {
  198. dch->state = 5;
  199. l1_event(dch->l1, ANYSIGNAL);
  200. } else {
  201. dch->state = 8;
  202. l1_event(dch->l1, LOSTFRAMING);
  203. }
  204. break;
  205. case W_L1IND_ARD:
  206. dch->state = 6;
  207. l1_event(dch->l1, INFO2);
  208. break;
  209. case W_L1IND_AI8:
  210. dch->state = 7;
  211. l1_event(dch->l1, INFO4_P8);
  212. break;
  213. case W_L1IND_AI10:
  214. dch->state = 7;
  215. l1_event(dch->l1, INFO4_P10);
  216. break;
  217. default:
  218. pr_debug("%s: TE unknown state %02x dch state %02x\n",
  219. card->name, card->state, dch->state);
  220. break;
  221. }
  222. pr_debug("%s: TE newstate %02x\n", card->name, dch->state);
  223. }
  224. static void
  225. W6692_empty_Dfifo(struct w6692_hw *card, int count)
  226. {
  227. struct dchannel *dch = &card->dch;
  228. u8 *ptr;
  229. pr_debug("%s: empty_Dfifo %d\n", card->name, count);
  230. if (!dch->rx_skb) {
  231. dch->rx_skb = mI_alloc_skb(card->dch.maxlen, GFP_ATOMIC);
  232. if (!dch->rx_skb) {
  233. pr_info("%s: D receive out of memory\n", card->name);
  234. WriteW6692(card, W_D_CMDR, W_D_CMDR_RACK);
  235. return;
  236. }
  237. }
  238. if ((dch->rx_skb->len + count) >= dch->maxlen) {
  239. pr_debug("%s: empty_Dfifo overrun %d\n", card->name,
  240. dch->rx_skb->len + count);
  241. WriteW6692(card, W_D_CMDR, W_D_CMDR_RACK);
  242. return;
  243. }
  244. ptr = skb_put(dch->rx_skb, count);
  245. insb(card->addr + W_D_RFIFO, ptr, count);
  246. WriteW6692(card, W_D_CMDR, W_D_CMDR_RACK);
  247. if (debug & DEBUG_HW_DFIFO) {
  248. snprintf(card->log, 63, "D-recv %s %d ",
  249. card->name, count);
  250. print_hex_dump_bytes(card->log, DUMP_PREFIX_OFFSET, ptr, count);
  251. }
  252. }
  253. static void
  254. W6692_fill_Dfifo(struct w6692_hw *card)
  255. {
  256. struct dchannel *dch = &card->dch;
  257. int count;
  258. u8 *ptr;
  259. u8 cmd = W_D_CMDR_XMS;
  260. pr_debug("%s: fill_Dfifo\n", card->name);
  261. if (!dch->tx_skb)
  262. return;
  263. count = dch->tx_skb->len - dch->tx_idx;
  264. if (count <= 0)
  265. return;
  266. if (count > W_D_FIFO_THRESH)
  267. count = W_D_FIFO_THRESH;
  268. else
  269. cmd |= W_D_CMDR_XME;
  270. ptr = dch->tx_skb->data + dch->tx_idx;
  271. dch->tx_idx += count;
  272. outsb(card->addr + W_D_XFIFO, ptr, count);
  273. WriteW6692(card, W_D_CMDR, cmd);
  274. if (test_and_set_bit(FLG_BUSY_TIMER, &dch->Flags)) {
  275. pr_debug("%s: fill_Dfifo dbusytimer running\n", card->name);
  276. del_timer(&dch->timer);
  277. }
  278. dch->timer.expires = jiffies + ((DBUSY_TIMER_VALUE * HZ) / 1000);
  279. add_timer(&dch->timer);
  280. if (debug & DEBUG_HW_DFIFO) {
  281. snprintf(card->log, 63, "D-send %s %d ",
  282. card->name, count);
  283. print_hex_dump_bytes(card->log, DUMP_PREFIX_OFFSET, ptr, count);
  284. }
  285. }
  286. static void
  287. d_retransmit(struct w6692_hw *card)
  288. {
  289. struct dchannel *dch = &card->dch;
  290. if (test_and_clear_bit(FLG_BUSY_TIMER, &dch->Flags))
  291. del_timer(&dch->timer);
  292. #ifdef FIXME
  293. if (test_and_clear_bit(FLG_L1_BUSY, &dch->Flags))
  294. dchannel_sched_event(dch, D_CLEARBUSY);
  295. #endif
  296. if (test_bit(FLG_TX_BUSY, &dch->Flags)) {
  297. /* Restart frame */
  298. dch->tx_idx = 0;
  299. W6692_fill_Dfifo(card);
  300. } else if (dch->tx_skb) { /* should not happen */
  301. pr_info("%s: %s without TX_BUSY\n", card->name, __func__);
  302. test_and_set_bit(FLG_TX_BUSY, &dch->Flags);
  303. dch->tx_idx = 0;
  304. W6692_fill_Dfifo(card);
  305. } else {
  306. pr_info("%s: XDU no TX_BUSY\n", card->name);
  307. if (get_next_dframe(dch))
  308. W6692_fill_Dfifo(card);
  309. }
  310. }
  311. static void
  312. handle_rxD(struct w6692_hw *card) {
  313. u8 stat;
  314. int count;
  315. stat = ReadW6692(card, W_D_RSTA);
  316. if (stat & (W_D_RSTA_RDOV | W_D_RSTA_CRCE | W_D_RSTA_RMB)) {
  317. if (stat & W_D_RSTA_RDOV) {
  318. pr_debug("%s: D-channel RDOV\n", card->name);
  319. #ifdef ERROR_STATISTIC
  320. card->dch.err_rx++;
  321. #endif
  322. }
  323. if (stat & W_D_RSTA_CRCE) {
  324. pr_debug("%s: D-channel CRC error\n", card->name);
  325. #ifdef ERROR_STATISTIC
  326. card->dch.err_crc++;
  327. #endif
  328. }
  329. if (stat & W_D_RSTA_RMB) {
  330. pr_debug("%s: D-channel ABORT\n", card->name);
  331. #ifdef ERROR_STATISTIC
  332. card->dch.err_rx++;
  333. #endif
  334. }
  335. if (card->dch.rx_skb)
  336. dev_kfree_skb(card->dch.rx_skb);
  337. card->dch.rx_skb = NULL;
  338. WriteW6692(card, W_D_CMDR, W_D_CMDR_RACK | W_D_CMDR_RRST);
  339. } else {
  340. count = ReadW6692(card, W_D_RBCL) & (W_D_FIFO_THRESH - 1);
  341. if (count == 0)
  342. count = W_D_FIFO_THRESH;
  343. W6692_empty_Dfifo(card, count);
  344. recv_Dchannel(&card->dch);
  345. }
  346. }
  347. static void
  348. handle_txD(struct w6692_hw *card) {
  349. if (test_and_clear_bit(FLG_BUSY_TIMER, &card->dch.Flags))
  350. del_timer(&card->dch.timer);
  351. if (card->dch.tx_skb && card->dch.tx_idx < card->dch.tx_skb->len) {
  352. W6692_fill_Dfifo(card);
  353. } else {
  354. if (card->dch.tx_skb)
  355. dev_kfree_skb(card->dch.tx_skb);
  356. if (get_next_dframe(&card->dch))
  357. W6692_fill_Dfifo(card);
  358. }
  359. }
  360. static void
  361. handle_statusD(struct w6692_hw *card)
  362. {
  363. struct dchannel *dch = &card->dch;
  364. u8 exval, v1, cir;
  365. exval = ReadW6692(card, W_D_EXIR);
  366. pr_debug("%s: D_EXIR %02x\n", card->name, exval);
  367. if (exval & (W_D_EXI_XDUN | W_D_EXI_XCOL)) {
  368. /* Transmit underrun/collision */
  369. pr_debug("%s: D-channel underrun/collision\n", card->name);
  370. #ifdef ERROR_STATISTIC
  371. dch->err_tx++;
  372. #endif
  373. d_retransmit(card);
  374. }
  375. if (exval & W_D_EXI_RDOV) { /* RDOV */
  376. pr_debug("%s: D-channel RDOV\n", card->name);
  377. WriteW6692(card, W_D_CMDR, W_D_CMDR_RRST);
  378. }
  379. if (exval & W_D_EXI_TIN2) /* TIN2 - never */
  380. pr_debug("%s: spurious TIN2 interrupt\n", card->name);
  381. if (exval & W_D_EXI_MOC) { /* MOC - not supported */
  382. v1 = ReadW6692(card, W_MOSR);
  383. pr_debug("%s: spurious MOC interrupt MOSR %02x\n",
  384. card->name, v1);
  385. }
  386. if (exval & W_D_EXI_ISC) { /* ISC - Level1 change */
  387. cir = ReadW6692(card, W_CIR);
  388. pr_debug("%s: ISC CIR %02X\n", card->name, cir);
  389. if (cir & W_CIR_ICC) {
  390. v1 = cir & W_CIR_COD_MASK;
  391. pr_debug("%s: ph_state_change %x -> %x\n", card->name,
  392. dch->state, v1);
  393. card->state = v1;
  394. if (card->fmask & led) {
  395. switch (v1) {
  396. case W_L1IND_AI8:
  397. case W_L1IND_AI10:
  398. w6692_led_handler(card, 1);
  399. break;
  400. default:
  401. w6692_led_handler(card, 0);
  402. break;
  403. }
  404. }
  405. W6692_new_ph(card);
  406. }
  407. if (cir & W_CIR_SCC) {
  408. v1 = ReadW6692(card, W_SQR);
  409. pr_debug("%s: SCC SQR %02X\n", card->name, v1);
  410. }
  411. }
  412. if (exval & W_D_EXI_WEXP)
  413. pr_debug("%s: spurious WEXP interrupt!\n", card->name);
  414. if (exval & W_D_EXI_TEXP)
  415. pr_debug("%s: spurious TEXP interrupt!\n", card->name);
  416. }
  417. static void
  418. W6692_empty_Bfifo(struct w6692_ch *wch, int count)
  419. {
  420. struct w6692_hw *card = wch->bch.hw;
  421. u8 *ptr;
  422. int maxlen;
  423. pr_debug("%s: empty_Bfifo %d\n", card->name, count);
  424. if (unlikely(wch->bch.state == ISDN_P_NONE)) {
  425. pr_debug("%s: empty_Bfifo ISDN_P_NONE\n", card->name);
  426. WriteW6692B(wch, W_B_CMDR, W_B_CMDR_RACK | W_B_CMDR_RACT);
  427. if (wch->bch.rx_skb)
  428. skb_trim(wch->bch.rx_skb, 0);
  429. return;
  430. }
  431. if (test_bit(FLG_RX_OFF, &wch->bch.Flags)) {
  432. wch->bch.dropcnt += count;
  433. WriteW6692B(wch, W_B_CMDR, W_B_CMDR_RACK | W_B_CMDR_RACT);
  434. return;
  435. }
  436. maxlen = bchannel_get_rxbuf(&wch->bch, count);
  437. if (maxlen < 0) {
  438. WriteW6692B(wch, W_B_CMDR, W_B_CMDR_RACK | W_B_CMDR_RACT);
  439. if (wch->bch.rx_skb)
  440. skb_trim(wch->bch.rx_skb, 0);
  441. pr_warning("%s.B%d: No bufferspace for %d bytes\n",
  442. card->name, wch->bch.nr, count);
  443. return;
  444. }
  445. ptr = skb_put(wch->bch.rx_skb, count);
  446. insb(wch->addr + W_B_RFIFO, ptr, count);
  447. WriteW6692B(wch, W_B_CMDR, W_B_CMDR_RACK | W_B_CMDR_RACT);
  448. if (debug & DEBUG_HW_DFIFO) {
  449. snprintf(card->log, 63, "B%1d-recv %s %d ",
  450. wch->bch.nr, card->name, count);
  451. print_hex_dump_bytes(card->log, DUMP_PREFIX_OFFSET, ptr, count);
  452. }
  453. }
  454. static void
  455. W6692_fill_Bfifo(struct w6692_ch *wch)
  456. {
  457. struct w6692_hw *card = wch->bch.hw;
  458. int count, fillempty = 0;
  459. u8 *ptr, cmd = W_B_CMDR_RACT | W_B_CMDR_XMS;
  460. pr_debug("%s: fill Bfifo\n", card->name);
  461. if (!wch->bch.tx_skb) {
  462. if (!test_bit(FLG_TX_EMPTY, &wch->bch.Flags))
  463. return;
  464. ptr = wch->bch.fill;
  465. count = W_B_FIFO_THRESH;
  466. fillempty = 1;
  467. } else {
  468. count = wch->bch.tx_skb->len - wch->bch.tx_idx;
  469. if (count <= 0)
  470. return;
  471. ptr = wch->bch.tx_skb->data + wch->bch.tx_idx;
  472. }
  473. if (count > W_B_FIFO_THRESH)
  474. count = W_B_FIFO_THRESH;
  475. else if (test_bit(FLG_HDLC, &wch->bch.Flags))
  476. cmd |= W_B_CMDR_XME;
  477. pr_debug("%s: fill Bfifo%d/%d\n", card->name,
  478. count, wch->bch.tx_idx);
  479. wch->bch.tx_idx += count;
  480. if (fillempty) {
  481. while (count > 0) {
  482. outsb(wch->addr + W_B_XFIFO, ptr, MISDN_BCH_FILL_SIZE);
  483. count -= MISDN_BCH_FILL_SIZE;
  484. }
  485. } else {
  486. outsb(wch->addr + W_B_XFIFO, ptr, count);
  487. }
  488. WriteW6692B(wch, W_B_CMDR, cmd);
  489. if ((debug & DEBUG_HW_BFIFO) && !fillempty) {
  490. snprintf(card->log, 63, "B%1d-send %s %d ",
  491. wch->bch.nr, card->name, count);
  492. print_hex_dump_bytes(card->log, DUMP_PREFIX_OFFSET, ptr, count);
  493. }
  494. }
  495. #if 0
  496. static int
  497. setvolume(struct w6692_ch *wch, int mic, struct sk_buff *skb)
  498. {
  499. struct w6692_hw *card = wch->bch.hw;
  500. u16 *vol = (u16 *)skb->data;
  501. u8 val;
  502. if ((!(card->fmask & pots)) ||
  503. !test_bit(FLG_TRANSPARENT, &wch->bch.Flags))
  504. return -ENODEV;
  505. if (skb->len < 2)
  506. return -EINVAL;
  507. if (*vol > 7)
  508. return -EINVAL;
  509. val = *vol & 7;
  510. val = 7 - val;
  511. if (mic) {
  512. val <<= 3;
  513. card->xaddr &= 0xc7;
  514. } else {
  515. card->xaddr &= 0xf8;
  516. }
  517. card->xaddr |= val;
  518. WriteW6692(card, W_XADDR, card->xaddr);
  519. return 0;
  520. }
  521. static int
  522. enable_pots(struct w6692_ch *wch)
  523. {
  524. struct w6692_hw *card = wch->bch.hw;
  525. if ((!(card->fmask & pots)) ||
  526. !test_bit(FLG_TRANSPARENT, &wch->bch.Flags))
  527. return -ENODEV;
  528. wch->b_mode |= W_B_MODE_EPCM | W_B_MODE_BSW0;
  529. WriteW6692B(wch, W_B_MODE, wch->b_mode);
  530. WriteW6692B(wch, W_B_CMDR, W_B_CMDR_RRST | W_B_CMDR_XRST);
  531. card->pctl |= ((wch->bch.nr & 2) ? W_PCTL_PCX : 0);
  532. WriteW6692(card, W_PCTL, card->pctl);
  533. return 0;
  534. }
  535. #endif
  536. static int
  537. disable_pots(struct w6692_ch *wch)
  538. {
  539. struct w6692_hw *card = wch->bch.hw;
  540. if (!(card->fmask & pots))
  541. return -ENODEV;
  542. wch->b_mode &= ~(W_B_MODE_EPCM | W_B_MODE_BSW0);
  543. WriteW6692B(wch, W_B_MODE, wch->b_mode);
  544. WriteW6692B(wch, W_B_CMDR, W_B_CMDR_RRST | W_B_CMDR_RACT |
  545. W_B_CMDR_XRST);
  546. return 0;
  547. }
  548. static int
  549. w6692_mode(struct w6692_ch *wch, u32 pr)
  550. {
  551. struct w6692_hw *card;
  552. card = wch->bch.hw;
  553. pr_debug("%s: B%d protocol %x-->%x\n", card->name,
  554. wch->bch.nr, wch->bch.state, pr);
  555. switch (pr) {
  556. case ISDN_P_NONE:
  557. if ((card->fmask & pots) && (wch->b_mode & W_B_MODE_EPCM))
  558. disable_pots(wch);
  559. wch->b_mode = 0;
  560. mISDN_clear_bchannel(&wch->bch);
  561. WriteW6692B(wch, W_B_MODE, wch->b_mode);
  562. WriteW6692B(wch, W_B_CMDR, W_B_CMDR_RRST | W_B_CMDR_XRST);
  563. test_and_clear_bit(FLG_HDLC, &wch->bch.Flags);
  564. test_and_clear_bit(FLG_TRANSPARENT, &wch->bch.Flags);
  565. break;
  566. case ISDN_P_B_RAW:
  567. wch->b_mode = W_B_MODE_MMS;
  568. WriteW6692B(wch, W_B_MODE, wch->b_mode);
  569. WriteW6692B(wch, W_B_EXIM, 0);
  570. WriteW6692B(wch, W_B_CMDR, W_B_CMDR_RRST | W_B_CMDR_RACT |
  571. W_B_CMDR_XRST);
  572. test_and_set_bit(FLG_TRANSPARENT, &wch->bch.Flags);
  573. break;
  574. case ISDN_P_B_HDLC:
  575. wch->b_mode = W_B_MODE_ITF;
  576. WriteW6692B(wch, W_B_MODE, wch->b_mode);
  577. WriteW6692B(wch, W_B_ADM1, 0xff);
  578. WriteW6692B(wch, W_B_ADM2, 0xff);
  579. WriteW6692B(wch, W_B_EXIM, 0);
  580. WriteW6692B(wch, W_B_CMDR, W_B_CMDR_RRST | W_B_CMDR_RACT |
  581. W_B_CMDR_XRST);
  582. test_and_set_bit(FLG_HDLC, &wch->bch.Flags);
  583. break;
  584. default:
  585. pr_info("%s: protocol %x not known\n", card->name, pr);
  586. return -ENOPROTOOPT;
  587. }
  588. wch->bch.state = pr;
  589. return 0;
  590. }
  591. static void
  592. send_next(struct w6692_ch *wch)
  593. {
  594. if (wch->bch.tx_skb && wch->bch.tx_idx < wch->bch.tx_skb->len) {
  595. W6692_fill_Bfifo(wch);
  596. } else {
  597. if (wch->bch.tx_skb)
  598. dev_kfree_skb(wch->bch.tx_skb);
  599. if (get_next_bframe(&wch->bch)) {
  600. W6692_fill_Bfifo(wch);
  601. test_and_clear_bit(FLG_TX_EMPTY, &wch->bch.Flags);
  602. } else if (test_bit(FLG_TX_EMPTY, &wch->bch.Flags)) {
  603. W6692_fill_Bfifo(wch);
  604. }
  605. }
  606. }
  607. static void
  608. W6692B_interrupt(struct w6692_hw *card, int ch)
  609. {
  610. struct w6692_ch *wch = &card->bc[ch];
  611. int count;
  612. u8 stat, star = 0;
  613. stat = ReadW6692B(wch, W_B_EXIR);
  614. pr_debug("%s: B%d EXIR %02x\n", card->name, wch->bch.nr, stat);
  615. if (stat & W_B_EXI_RME) {
  616. star = ReadW6692B(wch, W_B_STAR);
  617. if (star & (W_B_STAR_RDOV | W_B_STAR_CRCE | W_B_STAR_RMB)) {
  618. if ((star & W_B_STAR_RDOV) &&
  619. test_bit(FLG_ACTIVE, &wch->bch.Flags)) {
  620. pr_debug("%s: B%d RDOV proto=%x\n", card->name,
  621. wch->bch.nr, wch->bch.state);
  622. #ifdef ERROR_STATISTIC
  623. wch->bch.err_rdo++;
  624. #endif
  625. }
  626. if (test_bit(FLG_HDLC, &wch->bch.Flags)) {
  627. if (star & W_B_STAR_CRCE) {
  628. pr_debug("%s: B%d CRC error\n",
  629. card->name, wch->bch.nr);
  630. #ifdef ERROR_STATISTIC
  631. wch->bch.err_crc++;
  632. #endif
  633. }
  634. if (star & W_B_STAR_RMB) {
  635. pr_debug("%s: B%d message abort\n",
  636. card->name, wch->bch.nr);
  637. #ifdef ERROR_STATISTIC
  638. wch->bch.err_inv++;
  639. #endif
  640. }
  641. }
  642. WriteW6692B(wch, W_B_CMDR, W_B_CMDR_RACK |
  643. W_B_CMDR_RRST | W_B_CMDR_RACT);
  644. if (wch->bch.rx_skb)
  645. skb_trim(wch->bch.rx_skb, 0);
  646. } else {
  647. count = ReadW6692B(wch, W_B_RBCL) &
  648. (W_B_FIFO_THRESH - 1);
  649. if (count == 0)
  650. count = W_B_FIFO_THRESH;
  651. W6692_empty_Bfifo(wch, count);
  652. recv_Bchannel(&wch->bch, 0, false);
  653. }
  654. }
  655. if (stat & W_B_EXI_RMR) {
  656. if (!(stat & W_B_EXI_RME))
  657. star = ReadW6692B(wch, W_B_STAR);
  658. if (star & W_B_STAR_RDOV) {
  659. pr_debug("%s: B%d RDOV proto=%x\n", card->name,
  660. wch->bch.nr, wch->bch.state);
  661. #ifdef ERROR_STATISTIC
  662. wch->bch.err_rdo++;
  663. #endif
  664. WriteW6692B(wch, W_B_CMDR, W_B_CMDR_RACK |
  665. W_B_CMDR_RRST | W_B_CMDR_RACT);
  666. } else {
  667. W6692_empty_Bfifo(wch, W_B_FIFO_THRESH);
  668. if (test_bit(FLG_TRANSPARENT, &wch->bch.Flags))
  669. recv_Bchannel(&wch->bch, 0, false);
  670. }
  671. }
  672. if (stat & W_B_EXI_RDOV) {
  673. /* only if it is not handled yet */
  674. if (!(star & W_B_STAR_RDOV)) {
  675. pr_debug("%s: B%d RDOV IRQ proto=%x\n", card->name,
  676. wch->bch.nr, wch->bch.state);
  677. #ifdef ERROR_STATISTIC
  678. wch->bch.err_rdo++;
  679. #endif
  680. WriteW6692B(wch, W_B_CMDR, W_B_CMDR_RACK |
  681. W_B_CMDR_RRST | W_B_CMDR_RACT);
  682. }
  683. }
  684. if (stat & W_B_EXI_XFR) {
  685. if (!(stat & (W_B_EXI_RME | W_B_EXI_RMR))) {
  686. star = ReadW6692B(wch, W_B_STAR);
  687. pr_debug("%s: B%d star %02x\n", card->name,
  688. wch->bch.nr, star);
  689. }
  690. if (star & W_B_STAR_XDOW) {
  691. pr_warning("%s: B%d XDOW proto=%x\n", card->name,
  692. wch->bch.nr, wch->bch.state);
  693. #ifdef ERROR_STATISTIC
  694. wch->bch.err_xdu++;
  695. #endif
  696. WriteW6692B(wch, W_B_CMDR, W_B_CMDR_XRST |
  697. W_B_CMDR_RACT);
  698. /* resend */
  699. if (wch->bch.tx_skb) {
  700. if (!test_bit(FLG_TRANSPARENT, &wch->bch.Flags))
  701. wch->bch.tx_idx = 0;
  702. }
  703. }
  704. send_next(wch);
  705. if (star & W_B_STAR_XDOW)
  706. return; /* handle XDOW only once */
  707. }
  708. if (stat & W_B_EXI_XDUN) {
  709. pr_warning("%s: B%d XDUN proto=%x\n", card->name,
  710. wch->bch.nr, wch->bch.state);
  711. #ifdef ERROR_STATISTIC
  712. wch->bch.err_xdu++;
  713. #endif
  714. /* resend - no XRST needed */
  715. if (wch->bch.tx_skb) {
  716. if (!test_bit(FLG_TRANSPARENT, &wch->bch.Flags))
  717. wch->bch.tx_idx = 0;
  718. } else if (test_bit(FLG_FILLEMPTY, &wch->bch.Flags)) {
  719. test_and_set_bit(FLG_TX_EMPTY, &wch->bch.Flags);
  720. }
  721. send_next(wch);
  722. }
  723. }
  724. static irqreturn_t
  725. w6692_irq(int intno, void *dev_id)
  726. {
  727. struct w6692_hw *card = dev_id;
  728. u8 ista;
  729. spin_lock(&card->lock);
  730. ista = ReadW6692(card, W_ISTA);
  731. if ((ista | card->imask) == card->imask) {
  732. /* possible a shared IRQ reqest */
  733. spin_unlock(&card->lock);
  734. return IRQ_NONE;
  735. }
  736. card->irqcnt++;
  737. pr_debug("%s: ista %02x\n", card->name, ista);
  738. ista &= ~card->imask;
  739. if (ista & W_INT_B1_EXI)
  740. W6692B_interrupt(card, 0);
  741. if (ista & W_INT_B2_EXI)
  742. W6692B_interrupt(card, 1);
  743. if (ista & W_INT_D_RME)
  744. handle_rxD(card);
  745. if (ista & W_INT_D_RMR)
  746. W6692_empty_Dfifo(card, W_D_FIFO_THRESH);
  747. if (ista & W_INT_D_XFR)
  748. handle_txD(card);
  749. if (ista & W_INT_D_EXI)
  750. handle_statusD(card);
  751. if (ista & (W_INT_XINT0 | W_INT_XINT1)) /* XINT0/1 - never */
  752. pr_debug("%s: W6692 spurious XINT!\n", card->name);
  753. /* End IRQ Handler */
  754. spin_unlock(&card->lock);
  755. return IRQ_HANDLED;
  756. }
  757. static void
  758. dbusy_timer_handler(struct timer_list *t)
  759. {
  760. struct dchannel *dch = from_timer(dch, t, timer);
  761. struct w6692_hw *card = dch->hw;
  762. int rbch, star;
  763. u_long flags;
  764. if (test_bit(FLG_BUSY_TIMER, &dch->Flags)) {
  765. spin_lock_irqsave(&card->lock, flags);
  766. rbch = ReadW6692(card, W_D_RBCH);
  767. star = ReadW6692(card, W_D_STAR);
  768. pr_debug("%s: D-Channel Busy RBCH %02x STAR %02x\n",
  769. card->name, rbch, star);
  770. if (star & W_D_STAR_XBZ) /* D-Channel Busy */
  771. test_and_set_bit(FLG_L1_BUSY, &dch->Flags);
  772. else {
  773. /* discard frame; reset transceiver */
  774. test_and_clear_bit(FLG_BUSY_TIMER, &dch->Flags);
  775. if (dch->tx_idx)
  776. dch->tx_idx = 0;
  777. else
  778. pr_info("%s: W6692 D-Channel Busy no tx_idx\n",
  779. card->name);
  780. /* Transmitter reset */
  781. WriteW6692(card, W_D_CMDR, W_D_CMDR_XRST);
  782. }
  783. spin_unlock_irqrestore(&card->lock, flags);
  784. }
  785. }
  786. static void initW6692(struct w6692_hw *card)
  787. {
  788. u8 val;
  789. timer_setup(&card->dch.timer, dbusy_timer_handler, 0);
  790. w6692_mode(&card->bc[0], ISDN_P_NONE);
  791. w6692_mode(&card->bc[1], ISDN_P_NONE);
  792. WriteW6692(card, W_D_CTL, 0x00);
  793. disable_hwirq(card);
  794. WriteW6692(card, W_D_SAM, 0xff);
  795. WriteW6692(card, W_D_TAM, 0xff);
  796. WriteW6692(card, W_D_MODE, W_D_MODE_RACT);
  797. card->state = W_L1CMD_RST;
  798. ph_command(card, W_L1CMD_RST);
  799. ph_command(card, W_L1CMD_ECK);
  800. /* enable all IRQ but extern */
  801. card->imask = 0x18;
  802. WriteW6692(card, W_D_EXIM, 0x00);
  803. WriteW6692B(&card->bc[0], W_B_EXIM, 0);
  804. WriteW6692B(&card->bc[1], W_B_EXIM, 0);
  805. /* Reset D-chan receiver and transmitter */
  806. WriteW6692(card, W_D_CMDR, W_D_CMDR_RRST | W_D_CMDR_XRST);
  807. /* Reset B-chan receiver and transmitter */
  808. WriteW6692B(&card->bc[0], W_B_CMDR, W_B_CMDR_RRST | W_B_CMDR_XRST);
  809. WriteW6692B(&card->bc[1], W_B_CMDR, W_B_CMDR_RRST | W_B_CMDR_XRST);
  810. /* enable peripheral */
  811. if (card->subtype == W6692_USR) {
  812. /* seems that USR implemented some power control features
  813. * Pin 79 is connected to the oscilator circuit so we
  814. * have to handle it here
  815. */
  816. card->pctl = 0x80;
  817. card->xdata = 0;
  818. WriteW6692(card, W_PCTL, card->pctl);
  819. WriteW6692(card, W_XDATA, card->xdata);
  820. } else {
  821. card->pctl = W_PCTL_OE5 | W_PCTL_OE4 | W_PCTL_OE2 |
  822. W_PCTL_OE1 | W_PCTL_OE0;
  823. card->xaddr = 0x00;/* all sw off */
  824. if (card->fmask & pots)
  825. card->xdata |= 0x06; /* POWER UP/ LED OFF / ALAW */
  826. if (card->fmask & led)
  827. card->xdata |= 0x04; /* LED OFF */
  828. if ((card->fmask & pots) || (card->fmask & led)) {
  829. WriteW6692(card, W_PCTL, card->pctl);
  830. WriteW6692(card, W_XADDR, card->xaddr);
  831. WriteW6692(card, W_XDATA, card->xdata);
  832. val = ReadW6692(card, W_XADDR);
  833. if (debug & DEBUG_HW)
  834. pr_notice("%s: W_XADDR=%02x\n",
  835. card->name, val);
  836. }
  837. }
  838. }
  839. static void
  840. reset_w6692(struct w6692_hw *card)
  841. {
  842. WriteW6692(card, W_D_CTL, W_D_CTL_SRST);
  843. mdelay(10);
  844. WriteW6692(card, W_D_CTL, 0);
  845. }
  846. static int
  847. init_card(struct w6692_hw *card)
  848. {
  849. int cnt = 3;
  850. u_long flags;
  851. spin_lock_irqsave(&card->lock, flags);
  852. disable_hwirq(card);
  853. spin_unlock_irqrestore(&card->lock, flags);
  854. if (request_irq(card->irq, w6692_irq, IRQF_SHARED, card->name, card)) {
  855. pr_info("%s: couldn't get interrupt %d\n", card->name,
  856. card->irq);
  857. return -EIO;
  858. }
  859. while (cnt--) {
  860. spin_lock_irqsave(&card->lock, flags);
  861. initW6692(card);
  862. enable_hwirq(card);
  863. spin_unlock_irqrestore(&card->lock, flags);
  864. /* Timeout 10ms */
  865. msleep_interruptible(10);
  866. if (debug & DEBUG_HW)
  867. pr_notice("%s: IRQ %d count %d\n", card->name,
  868. card->irq, card->irqcnt);
  869. if (!card->irqcnt) {
  870. pr_info("%s: IRQ(%d) getting no IRQs during init %d\n",
  871. card->name, card->irq, 3 - cnt);
  872. reset_w6692(card);
  873. } else
  874. return 0;
  875. }
  876. free_irq(card->irq, card);
  877. return -EIO;
  878. }
  879. static int
  880. w6692_l2l1B(struct mISDNchannel *ch, struct sk_buff *skb)
  881. {
  882. struct bchannel *bch = container_of(ch, struct bchannel, ch);
  883. struct w6692_ch *bc = container_of(bch, struct w6692_ch, bch);
  884. struct w6692_hw *card = bch->hw;
  885. int ret = -EINVAL;
  886. struct mISDNhead *hh = mISDN_HEAD_P(skb);
  887. unsigned long flags;
  888. switch (hh->prim) {
  889. case PH_DATA_REQ:
  890. spin_lock_irqsave(&card->lock, flags);
  891. ret = bchannel_senddata(bch, skb);
  892. if (ret > 0) { /* direct TX */
  893. ret = 0;
  894. W6692_fill_Bfifo(bc);
  895. }
  896. spin_unlock_irqrestore(&card->lock, flags);
  897. return ret;
  898. case PH_ACTIVATE_REQ:
  899. spin_lock_irqsave(&card->lock, flags);
  900. if (!test_and_set_bit(FLG_ACTIVE, &bch->Flags))
  901. ret = w6692_mode(bc, ch->protocol);
  902. else
  903. ret = 0;
  904. spin_unlock_irqrestore(&card->lock, flags);
  905. if (!ret)
  906. _queue_data(ch, PH_ACTIVATE_IND, MISDN_ID_ANY, 0,
  907. NULL, GFP_KERNEL);
  908. break;
  909. case PH_DEACTIVATE_REQ:
  910. spin_lock_irqsave(&card->lock, flags);
  911. mISDN_clear_bchannel(bch);
  912. w6692_mode(bc, ISDN_P_NONE);
  913. spin_unlock_irqrestore(&card->lock, flags);
  914. _queue_data(ch, PH_DEACTIVATE_IND, MISDN_ID_ANY, 0,
  915. NULL, GFP_KERNEL);
  916. ret = 0;
  917. break;
  918. default:
  919. pr_info("%s: %s unknown prim(%x,%x)\n",
  920. card->name, __func__, hh->prim, hh->id);
  921. ret = -EINVAL;
  922. }
  923. if (!ret)
  924. dev_kfree_skb(skb);
  925. return ret;
  926. }
  927. static int
  928. channel_bctrl(struct bchannel *bch, struct mISDN_ctrl_req *cq)
  929. {
  930. return mISDN_ctrl_bchannel(bch, cq);
  931. }
  932. static int
  933. open_bchannel(struct w6692_hw *card, struct channel_req *rq)
  934. {
  935. struct bchannel *bch;
  936. if (rq->adr.channel == 0 || rq->adr.channel > 2)
  937. return -EINVAL;
  938. if (rq->protocol == ISDN_P_NONE)
  939. return -EINVAL;
  940. bch = &card->bc[rq->adr.channel - 1].bch;
  941. if (test_and_set_bit(FLG_OPEN, &bch->Flags))
  942. return -EBUSY; /* b-channel can be only open once */
  943. bch->ch.protocol = rq->protocol;
  944. rq->ch = &bch->ch;
  945. return 0;
  946. }
  947. static int
  948. channel_ctrl(struct w6692_hw *card, struct mISDN_ctrl_req *cq)
  949. {
  950. int ret = 0;
  951. switch (cq->op) {
  952. case MISDN_CTRL_GETOP:
  953. cq->op = MISDN_CTRL_L1_TIMER3;
  954. break;
  955. case MISDN_CTRL_L1_TIMER3:
  956. ret = l1_event(card->dch.l1, HW_TIMER3_VALUE | (cq->p1 & 0xff));
  957. break;
  958. default:
  959. pr_info("%s: unknown CTRL OP %x\n", card->name, cq->op);
  960. ret = -EINVAL;
  961. break;
  962. }
  963. return ret;
  964. }
  965. static int
  966. w6692_bctrl(struct mISDNchannel *ch, u32 cmd, void *arg)
  967. {
  968. struct bchannel *bch = container_of(ch, struct bchannel, ch);
  969. struct w6692_ch *bc = container_of(bch, struct w6692_ch, bch);
  970. struct w6692_hw *card = bch->hw;
  971. int ret = -EINVAL;
  972. u_long flags;
  973. pr_debug("%s: %s cmd:%x %p\n", card->name, __func__, cmd, arg);
  974. switch (cmd) {
  975. case CLOSE_CHANNEL:
  976. test_and_clear_bit(FLG_OPEN, &bch->Flags);
  977. cancel_work_sync(&bch->workq);
  978. spin_lock_irqsave(&card->lock, flags);
  979. mISDN_clear_bchannel(bch);
  980. w6692_mode(bc, ISDN_P_NONE);
  981. spin_unlock_irqrestore(&card->lock, flags);
  982. ch->protocol = ISDN_P_NONE;
  983. ch->peer = NULL;
  984. module_put(THIS_MODULE);
  985. ret = 0;
  986. break;
  987. case CONTROL_CHANNEL:
  988. ret = channel_bctrl(bch, arg);
  989. break;
  990. default:
  991. pr_info("%s: %s unknown prim(%x)\n",
  992. card->name, __func__, cmd);
  993. }
  994. return ret;
  995. }
  996. static int
  997. w6692_l2l1D(struct mISDNchannel *ch, struct sk_buff *skb)
  998. {
  999. struct mISDNdevice *dev = container_of(ch, struct mISDNdevice, D);
  1000. struct dchannel *dch = container_of(dev, struct dchannel, dev);
  1001. struct w6692_hw *card = container_of(dch, struct w6692_hw, dch);
  1002. int ret = -EINVAL;
  1003. struct mISDNhead *hh = mISDN_HEAD_P(skb);
  1004. u32 id;
  1005. u_long flags;
  1006. switch (hh->prim) {
  1007. case PH_DATA_REQ:
  1008. spin_lock_irqsave(&card->lock, flags);
  1009. ret = dchannel_senddata(dch, skb);
  1010. if (ret > 0) { /* direct TX */
  1011. id = hh->id; /* skb can be freed */
  1012. W6692_fill_Dfifo(card);
  1013. ret = 0;
  1014. spin_unlock_irqrestore(&card->lock, flags);
  1015. queue_ch_frame(ch, PH_DATA_CNF, id, NULL);
  1016. } else
  1017. spin_unlock_irqrestore(&card->lock, flags);
  1018. return ret;
  1019. case PH_ACTIVATE_REQ:
  1020. ret = l1_event(dch->l1, hh->prim);
  1021. break;
  1022. case PH_DEACTIVATE_REQ:
  1023. test_and_clear_bit(FLG_L2_ACTIVATED, &dch->Flags);
  1024. ret = l1_event(dch->l1, hh->prim);
  1025. break;
  1026. }
  1027. if (!ret)
  1028. dev_kfree_skb(skb);
  1029. return ret;
  1030. }
  1031. static int
  1032. w6692_l1callback(struct dchannel *dch, u32 cmd)
  1033. {
  1034. struct w6692_hw *card = container_of(dch, struct w6692_hw, dch);
  1035. u_long flags;
  1036. pr_debug("%s: cmd(%x) state(%02x)\n", card->name, cmd, card->state);
  1037. switch (cmd) {
  1038. case INFO3_P8:
  1039. spin_lock_irqsave(&card->lock, flags);
  1040. ph_command(card, W_L1CMD_AR8);
  1041. spin_unlock_irqrestore(&card->lock, flags);
  1042. break;
  1043. case INFO3_P10:
  1044. spin_lock_irqsave(&card->lock, flags);
  1045. ph_command(card, W_L1CMD_AR10);
  1046. spin_unlock_irqrestore(&card->lock, flags);
  1047. break;
  1048. case HW_RESET_REQ:
  1049. spin_lock_irqsave(&card->lock, flags);
  1050. if (card->state != W_L1IND_DRD)
  1051. ph_command(card, W_L1CMD_RST);
  1052. ph_command(card, W_L1CMD_ECK);
  1053. spin_unlock_irqrestore(&card->lock, flags);
  1054. break;
  1055. case HW_DEACT_REQ:
  1056. skb_queue_purge(&dch->squeue);
  1057. if (dch->tx_skb) {
  1058. dev_kfree_skb(dch->tx_skb);
  1059. dch->tx_skb = NULL;
  1060. }
  1061. dch->tx_idx = 0;
  1062. if (dch->rx_skb) {
  1063. dev_kfree_skb(dch->rx_skb);
  1064. dch->rx_skb = NULL;
  1065. }
  1066. test_and_clear_bit(FLG_TX_BUSY, &dch->Flags);
  1067. if (test_and_clear_bit(FLG_BUSY_TIMER, &dch->Flags))
  1068. del_timer(&dch->timer);
  1069. break;
  1070. case HW_POWERUP_REQ:
  1071. spin_lock_irqsave(&card->lock, flags);
  1072. ph_command(card, W_L1CMD_ECK);
  1073. spin_unlock_irqrestore(&card->lock, flags);
  1074. break;
  1075. case PH_ACTIVATE_IND:
  1076. test_and_set_bit(FLG_ACTIVE, &dch->Flags);
  1077. _queue_data(&dch->dev.D, cmd, MISDN_ID_ANY, 0, NULL,
  1078. GFP_ATOMIC);
  1079. break;
  1080. case PH_DEACTIVATE_IND:
  1081. test_and_clear_bit(FLG_ACTIVE, &dch->Flags);
  1082. _queue_data(&dch->dev.D, cmd, MISDN_ID_ANY, 0, NULL,
  1083. GFP_ATOMIC);
  1084. break;
  1085. default:
  1086. pr_debug("%s: %s unknown command %x\n", card->name,
  1087. __func__, cmd);
  1088. return -1;
  1089. }
  1090. return 0;
  1091. }
  1092. static int
  1093. open_dchannel(struct w6692_hw *card, struct channel_req *rq, void *caller)
  1094. {
  1095. pr_debug("%s: %s dev(%d) open from %p\n", card->name, __func__,
  1096. card->dch.dev.id, caller);
  1097. if (rq->protocol != ISDN_P_TE_S0)
  1098. return -EINVAL;
  1099. if (rq->adr.channel == 1)
  1100. /* E-Channel not supported */
  1101. return -EINVAL;
  1102. rq->ch = &card->dch.dev.D;
  1103. rq->ch->protocol = rq->protocol;
  1104. if (card->dch.state == 7)
  1105. _queue_data(rq->ch, PH_ACTIVATE_IND, MISDN_ID_ANY,
  1106. 0, NULL, GFP_KERNEL);
  1107. return 0;
  1108. }
  1109. static int
  1110. w6692_dctrl(struct mISDNchannel *ch, u32 cmd, void *arg)
  1111. {
  1112. struct mISDNdevice *dev = container_of(ch, struct mISDNdevice, D);
  1113. struct dchannel *dch = container_of(dev, struct dchannel, dev);
  1114. struct w6692_hw *card = container_of(dch, struct w6692_hw, dch);
  1115. struct channel_req *rq;
  1116. int err = 0;
  1117. pr_debug("%s: DCTRL: %x %p\n", card->name, cmd, arg);
  1118. switch (cmd) {
  1119. case OPEN_CHANNEL:
  1120. rq = arg;
  1121. if (rq->protocol == ISDN_P_TE_S0)
  1122. err = open_dchannel(card, rq, __builtin_return_address(0));
  1123. else
  1124. err = open_bchannel(card, rq);
  1125. if (err)
  1126. break;
  1127. if (!try_module_get(THIS_MODULE))
  1128. pr_info("%s: cannot get module\n", card->name);
  1129. break;
  1130. case CLOSE_CHANNEL:
  1131. pr_debug("%s: dev(%d) close from %p\n", card->name,
  1132. dch->dev.id, __builtin_return_address(0));
  1133. module_put(THIS_MODULE);
  1134. break;
  1135. case CONTROL_CHANNEL:
  1136. err = channel_ctrl(card, arg);
  1137. break;
  1138. default:
  1139. pr_debug("%s: unknown DCTRL command %x\n", card->name, cmd);
  1140. return -EINVAL;
  1141. }
  1142. return err;
  1143. }
  1144. static int
  1145. setup_w6692(struct w6692_hw *card)
  1146. {
  1147. u32 val;
  1148. if (!request_region(card->addr, 256, card->name)) {
  1149. pr_info("%s: config port %x-%x already in use\n", card->name,
  1150. card->addr, card->addr + 255);
  1151. return -EIO;
  1152. }
  1153. W6692Version(card);
  1154. card->bc[0].addr = card->addr;
  1155. card->bc[1].addr = card->addr + 0x40;
  1156. val = ReadW6692(card, W_ISTA);
  1157. if (debug & DEBUG_HW)
  1158. pr_notice("%s ISTA=%02x\n", card->name, val);
  1159. val = ReadW6692(card, W_IMASK);
  1160. if (debug & DEBUG_HW)
  1161. pr_notice("%s IMASK=%02x\n", card->name, val);
  1162. val = ReadW6692(card, W_D_EXIR);
  1163. if (debug & DEBUG_HW)
  1164. pr_notice("%s D_EXIR=%02x\n", card->name, val);
  1165. val = ReadW6692(card, W_D_EXIM);
  1166. if (debug & DEBUG_HW)
  1167. pr_notice("%s D_EXIM=%02x\n", card->name, val);
  1168. val = ReadW6692(card, W_D_RSTA);
  1169. if (debug & DEBUG_HW)
  1170. pr_notice("%s D_RSTA=%02x\n", card->name, val);
  1171. return 0;
  1172. }
  1173. static void
  1174. release_card(struct w6692_hw *card)
  1175. {
  1176. u_long flags;
  1177. spin_lock_irqsave(&card->lock, flags);
  1178. disable_hwirq(card);
  1179. w6692_mode(&card->bc[0], ISDN_P_NONE);
  1180. w6692_mode(&card->bc[1], ISDN_P_NONE);
  1181. if ((card->fmask & led) || card->subtype == W6692_USR) {
  1182. card->xdata |= 0x04; /* LED OFF */
  1183. WriteW6692(card, W_XDATA, card->xdata);
  1184. }
  1185. spin_unlock_irqrestore(&card->lock, flags);
  1186. free_irq(card->irq, card);
  1187. l1_event(card->dch.l1, CLOSE_CHANNEL);
  1188. mISDN_unregister_device(&card->dch.dev);
  1189. release_region(card->addr, 256);
  1190. mISDN_freebchannel(&card->bc[1].bch);
  1191. mISDN_freebchannel(&card->bc[0].bch);
  1192. mISDN_freedchannel(&card->dch);
  1193. write_lock_irqsave(&card_lock, flags);
  1194. list_del(&card->list);
  1195. write_unlock_irqrestore(&card_lock, flags);
  1196. pci_disable_device(card->pdev);
  1197. pci_set_drvdata(card->pdev, NULL);
  1198. kfree(card);
  1199. }
  1200. static int
  1201. setup_instance(struct w6692_hw *card)
  1202. {
  1203. int i, err;
  1204. u_long flags;
  1205. snprintf(card->name, MISDN_MAX_IDLEN - 1, "w6692.%d", w6692_cnt + 1);
  1206. write_lock_irqsave(&card_lock, flags);
  1207. list_add_tail(&card->list, &Cards);
  1208. write_unlock_irqrestore(&card_lock, flags);
  1209. card->fmask = (1 << w6692_cnt);
  1210. _set_debug(card);
  1211. spin_lock_init(&card->lock);
  1212. mISDN_initdchannel(&card->dch, MAX_DFRAME_LEN_L1, W6692_ph_bh);
  1213. card->dch.dev.Dprotocols = (1 << ISDN_P_TE_S0);
  1214. card->dch.dev.D.send = w6692_l2l1D;
  1215. card->dch.dev.D.ctrl = w6692_dctrl;
  1216. card->dch.dev.Bprotocols = (1 << (ISDN_P_B_RAW & ISDN_P_B_MASK)) |
  1217. (1 << (ISDN_P_B_HDLC & ISDN_P_B_MASK));
  1218. card->dch.hw = card;
  1219. card->dch.dev.nrbchan = 2;
  1220. for (i = 0; i < 2; i++) {
  1221. mISDN_initbchannel(&card->bc[i].bch, MAX_DATA_MEM,
  1222. W_B_FIFO_THRESH);
  1223. card->bc[i].bch.hw = card;
  1224. card->bc[i].bch.nr = i + 1;
  1225. card->bc[i].bch.ch.nr = i + 1;
  1226. card->bc[i].bch.ch.send = w6692_l2l1B;
  1227. card->bc[i].bch.ch.ctrl = w6692_bctrl;
  1228. set_channelmap(i + 1, card->dch.dev.channelmap);
  1229. list_add(&card->bc[i].bch.ch.list, &card->dch.dev.bchannels);
  1230. }
  1231. err = setup_w6692(card);
  1232. if (err)
  1233. goto error_setup;
  1234. err = mISDN_register_device(&card->dch.dev, &card->pdev->dev,
  1235. card->name);
  1236. if (err)
  1237. goto error_reg;
  1238. err = init_card(card);
  1239. if (err)
  1240. goto error_init;
  1241. err = create_l1(&card->dch, w6692_l1callback);
  1242. if (!err) {
  1243. w6692_cnt++;
  1244. pr_notice("W6692 %d cards installed\n", w6692_cnt);
  1245. return 0;
  1246. }
  1247. free_irq(card->irq, card);
  1248. error_init:
  1249. mISDN_unregister_device(&card->dch.dev);
  1250. error_reg:
  1251. release_region(card->addr, 256);
  1252. error_setup:
  1253. mISDN_freebchannel(&card->bc[1].bch);
  1254. mISDN_freebchannel(&card->bc[0].bch);
  1255. mISDN_freedchannel(&card->dch);
  1256. write_lock_irqsave(&card_lock, flags);
  1257. list_del(&card->list);
  1258. write_unlock_irqrestore(&card_lock, flags);
  1259. kfree(card);
  1260. return err;
  1261. }
  1262. static int
  1263. w6692_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
  1264. {
  1265. int err = -ENOMEM;
  1266. struct w6692_hw *card;
  1267. struct w6692map *m = (struct w6692map *)ent->driver_data;
  1268. card = kzalloc(sizeof(struct w6692_hw), GFP_KERNEL);
  1269. if (!card) {
  1270. pr_info("No kmem for w6692 card\n");
  1271. return err;
  1272. }
  1273. card->pdev = pdev;
  1274. card->subtype = m->subtype;
  1275. err = pci_enable_device(pdev);
  1276. if (err) {
  1277. kfree(card);
  1278. return err;
  1279. }
  1280. printk(KERN_INFO "mISDN_w6692: found adapter %s at %s\n",
  1281. m->name, pci_name(pdev));
  1282. card->addr = pci_resource_start(pdev, 1);
  1283. card->irq = pdev->irq;
  1284. pci_set_drvdata(pdev, card);
  1285. err = setup_instance(card);
  1286. if (err)
  1287. pci_set_drvdata(pdev, NULL);
  1288. return err;
  1289. }
  1290. static void
  1291. w6692_remove_pci(struct pci_dev *pdev)
  1292. {
  1293. struct w6692_hw *card = pci_get_drvdata(pdev);
  1294. if (card)
  1295. release_card(card);
  1296. else
  1297. if (debug)
  1298. pr_notice("%s: drvdata already removed\n", __func__);
  1299. }
  1300. static const struct pci_device_id w6692_ids[] = {
  1301. { PCI_VENDOR_ID_DYNALINK, PCI_DEVICE_ID_DYNALINK_IS64PH,
  1302. PCI_ANY_ID, PCI_ANY_ID, 0, 0, (ulong)&w6692_map[0]},
  1303. { PCI_VENDOR_ID_WINBOND2, PCI_DEVICE_ID_WINBOND2_6692,
  1304. PCI_VENDOR_ID_USR, PCI_DEVICE_ID_USR_6692, 0, 0,
  1305. (ulong)&w6692_map[2]},
  1306. { PCI_VENDOR_ID_WINBOND2, PCI_DEVICE_ID_WINBOND2_6692,
  1307. PCI_ANY_ID, PCI_ANY_ID, 0, 0, (ulong)&w6692_map[1]},
  1308. { }
  1309. };
  1310. MODULE_DEVICE_TABLE(pci, w6692_ids);
  1311. static struct pci_driver w6692_driver = {
  1312. .name = "w6692",
  1313. .probe = w6692_probe,
  1314. .remove = w6692_remove_pci,
  1315. .id_table = w6692_ids,
  1316. };
  1317. static int __init w6692_init(void)
  1318. {
  1319. int err;
  1320. pr_notice("Winbond W6692 PCI driver Rev. %s\n", W6692_REV);
  1321. err = pci_register_driver(&w6692_driver);
  1322. return err;
  1323. }
  1324. static void __exit w6692_cleanup(void)
  1325. {
  1326. pci_unregister_driver(&w6692_driver);
  1327. }
  1328. module_init(w6692_init);
  1329. module_exit(w6692_cleanup);