avmfritz.c 27 KB

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