avmfritz.c 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155
  1. /*
  2. * avm_fritz.c low level stuff for AVM FRITZ!CARD PCI ISDN cards
  3. * Thanks to AVM, Berlin for informations
  4. *
  5. * Author Karsten Keil <keil@isdn4linux.de>
  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 <asm/unaligned.h>
  30. #include "ipac.h"
  31. #define AVMFRITZ_REV "2.1"
  32. static int AVM_cnt;
  33. static int debug;
  34. enum {
  35. AVM_FRITZ_PCI,
  36. AVM_FRITZ_PCIV2,
  37. };
  38. #define HDLC_FIFO 0x0
  39. #define HDLC_STATUS 0x4
  40. #define CHIP_WINDOW 0x10
  41. #define CHIP_INDEX 0x4
  42. #define AVM_HDLC_1 0x00
  43. #define AVM_HDLC_2 0x01
  44. #define AVM_ISAC_FIFO 0x02
  45. #define AVM_ISAC_REG_LOW 0x04
  46. #define AVM_ISAC_REG_HIGH 0x06
  47. #define AVM_STATUS0_IRQ_ISAC 0x01
  48. #define AVM_STATUS0_IRQ_HDLC 0x02
  49. #define AVM_STATUS0_IRQ_TIMER 0x04
  50. #define AVM_STATUS0_IRQ_MASK 0x07
  51. #define AVM_STATUS0_RESET 0x01
  52. #define AVM_STATUS0_DIS_TIMER 0x02
  53. #define AVM_STATUS0_RES_TIMER 0x04
  54. #define AVM_STATUS0_ENA_IRQ 0x08
  55. #define AVM_STATUS0_TESTBIT 0x10
  56. #define AVM_STATUS1_INT_SEL 0x0f
  57. #define AVM_STATUS1_ENA_IOM 0x80
  58. #define HDLC_MODE_ITF_FLG 0x01
  59. #define HDLC_MODE_TRANS 0x02
  60. #define HDLC_MODE_CCR_7 0x04
  61. #define HDLC_MODE_CCR_16 0x08
  62. #define HDLC_MODE_TESTLOOP 0x80
  63. #define HDLC_INT_XPR 0x80
  64. #define HDLC_INT_XDU 0x40
  65. #define HDLC_INT_RPR 0x20
  66. #define HDLC_INT_MASK 0xE0
  67. #define HDLC_STAT_RME 0x01
  68. #define HDLC_STAT_RDO 0x10
  69. #define HDLC_STAT_CRCVFRRAB 0x0E
  70. #define HDLC_STAT_CRCVFR 0x06
  71. #define HDLC_STAT_RML_MASK 0x3f00
  72. #define HDLC_CMD_XRS 0x80
  73. #define HDLC_CMD_XME 0x01
  74. #define HDLC_CMD_RRS 0x20
  75. #define HDLC_CMD_XML_MASK 0x3f00
  76. #define HDLC_FIFO_SIZE 32
  77. /* Fritz PCI v2.0 */
  78. #define AVM_HDLC_FIFO_1 0x10
  79. #define AVM_HDLC_FIFO_2 0x18
  80. #define AVM_HDLC_STATUS_1 0x14
  81. #define AVM_HDLC_STATUS_2 0x1c
  82. #define AVM_ISACX_INDEX 0x04
  83. #define AVM_ISACX_DATA 0x08
  84. /* data struct */
  85. #define LOG_SIZE 63
  86. struct hdlc_stat_reg {
  87. #ifdef __BIG_ENDIAN
  88. u8 fill;
  89. u8 mode;
  90. u8 xml;
  91. u8 cmd;
  92. #else
  93. u8 cmd;
  94. u8 xml;
  95. u8 mode;
  96. u8 fill;
  97. #endif
  98. } __attribute__((packed));
  99. struct hdlc_hw {
  100. union {
  101. u32 ctrl;
  102. struct hdlc_stat_reg sr;
  103. } ctrl;
  104. u32 stat;
  105. };
  106. struct fritzcard {
  107. struct list_head list;
  108. struct pci_dev *pdev;
  109. char name[MISDN_MAX_IDLEN];
  110. u8 type;
  111. u8 ctrlreg;
  112. u16 irq;
  113. u32 irqcnt;
  114. u32 addr;
  115. spinlock_t lock; /* hw lock */
  116. struct isac_hw isac;
  117. struct hdlc_hw hdlc[2];
  118. struct bchannel bch[2];
  119. char log[LOG_SIZE + 1];
  120. };
  121. static LIST_HEAD(Cards);
  122. static DEFINE_RWLOCK(card_lock); /* protect Cards */
  123. static void
  124. _set_debug(struct fritzcard *card)
  125. {
  126. card->isac.dch.debug = debug;
  127. card->bch[0].debug = debug;
  128. card->bch[1].debug = debug;
  129. }
  130. static int
  131. set_debug(const char *val, struct kernel_param *kp)
  132. {
  133. int ret;
  134. struct fritzcard *card;
  135. ret = param_set_uint(val, kp);
  136. if (!ret) {
  137. read_lock(&card_lock);
  138. list_for_each_entry(card, &Cards, list)
  139. _set_debug(card);
  140. read_unlock(&card_lock);
  141. }
  142. return ret;
  143. }
  144. MODULE_AUTHOR("Karsten Keil");
  145. MODULE_LICENSE("GPL v2");
  146. MODULE_VERSION(AVMFRITZ_REV);
  147. module_param_call(debug, set_debug, param_get_uint, &debug, S_IRUGO | S_IWUSR);
  148. MODULE_PARM_DESC(debug, "avmfritz debug mask");
  149. /* Interface functions */
  150. static u8
  151. ReadISAC_V1(void *p, u8 offset)
  152. {
  153. struct fritzcard *fc = p;
  154. u8 idx = (offset > 0x2f) ? AVM_ISAC_REG_HIGH : AVM_ISAC_REG_LOW;
  155. outb(idx, fc->addr + CHIP_INDEX);
  156. return inb(fc->addr + CHIP_WINDOW + (offset & 0xf));
  157. }
  158. static void
  159. WriteISAC_V1(void *p, u8 offset, u8 value)
  160. {
  161. struct fritzcard *fc = p;
  162. u8 idx = (offset > 0x2f) ? AVM_ISAC_REG_HIGH : AVM_ISAC_REG_LOW;
  163. outb(idx, fc->addr + CHIP_INDEX);
  164. outb(value, fc->addr + CHIP_WINDOW + (offset & 0xf));
  165. }
  166. static void
  167. ReadFiFoISAC_V1(void *p, u8 off, u8 *data, int size)
  168. {
  169. struct fritzcard *fc = p;
  170. outb(AVM_ISAC_FIFO, fc->addr + CHIP_INDEX);
  171. insb(fc->addr + CHIP_WINDOW, data, size);
  172. }
  173. static void
  174. WriteFiFoISAC_V1(void *p, u8 off, u8 *data, int size)
  175. {
  176. struct fritzcard *fc = p;
  177. outb(AVM_ISAC_FIFO, fc->addr + CHIP_INDEX);
  178. outsb(fc->addr + CHIP_WINDOW, data, size);
  179. }
  180. static u8
  181. ReadISAC_V2(void *p, u8 offset)
  182. {
  183. struct fritzcard *fc = p;
  184. outl(offset, fc->addr + AVM_ISACX_INDEX);
  185. return 0xff & inl(fc->addr + AVM_ISACX_DATA);
  186. }
  187. static void
  188. WriteISAC_V2(void *p, u8 offset, u8 value)
  189. {
  190. struct fritzcard *fc = p;
  191. outl(offset, fc->addr + AVM_ISACX_INDEX);
  192. outl(value, fc->addr + AVM_ISACX_DATA);
  193. }
  194. static void
  195. ReadFiFoISAC_V2(void *p, u8 off, u8 *data, int size)
  196. {
  197. struct fritzcard *fc = p;
  198. int i;
  199. outl(off, fc->addr + AVM_ISACX_INDEX);
  200. for (i = 0; i < size; i++)
  201. data[i] = 0xff & inl(fc->addr + AVM_ISACX_DATA);
  202. }
  203. static void
  204. WriteFiFoISAC_V2(void *p, u8 off, u8 *data, int size)
  205. {
  206. struct fritzcard *fc = p;
  207. int i;
  208. outl(off, fc->addr + AVM_ISACX_INDEX);
  209. for (i = 0; i < size; i++)
  210. outl(data[i], fc->addr + AVM_ISACX_DATA);
  211. }
  212. static struct bchannel *
  213. Sel_BCS(struct fritzcard *fc, u32 channel)
  214. {
  215. if (test_bit(FLG_ACTIVE, &fc->bch[0].Flags) &&
  216. (fc->bch[0].nr & channel))
  217. return &fc->bch[0];
  218. else if (test_bit(FLG_ACTIVE, &fc->bch[1].Flags) &&
  219. (fc->bch[1].nr & channel))
  220. return &fc->bch[1];
  221. else
  222. return NULL;
  223. }
  224. static inline void
  225. __write_ctrl_pci(struct fritzcard *fc, struct hdlc_hw *hdlc, u32 channel) {
  226. u32 idx = channel == 2 ? AVM_HDLC_2 : AVM_HDLC_1;
  227. outl(idx, fc->addr + CHIP_INDEX);
  228. outl(hdlc->ctrl.ctrl, fc->addr + CHIP_WINDOW + HDLC_STATUS);
  229. }
  230. static inline void
  231. __write_ctrl_pciv2(struct fritzcard *fc, struct hdlc_hw *hdlc, u32 channel) {
  232. outl(hdlc->ctrl.ctrl, fc->addr + (channel == 2 ? AVM_HDLC_STATUS_2 :
  233. AVM_HDLC_STATUS_1));
  234. }
  235. void
  236. write_ctrl(struct bchannel *bch, int which) {
  237. struct fritzcard *fc = bch->hw;
  238. struct hdlc_hw *hdlc;
  239. hdlc = &fc->hdlc[(bch->nr - 1) & 1];
  240. pr_debug("%s: hdlc %c wr%x ctrl %x\n", fc->name, '@' + bch->nr,
  241. which, hdlc->ctrl.ctrl);
  242. switch (fc->type) {
  243. case AVM_FRITZ_PCIV2:
  244. __write_ctrl_pciv2(fc, hdlc, bch->nr);
  245. break;
  246. case AVM_FRITZ_PCI:
  247. __write_ctrl_pci(fc, hdlc, bch->nr);
  248. break;
  249. }
  250. }
  251. static inline u32
  252. __read_status_pci(u_long addr, u32 channel)
  253. {
  254. outl(channel == 2 ? AVM_HDLC_2 : AVM_HDLC_1, addr + CHIP_INDEX);
  255. return inl(addr + CHIP_WINDOW + HDLC_STATUS);
  256. }
  257. static inline u32
  258. __read_status_pciv2(u_long addr, u32 channel)
  259. {
  260. return inl(addr + (channel == 2 ? AVM_HDLC_STATUS_2 :
  261. AVM_HDLC_STATUS_1));
  262. }
  263. static u32
  264. read_status(struct fritzcard *fc, u32 channel)
  265. {
  266. switch (fc->type) {
  267. case AVM_FRITZ_PCIV2:
  268. return __read_status_pciv2(fc->addr, channel);
  269. case AVM_FRITZ_PCI:
  270. return __read_status_pci(fc->addr, channel);
  271. }
  272. /* dummy */
  273. return 0;
  274. }
  275. static void
  276. enable_hwirq(struct fritzcard *fc)
  277. {
  278. fc->ctrlreg |= AVM_STATUS0_ENA_IRQ;
  279. outb(fc->ctrlreg, fc->addr + 2);
  280. }
  281. static void
  282. disable_hwirq(struct fritzcard *fc)
  283. {
  284. fc->ctrlreg &= ~AVM_STATUS0_ENA_IRQ;
  285. outb(fc->ctrlreg, fc->addr + 2);
  286. }
  287. static int
  288. modehdlc(struct bchannel *bch, int protocol)
  289. {
  290. struct fritzcard *fc = bch->hw;
  291. struct hdlc_hw *hdlc;
  292. hdlc = &fc->hdlc[(bch->nr - 1) & 1];
  293. pr_debug("%s: hdlc %c protocol %x-->%x ch %d\n", fc->name,
  294. '@' + bch->nr, bch->state, protocol, bch->nr);
  295. hdlc->ctrl.ctrl = 0;
  296. switch (protocol) {
  297. case -1: /* used for init */
  298. bch->state = -1;
  299. case ISDN_P_NONE:
  300. if (bch->state == ISDN_P_NONE)
  301. break;
  302. hdlc->ctrl.sr.cmd = HDLC_CMD_XRS | HDLC_CMD_RRS;
  303. hdlc->ctrl.sr.mode = HDLC_MODE_TRANS;
  304. write_ctrl(bch, 5);
  305. bch->state = ISDN_P_NONE;
  306. test_and_clear_bit(FLG_HDLC, &bch->Flags);
  307. test_and_clear_bit(FLG_TRANSPARENT, &bch->Flags);
  308. break;
  309. case ISDN_P_B_RAW:
  310. bch->state = protocol;
  311. hdlc->ctrl.sr.cmd = HDLC_CMD_XRS | HDLC_CMD_RRS;
  312. hdlc->ctrl.sr.mode = HDLC_MODE_TRANS;
  313. write_ctrl(bch, 5);
  314. hdlc->ctrl.sr.cmd = HDLC_CMD_XRS;
  315. write_ctrl(bch, 1);
  316. hdlc->ctrl.sr.cmd = 0;
  317. test_and_set_bit(FLG_TRANSPARENT, &bch->Flags);
  318. break;
  319. case ISDN_P_B_HDLC:
  320. bch->state = protocol;
  321. hdlc->ctrl.sr.cmd = HDLC_CMD_XRS | HDLC_CMD_RRS;
  322. hdlc->ctrl.sr.mode = HDLC_MODE_ITF_FLG;
  323. write_ctrl(bch, 5);
  324. hdlc->ctrl.sr.cmd = HDLC_CMD_XRS;
  325. write_ctrl(bch, 1);
  326. hdlc->ctrl.sr.cmd = 0;
  327. test_and_set_bit(FLG_HDLC, &bch->Flags);
  328. break;
  329. default:
  330. pr_info("%s: protocol not known %x\n", fc->name, protocol);
  331. return -ENOPROTOOPT;
  332. }
  333. return 0;
  334. }
  335. static void
  336. hdlc_empty_fifo(struct bchannel *bch, int count)
  337. {
  338. u32 *ptr;
  339. u8 *p;
  340. u32 val, addr;
  341. int cnt = 0;
  342. struct fritzcard *fc = bch->hw;
  343. pr_debug("%s: %s %d\n", fc->name, __func__, count);
  344. if (!bch->rx_skb) {
  345. bch->rx_skb = mI_alloc_skb(bch->maxlen, GFP_ATOMIC);
  346. if (!bch->rx_skb) {
  347. pr_info("%s: B receive out of memory\n",
  348. fc->name);
  349. return;
  350. }
  351. }
  352. if ((bch->rx_skb->len + count) > bch->maxlen) {
  353. pr_debug("%s: overrun %d\n", fc->name,
  354. bch->rx_skb->len + count);
  355. return;
  356. }
  357. p = skb_put(bch->rx_skb, count);
  358. ptr = (u32 *)p;
  359. if (AVM_FRITZ_PCIV2 == fc->type)
  360. addr = fc->addr + (bch->nr == 2 ?
  361. AVM_HDLC_FIFO_2 : AVM_HDLC_FIFO_1);
  362. else {
  363. addr = fc->addr + CHIP_WINDOW;
  364. outl(bch->nr == 2 ? AVM_HDLC_2 : AVM_HDLC_1, fc->addr);
  365. }
  366. while (cnt < count) {
  367. val = le32_to_cpu(inl(addr));
  368. put_unaligned(val, ptr);
  369. ptr++;
  370. cnt += 4;
  371. }
  372. if (debug & DEBUG_HW_BFIFO) {
  373. snprintf(fc->log, LOG_SIZE, "B%1d-recv %s %d ",
  374. bch->nr, fc->name, count);
  375. print_hex_dump_bytes(fc->log, DUMP_PREFIX_OFFSET, p, count);
  376. }
  377. }
  378. static void
  379. hdlc_fill_fifo(struct bchannel *bch)
  380. {
  381. struct fritzcard *fc = bch->hw;
  382. struct hdlc_hw *hdlc;
  383. int count, cnt = 0;
  384. u8 *p;
  385. u32 *ptr, val, addr;
  386. hdlc = &fc->hdlc[(bch->nr - 1) & 1];
  387. if (!bch->tx_skb)
  388. return;
  389. count = bch->tx_skb->len - bch->tx_idx;
  390. if (count <= 0)
  391. return;
  392. p = bch->tx_skb->data + bch->tx_idx;
  393. hdlc->ctrl.sr.cmd &= ~HDLC_CMD_XME;
  394. if (count > HDLC_FIFO_SIZE) {
  395. count = HDLC_FIFO_SIZE;
  396. } else {
  397. if (test_bit(FLG_HDLC, &bch->Flags))
  398. hdlc->ctrl.sr.cmd |= HDLC_CMD_XME;
  399. }
  400. pr_debug("%s: %s %d/%d/%d", fc->name, __func__, count,
  401. bch->tx_idx, bch->tx_skb->len);
  402. ptr = (u32 *)p;
  403. bch->tx_idx += count;
  404. hdlc->ctrl.sr.xml = ((count == HDLC_FIFO_SIZE) ? 0 : count);
  405. if (AVM_FRITZ_PCIV2 == fc->type) {
  406. __write_ctrl_pciv2(fc, hdlc, bch->nr);
  407. addr = fc->addr + (bch->nr == 2 ?
  408. AVM_HDLC_FIFO_2 : AVM_HDLC_FIFO_1);
  409. } else {
  410. __write_ctrl_pci(fc, hdlc, bch->nr);
  411. addr = fc->addr + CHIP_WINDOW;
  412. }
  413. while (cnt < count) {
  414. val = get_unaligned(ptr);
  415. outl(cpu_to_le32(val), addr);
  416. ptr++;
  417. cnt += 4;
  418. }
  419. if (debug & DEBUG_HW_BFIFO) {
  420. snprintf(fc->log, LOG_SIZE, "B%1d-send %s %d ",
  421. bch->nr, fc->name, count);
  422. print_hex_dump_bytes(fc->log, DUMP_PREFIX_OFFSET, p, count);
  423. }
  424. }
  425. static void
  426. HDLC_irq_xpr(struct bchannel *bch)
  427. {
  428. if (bch->tx_skb && bch->tx_idx < bch->tx_skb->len)
  429. hdlc_fill_fifo(bch);
  430. else {
  431. if (bch->tx_skb) {
  432. /* send confirm, on trans, free on hdlc. */
  433. if (test_bit(FLG_TRANSPARENT, &bch->Flags))
  434. confirm_Bsend(bch);
  435. dev_kfree_skb(bch->tx_skb);
  436. }
  437. if (get_next_bframe(bch))
  438. hdlc_fill_fifo(bch);
  439. }
  440. }
  441. static void
  442. HDLC_irq(struct bchannel *bch, u32 stat)
  443. {
  444. struct fritzcard *fc = bch->hw;
  445. int len;
  446. struct hdlc_hw *hdlc;
  447. hdlc = &fc->hdlc[(bch->nr - 1) & 1];
  448. pr_debug("%s: ch%d stat %#x\n", fc->name, bch->nr, stat);
  449. if (stat & HDLC_INT_RPR) {
  450. if (stat & HDLC_STAT_RDO) {
  451. hdlc->ctrl.sr.xml = 0;
  452. hdlc->ctrl.sr.cmd |= HDLC_CMD_RRS;
  453. write_ctrl(bch, 1);
  454. hdlc->ctrl.sr.cmd &= ~HDLC_CMD_RRS;
  455. write_ctrl(bch, 1);
  456. if (bch->rx_skb)
  457. skb_trim(bch->rx_skb, 0);
  458. } else {
  459. len = (stat & HDLC_STAT_RML_MASK) >> 8;
  460. if (!len)
  461. len = 32;
  462. hdlc_empty_fifo(bch, len);
  463. if (!bch->rx_skb)
  464. goto handle_tx;
  465. if ((stat & HDLC_STAT_RME) || test_bit(FLG_TRANSPARENT,
  466. &bch->Flags)) {
  467. if (((stat & HDLC_STAT_CRCVFRRAB) ==
  468. HDLC_STAT_CRCVFR) ||
  469. test_bit(FLG_TRANSPARENT, &bch->Flags)) {
  470. recv_Bchannel(bch, 0);
  471. } else {
  472. pr_debug("%s: got invalid frame\n",
  473. fc->name);
  474. skb_trim(bch->rx_skb, 0);
  475. }
  476. }
  477. }
  478. }
  479. handle_tx:
  480. if (stat & HDLC_INT_XDU) {
  481. /* Here we lost an TX interrupt, so
  482. * restart transmitting the whole frame on HDLC
  483. * in transparent mode we send the next data
  484. */
  485. if (bch->tx_skb)
  486. pr_debug("%s: ch%d XDU len(%d) idx(%d) Flags(%lx)\n",
  487. fc->name, bch->nr, bch->tx_skb->len,
  488. bch->tx_idx, bch->Flags);
  489. else
  490. pr_debug("%s: ch%d XDU no tx_skb Flags(%lx)\n",
  491. fc->name, bch->nr, bch->Flags);
  492. if (bch->tx_skb && bch->tx_skb->len) {
  493. if (!test_bit(FLG_TRANSPARENT, &bch->Flags))
  494. bch->tx_idx = 0;
  495. }
  496. hdlc->ctrl.sr.xml = 0;
  497. hdlc->ctrl.sr.cmd |= HDLC_CMD_XRS;
  498. write_ctrl(bch, 1);
  499. hdlc->ctrl.sr.cmd &= ~HDLC_CMD_XRS;
  500. HDLC_irq_xpr(bch);
  501. return;
  502. } else if (stat & HDLC_INT_XPR)
  503. HDLC_irq_xpr(bch);
  504. }
  505. static inline void
  506. HDLC_irq_main(struct fritzcard *fc)
  507. {
  508. u32 stat;
  509. struct bchannel *bch;
  510. stat = read_status(fc, 1);
  511. if (stat & HDLC_INT_MASK) {
  512. bch = Sel_BCS(fc, 1);
  513. if (bch)
  514. HDLC_irq(bch, stat);
  515. else
  516. pr_debug("%s: spurious ch1 IRQ\n", fc->name);
  517. }
  518. stat = read_status(fc, 2);
  519. if (stat & HDLC_INT_MASK) {
  520. bch = Sel_BCS(fc, 2);
  521. if (bch)
  522. HDLC_irq(bch, stat);
  523. else
  524. pr_debug("%s: spurious ch2 IRQ\n", fc->name);
  525. }
  526. }
  527. static irqreturn_t
  528. avm_fritz_interrupt(int intno, void *dev_id)
  529. {
  530. struct fritzcard *fc = dev_id;
  531. u8 val;
  532. u8 sval;
  533. spin_lock(&fc->lock);
  534. sval = inb(fc->addr + 2);
  535. pr_debug("%s: irq stat0 %x\n", fc->name, sval);
  536. if ((sval & AVM_STATUS0_IRQ_MASK) == AVM_STATUS0_IRQ_MASK) {
  537. /* shared IRQ from other HW */
  538. spin_unlock(&fc->lock);
  539. return IRQ_NONE;
  540. }
  541. fc->irqcnt++;
  542. if (!(sval & AVM_STATUS0_IRQ_ISAC)) {
  543. val = ReadISAC_V1(fc, ISAC_ISTA);
  544. mISDNisac_irq(&fc->isac, val);
  545. }
  546. if (!(sval & AVM_STATUS0_IRQ_HDLC))
  547. HDLC_irq_main(fc);
  548. spin_unlock(&fc->lock);
  549. return IRQ_HANDLED;
  550. }
  551. static irqreturn_t
  552. avm_fritzv2_interrupt(int intno, void *dev_id)
  553. {
  554. struct fritzcard *fc = dev_id;
  555. u8 val;
  556. u8 sval;
  557. spin_lock(&fc->lock);
  558. sval = inb(fc->addr + 2);
  559. pr_debug("%s: irq stat0 %x\n", fc->name, sval);
  560. if (!(sval & AVM_STATUS0_IRQ_MASK)) {
  561. /* shared IRQ from other HW */
  562. spin_unlock(&fc->lock);
  563. return IRQ_NONE;
  564. }
  565. fc->irqcnt++;
  566. if (sval & AVM_STATUS0_IRQ_HDLC)
  567. HDLC_irq_main(fc);
  568. if (sval & AVM_STATUS0_IRQ_ISAC) {
  569. val = ReadISAC_V2(fc, ISACX_ISTA);
  570. mISDNisac_irq(&fc->isac, val);
  571. }
  572. if (sval & AVM_STATUS0_IRQ_TIMER) {
  573. pr_debug("%s: timer irq\n", fc->name);
  574. outb(fc->ctrlreg | AVM_STATUS0_RES_TIMER, fc->addr + 2);
  575. udelay(1);
  576. outb(fc->ctrlreg, fc->addr + 2);
  577. }
  578. spin_unlock(&fc->lock);
  579. return IRQ_HANDLED;
  580. }
  581. static int
  582. avm_l2l1B(struct mISDNchannel *ch, struct sk_buff *skb)
  583. {
  584. struct bchannel *bch = container_of(ch, struct bchannel, ch);
  585. struct fritzcard *fc = bch->hw;
  586. int ret = -EINVAL;
  587. struct mISDNhead *hh = mISDN_HEAD_P(skb);
  588. u32 id;
  589. u_long flags;
  590. switch (hh->prim) {
  591. case PH_DATA_REQ:
  592. spin_lock_irqsave(&fc->lock, flags);
  593. ret = bchannel_senddata(bch, skb);
  594. if (ret > 0) { /* direct TX */
  595. id = hh->id; /* skb can be freed */
  596. hdlc_fill_fifo(bch);
  597. ret = 0;
  598. spin_unlock_irqrestore(&fc->lock, flags);
  599. if (!test_bit(FLG_TRANSPARENT, &bch->Flags))
  600. queue_ch_frame(ch, PH_DATA_CNF, id, NULL);
  601. } else
  602. spin_unlock_irqrestore(&fc->lock, flags);
  603. return ret;
  604. case PH_ACTIVATE_REQ:
  605. spin_lock_irqsave(&fc->lock, flags);
  606. if (!test_and_set_bit(FLG_ACTIVE, &bch->Flags))
  607. ret = modehdlc(bch, ch->protocol);
  608. else
  609. ret = 0;
  610. spin_unlock_irqrestore(&fc->lock, flags);
  611. if (!ret)
  612. _queue_data(ch, PH_ACTIVATE_IND, MISDN_ID_ANY, 0,
  613. NULL, GFP_KERNEL);
  614. break;
  615. case PH_DEACTIVATE_REQ:
  616. spin_lock_irqsave(&fc->lock, flags);
  617. mISDN_clear_bchannel(bch);
  618. modehdlc(bch, ISDN_P_NONE);
  619. spin_unlock_irqrestore(&fc->lock, flags);
  620. _queue_data(ch, PH_DEACTIVATE_IND, MISDN_ID_ANY, 0,
  621. NULL, GFP_KERNEL);
  622. ret = 0;
  623. break;
  624. }
  625. if (!ret)
  626. dev_kfree_skb(skb);
  627. return ret;
  628. }
  629. static void
  630. inithdlc(struct fritzcard *fc)
  631. {
  632. modehdlc(&fc->bch[0], -1);
  633. modehdlc(&fc->bch[1], -1);
  634. }
  635. void
  636. clear_pending_hdlc_ints(struct fritzcard *fc)
  637. {
  638. u32 val;
  639. val = read_status(fc, 1);
  640. pr_debug("%s: HDLC 1 STA %x\n", fc->name, val);
  641. val = read_status(fc, 2);
  642. pr_debug("%s: HDLC 2 STA %x\n", fc->name, val);
  643. }
  644. static void
  645. reset_avm(struct fritzcard *fc)
  646. {
  647. switch (fc->type) {
  648. case AVM_FRITZ_PCI:
  649. fc->ctrlreg = AVM_STATUS0_RESET | AVM_STATUS0_DIS_TIMER;
  650. break;
  651. case AVM_FRITZ_PCIV2:
  652. fc->ctrlreg = AVM_STATUS0_RESET;
  653. break;
  654. }
  655. if (debug & DEBUG_HW)
  656. pr_notice("%s: reset\n", fc->name);
  657. disable_hwirq(fc);
  658. mdelay(5);
  659. switch (fc->type) {
  660. case AVM_FRITZ_PCI:
  661. fc->ctrlreg = AVM_STATUS0_DIS_TIMER | AVM_STATUS0_RES_TIMER;
  662. disable_hwirq(fc);
  663. outb(AVM_STATUS1_ENA_IOM, fc->addr + 3);
  664. break;
  665. case AVM_FRITZ_PCIV2:
  666. fc->ctrlreg = 0;
  667. disable_hwirq(fc);
  668. break;
  669. }
  670. mdelay(1);
  671. if (debug & DEBUG_HW)
  672. pr_notice("%s: S0/S1 %x/%x\n", fc->name,
  673. inb(fc->addr + 2), inb(fc->addr + 3));
  674. }
  675. static int
  676. init_card(struct fritzcard *fc)
  677. {
  678. int ret, cnt = 3;
  679. u_long flags;
  680. reset_avm(fc); /* disable IRQ */
  681. if (fc->type == AVM_FRITZ_PCIV2)
  682. ret = request_irq(fc->irq, avm_fritzv2_interrupt,
  683. IRQF_SHARED, fc->name, fc);
  684. else
  685. ret = request_irq(fc->irq, avm_fritz_interrupt,
  686. IRQF_SHARED, fc->name, fc);
  687. if (ret) {
  688. pr_info("%s: couldn't get interrupt %d\n",
  689. fc->name, fc->irq);
  690. return ret;
  691. }
  692. while (cnt--) {
  693. spin_lock_irqsave(&fc->lock, flags);
  694. ret = fc->isac.init(&fc->isac);
  695. if (ret) {
  696. spin_unlock_irqrestore(&fc->lock, flags);
  697. pr_info("%s: ISAC init failed with %d\n",
  698. fc->name, ret);
  699. break;
  700. }
  701. clear_pending_hdlc_ints(fc);
  702. inithdlc(fc);
  703. enable_hwirq(fc);
  704. /* RESET Receiver and Transmitter */
  705. if (AVM_FRITZ_PCIV2 == fc->type) {
  706. WriteISAC_V2(fc, ISACX_MASK, 0);
  707. WriteISAC_V2(fc, ISACX_CMDRD, 0x41);
  708. } else {
  709. WriteISAC_V1(fc, ISAC_MASK, 0);
  710. WriteISAC_V1(fc, ISAC_CMDR, 0x41);
  711. }
  712. spin_unlock_irqrestore(&fc->lock, flags);
  713. /* Timeout 10ms */
  714. msleep_interruptible(10);
  715. if (debug & DEBUG_HW)
  716. pr_notice("%s: IRQ %d count %d\n", fc->name,
  717. fc->irq, fc->irqcnt);
  718. if (!fc->irqcnt) {
  719. pr_info("%s: IRQ(%d) getting no IRQs during init %d\n",
  720. fc->name, fc->irq, 3 - cnt);
  721. reset_avm(fc);
  722. } else
  723. return 0;
  724. }
  725. free_irq(fc->irq, fc);
  726. return -EIO;
  727. }
  728. static int
  729. channel_bctrl(struct bchannel *bch, struct mISDN_ctrl_req *cq)
  730. {
  731. int ret = 0;
  732. struct fritzcard *fc = bch->hw;
  733. switch (cq->op) {
  734. case MISDN_CTRL_GETOP:
  735. cq->op = 0;
  736. break;
  737. /* Nothing implemented yet */
  738. case MISDN_CTRL_FILL_EMPTY:
  739. default:
  740. pr_info("%s: %s unknown Op %x\n", fc->name, __func__, cq->op);
  741. ret = -EINVAL;
  742. break;
  743. }
  744. return ret;
  745. }
  746. static int
  747. avm_bctrl(struct mISDNchannel *ch, u32 cmd, void *arg)
  748. {
  749. struct bchannel *bch = container_of(ch, struct bchannel, ch);
  750. struct fritzcard *fc = bch->hw;
  751. int ret = -EINVAL;
  752. u_long flags;
  753. pr_debug("%s: %s cmd:%x %p\n", fc->name, __func__, cmd, arg);
  754. switch (cmd) {
  755. case CLOSE_CHANNEL:
  756. test_and_clear_bit(FLG_OPEN, &bch->Flags);
  757. if (test_bit(FLG_ACTIVE, &bch->Flags)) {
  758. spin_lock_irqsave(&fc->lock, flags);
  759. mISDN_freebchannel(bch);
  760. test_and_clear_bit(FLG_TX_BUSY, &bch->Flags);
  761. test_and_clear_bit(FLG_ACTIVE, &bch->Flags);
  762. modehdlc(bch, ISDN_P_NONE);
  763. spin_unlock_irqrestore(&fc->lock, flags);
  764. }
  765. ch->protocol = ISDN_P_NONE;
  766. ch->peer = NULL;
  767. module_put(THIS_MODULE);
  768. ret = 0;
  769. break;
  770. case CONTROL_CHANNEL:
  771. ret = channel_bctrl(bch, arg);
  772. break;
  773. default:
  774. pr_info("%s: %s unknown prim(%x)\n", fc->name, __func__, cmd);
  775. }
  776. return ret;
  777. }
  778. static int
  779. channel_ctrl(struct fritzcard *fc, struct mISDN_ctrl_req *cq)
  780. {
  781. int ret = 0;
  782. switch (cq->op) {
  783. case MISDN_CTRL_GETOP:
  784. cq->op = MISDN_CTRL_LOOP;
  785. break;
  786. case MISDN_CTRL_LOOP:
  787. /* cq->channel: 0 disable, 1 B1 loop 2 B2 loop, 3 both */
  788. if (cq->channel < 0 || cq->channel > 3) {
  789. ret = -EINVAL;
  790. break;
  791. }
  792. ret = fc->isac.ctrl(&fc->isac, HW_TESTLOOP, cq->channel);
  793. break;
  794. default:
  795. pr_info("%s: %s unknown Op %x\n", fc->name, __func__, cq->op);
  796. ret = -EINVAL;
  797. break;
  798. }
  799. return ret;
  800. }
  801. static int
  802. open_bchannel(struct fritzcard *fc, struct channel_req *rq)
  803. {
  804. struct bchannel *bch;
  805. if (rq->adr.channel == 0 || rq->adr.channel > 2)
  806. return -EINVAL;
  807. if (rq->protocol == ISDN_P_NONE)
  808. return -EINVAL;
  809. bch = &fc->bch[rq->adr.channel - 1];
  810. if (test_and_set_bit(FLG_OPEN, &bch->Flags))
  811. return -EBUSY; /* b-channel can be only open once */
  812. test_and_clear_bit(FLG_FILLEMPTY, &bch->Flags);
  813. bch->ch.protocol = rq->protocol;
  814. rq->ch = &bch->ch;
  815. return 0;
  816. }
  817. /*
  818. * device control function
  819. */
  820. static int
  821. avm_dctrl(struct mISDNchannel *ch, u32 cmd, void *arg)
  822. {
  823. struct mISDNdevice *dev = container_of(ch, struct mISDNdevice, D);
  824. struct dchannel *dch = container_of(dev, struct dchannel, dev);
  825. struct fritzcard *fc = dch->hw;
  826. struct channel_req *rq;
  827. int err = 0;
  828. pr_debug("%s: %s cmd:%x %p\n", fc->name, __func__, cmd, arg);
  829. switch (cmd) {
  830. case OPEN_CHANNEL:
  831. rq = arg;
  832. if (rq->protocol == ISDN_P_TE_S0)
  833. err = fc->isac.open(&fc->isac, rq);
  834. else
  835. err = open_bchannel(fc, rq);
  836. if (err)
  837. break;
  838. if (!try_module_get(THIS_MODULE))
  839. pr_info("%s: cannot get module\n", fc->name);
  840. break;
  841. case CLOSE_CHANNEL:
  842. pr_debug("%s: dev(%d) close from %p\n", fc->name, dch->dev.id,
  843. __builtin_return_address(0));
  844. module_put(THIS_MODULE);
  845. break;
  846. case CONTROL_CHANNEL:
  847. err = channel_ctrl(fc, arg);
  848. break;
  849. default:
  850. pr_debug("%s: %s unknown command %x\n",
  851. fc->name, __func__, cmd);
  852. return -EINVAL;
  853. }
  854. return err;
  855. }
  856. int
  857. setup_fritz(struct fritzcard *fc)
  858. {
  859. u32 val, ver;
  860. if (!request_region(fc->addr, 32, fc->name)) {
  861. pr_info("%s: AVM config port %x-%x already in use\n",
  862. fc->name, fc->addr, fc->addr + 31);
  863. return -EIO;
  864. }
  865. switch (fc->type) {
  866. case AVM_FRITZ_PCI:
  867. val = inl(fc->addr);
  868. outl(AVM_HDLC_1, fc->addr + CHIP_INDEX);
  869. ver = inl(fc->addr + CHIP_WINDOW + HDLC_STATUS) >> 24;
  870. if (debug & DEBUG_HW) {
  871. pr_notice("%s: PCI stat %#x\n", fc->name, val);
  872. pr_notice("%s: PCI Class %X Rev %d\n", fc->name,
  873. val & 0xff, (val >> 8) & 0xff);
  874. pr_notice("%s: HDLC version %x\n", fc->name, ver & 0xf);
  875. }
  876. ASSIGN_FUNC(V1, ISAC, fc->isac);
  877. fc->isac.type = IPAC_TYPE_ISAC;
  878. break;
  879. case AVM_FRITZ_PCIV2:
  880. val = inl(fc->addr);
  881. ver = inl(fc->addr + AVM_HDLC_STATUS_1) >> 24;
  882. if (debug & DEBUG_HW) {
  883. pr_notice("%s: PCI V2 stat %#x\n", fc->name, val);
  884. pr_notice("%s: PCI V2 Class %X Rev %d\n", fc->name,
  885. val & 0xff, (val >> 8) & 0xff);
  886. pr_notice("%s: HDLC version %x\n", fc->name, ver & 0xf);
  887. }
  888. ASSIGN_FUNC(V2, ISAC, fc->isac);
  889. fc->isac.type = IPAC_TYPE_ISACX;
  890. break;
  891. default:
  892. release_region(fc->addr, 32);
  893. pr_info("%s: AVM unknown type %d\n", fc->name, fc->type);
  894. return -ENODEV;
  895. }
  896. pr_notice("%s: %s config irq:%d base:0x%X\n", fc->name,
  897. (fc->type == AVM_FRITZ_PCI) ? "AVM Fritz!CARD PCI" :
  898. "AVM Fritz!CARD PCIv2", fc->irq, fc->addr);
  899. return 0;
  900. }
  901. static void
  902. release_card(struct fritzcard *card)
  903. {
  904. u_long flags;
  905. disable_hwirq(card);
  906. spin_lock_irqsave(&card->lock, flags);
  907. modehdlc(&card->bch[0], ISDN_P_NONE);
  908. modehdlc(&card->bch[1], ISDN_P_NONE);
  909. spin_unlock_irqrestore(&card->lock, flags);
  910. card->isac.release(&card->isac);
  911. free_irq(card->irq, card);
  912. mISDN_freebchannel(&card->bch[1]);
  913. mISDN_freebchannel(&card->bch[0]);
  914. mISDN_unregister_device(&card->isac.dch.dev);
  915. release_region(card->addr, 32);
  916. pci_disable_device(card->pdev);
  917. pci_set_drvdata(card->pdev, NULL);
  918. write_lock_irqsave(&card_lock, flags);
  919. list_del(&card->list);
  920. write_unlock_irqrestore(&card_lock, flags);
  921. kfree(card);
  922. AVM_cnt--;
  923. }
  924. static int __devinit
  925. setup_instance(struct fritzcard *card)
  926. {
  927. int i, err;
  928. u_long flags;
  929. snprintf(card->name, MISDN_MAX_IDLEN - 1, "AVM.%d", AVM_cnt + 1);
  930. write_lock_irqsave(&card_lock, flags);
  931. list_add_tail(&card->list, &Cards);
  932. write_unlock_irqrestore(&card_lock, flags);
  933. _set_debug(card);
  934. card->isac.name = card->name;
  935. spin_lock_init(&card->lock);
  936. card->isac.hwlock = &card->lock;
  937. mISDNisac_init(&card->isac, card);
  938. card->isac.dch.dev.Bprotocols = (1 << (ISDN_P_B_RAW & ISDN_P_B_MASK)) |
  939. (1 << (ISDN_P_B_HDLC & ISDN_P_B_MASK));
  940. card->isac.dch.dev.D.ctrl = avm_dctrl;
  941. for (i = 0; i < 2; i++) {
  942. card->bch[i].nr = i + 1;
  943. set_channelmap(i + 1, card->isac.dch.dev.channelmap);
  944. mISDN_initbchannel(&card->bch[i], MAX_DATA_MEM);
  945. card->bch[i].hw = card;
  946. card->bch[i].ch.send = avm_l2l1B;
  947. card->bch[i].ch.ctrl = avm_bctrl;
  948. card->bch[i].ch.nr = i + 1;
  949. list_add(&card->bch[i].ch.list, &card->isac.dch.dev.bchannels);
  950. }
  951. err = setup_fritz(card);
  952. if (err)
  953. goto error;
  954. err = mISDN_register_device(&card->isac.dch.dev, &card->pdev->dev,
  955. card->name);
  956. if (err)
  957. goto error_reg;
  958. err = init_card(card);
  959. if (!err) {
  960. AVM_cnt++;
  961. pr_notice("AVM %d cards installed DEBUG\n", AVM_cnt);
  962. return 0;
  963. }
  964. mISDN_unregister_device(&card->isac.dch.dev);
  965. error_reg:
  966. release_region(card->addr, 32);
  967. error:
  968. card->isac.release(&card->isac);
  969. mISDN_freebchannel(&card->bch[1]);
  970. mISDN_freebchannel(&card->bch[0]);
  971. write_lock_irqsave(&card_lock, flags);
  972. list_del(&card->list);
  973. write_unlock_irqrestore(&card_lock, flags);
  974. kfree(card);
  975. return err;
  976. }
  977. static int __devinit
  978. fritzpci_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
  979. {
  980. int err = -ENOMEM;
  981. struct fritzcard *card;
  982. card = kzalloc(sizeof(struct fritzcard), GFP_KERNEL);
  983. if (!card) {
  984. pr_info("No kmem for fritzcard\n");
  985. return err;
  986. }
  987. if (pdev->device == PCI_DEVICE_ID_AVM_A1_V2)
  988. card->type = AVM_FRITZ_PCIV2;
  989. else
  990. card->type = AVM_FRITZ_PCI;
  991. card->pdev = pdev;
  992. err = pci_enable_device(pdev);
  993. if (err) {
  994. kfree(card);
  995. return err;
  996. }
  997. pr_notice("mISDN: found adapter %s at %s\n",
  998. (char *) ent->driver_data, pci_name(pdev));
  999. card->addr = pci_resource_start(pdev, 1);
  1000. card->irq = pdev->irq;
  1001. pci_set_drvdata(pdev, card);
  1002. err = setup_instance(card);
  1003. if (err)
  1004. pci_set_drvdata(pdev, NULL);
  1005. return err;
  1006. }
  1007. static void __devexit
  1008. fritz_remove_pci(struct pci_dev *pdev)
  1009. {
  1010. struct fritzcard *card = pci_get_drvdata(pdev);
  1011. if (card)
  1012. release_card(card);
  1013. else
  1014. if (debug)
  1015. pr_info("%s: drvdata already removed\n", __func__);
  1016. }
  1017. static struct pci_device_id fcpci_ids[] __devinitdata = {
  1018. { PCI_VENDOR_ID_AVM, PCI_DEVICE_ID_AVM_A1, PCI_ANY_ID, PCI_ANY_ID,
  1019. 0, 0, (unsigned long) "Fritz!Card PCI"},
  1020. { PCI_VENDOR_ID_AVM, PCI_DEVICE_ID_AVM_A1_V2, PCI_ANY_ID, PCI_ANY_ID,
  1021. 0, 0, (unsigned long) "Fritz!Card PCI v2" },
  1022. { }
  1023. };
  1024. MODULE_DEVICE_TABLE(pci, fcpci_ids);
  1025. static struct pci_driver fcpci_driver = {
  1026. .name = "fcpci",
  1027. .probe = fritzpci_probe,
  1028. .remove = __devexit_p(fritz_remove_pci),
  1029. .id_table = fcpci_ids,
  1030. };
  1031. static int __init AVM_init(void)
  1032. {
  1033. int err;
  1034. pr_notice("AVM Fritz PCI driver Rev. %s\n", AVMFRITZ_REV);
  1035. err = pci_register_driver(&fcpci_driver);
  1036. return err;
  1037. }
  1038. static void __exit AVM_cleanup(void)
  1039. {
  1040. pci_unregister_driver(&fcpci_driver);
  1041. }
  1042. module_init(AVM_init);
  1043. module_exit(AVM_cleanup);