speedfax.c 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527
  1. /*
  2. * speedfax.c low level stuff for Sedlbauer Speedfax+ cards
  3. * based on the ISAR DSP
  4. * Thanks to Sedlbauer AG for informations and HW
  5. *
  6. * Author Karsten Keil <keil@isdn4linux.de>
  7. *
  8. * Copyright 2009 by Karsten Keil <keil@isdn4linux.de>
  9. *
  10. * This program is free software; you can redistribute it and/or modify
  11. * it under the terms of the GNU General Public License version 2 as
  12. * published by the Free Software Foundation.
  13. *
  14. * This program is distributed in the hope that it will be useful,
  15. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  16. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  17. * GNU General Public License for more details.
  18. *
  19. * You should have received a copy of the GNU General Public License
  20. * along with this program; if not, write to the Free Software
  21. * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  22. *
  23. */
  24. #include <linux/module.h>
  25. #include <linux/pci.h>
  26. #include <linux/delay.h>
  27. #include <linux/mISDNhw.h>
  28. #include <linux/firmware.h>
  29. #include "ipac.h"
  30. #include "isar.h"
  31. #define SPEEDFAX_REV "2.0"
  32. #define PCI_SUBVENDOR_SPEEDFAX_PYRAMID 0x51
  33. #define PCI_SUBVENDOR_SPEEDFAX_PCI 0x54
  34. #define PCI_SUB_ID_SEDLBAUER 0x01
  35. #define SFAX_PCI_ADDR 0xc8
  36. #define SFAX_PCI_ISAC 0xd0
  37. #define SFAX_PCI_ISAR 0xe0
  38. /* TIGER 100 Registers */
  39. #define TIGER_RESET_ADDR 0x00
  40. #define TIGER_EXTERN_RESET_ON 0x01
  41. #define TIGER_EXTERN_RESET_OFF 0x00
  42. #define TIGER_AUX_CTRL 0x02
  43. #define TIGER_AUX_DATA 0x03
  44. #define TIGER_AUX_IRQMASK 0x05
  45. #define TIGER_AUX_STATUS 0x07
  46. /* Tiger AUX BITs */
  47. #define SFAX_AUX_IOMASK 0xdd /* 1 and 5 are inputs */
  48. #define SFAX_ISAR_RESET_BIT_OFF 0x00
  49. #define SFAX_ISAR_RESET_BIT_ON 0x01
  50. #define SFAX_TIGER_IRQ_BIT 0x02
  51. #define SFAX_LED1_BIT 0x08
  52. #define SFAX_LED2_BIT 0x10
  53. #define SFAX_PCI_RESET_ON (SFAX_ISAR_RESET_BIT_ON)
  54. #define SFAX_PCI_RESET_OFF (SFAX_LED1_BIT | SFAX_LED2_BIT)
  55. static int sfax_cnt;
  56. static u32 debug;
  57. static u32 irqloops = 4;
  58. struct sfax_hw {
  59. struct list_head list;
  60. struct pci_dev *pdev;
  61. char name[MISDN_MAX_IDLEN];
  62. u32 irq;
  63. u32 irqcnt;
  64. u32 cfg;
  65. struct _ioport p_isac;
  66. struct _ioport p_isar;
  67. u8 aux_data;
  68. spinlock_t lock; /* HW access lock */
  69. struct isac_hw isac;
  70. struct isar_hw isar;
  71. };
  72. static LIST_HEAD(Cards);
  73. static DEFINE_RWLOCK(card_lock); /* protect Cards */
  74. static void
  75. _set_debug(struct sfax_hw *card)
  76. {
  77. card->isac.dch.debug = debug;
  78. card->isar.ch[0].bch.debug = debug;
  79. card->isar.ch[1].bch.debug = debug;
  80. }
  81. static int
  82. set_debug(const char *val, struct kernel_param *kp)
  83. {
  84. int ret;
  85. struct sfax_hw *card;
  86. ret = param_set_uint(val, kp);
  87. if (!ret) {
  88. read_lock(&card_lock);
  89. list_for_each_entry(card, &Cards, list)
  90. _set_debug(card);
  91. read_unlock(&card_lock);
  92. }
  93. return ret;
  94. }
  95. MODULE_AUTHOR("Karsten Keil");
  96. MODULE_LICENSE("GPL v2");
  97. MODULE_VERSION(SPEEDFAX_REV);
  98. MODULE_FIRMWARE("isdn/ISAR.BIN");
  99. module_param_call(debug, set_debug, param_get_uint, &debug, S_IRUGO | S_IWUSR);
  100. MODULE_PARM_DESC(debug, "Speedfax debug mask");
  101. module_param(irqloops, uint, S_IRUGO | S_IWUSR);
  102. MODULE_PARM_DESC(irqloops, "Speedfax maximal irqloops (default 4)");
  103. IOFUNC_IND(ISAC, sfax_hw, p_isac)
  104. IOFUNC_IND(ISAR, sfax_hw, p_isar)
  105. static irqreturn_t
  106. speedfax_irq(int intno, void *dev_id)
  107. {
  108. struct sfax_hw *sf = dev_id;
  109. u8 val;
  110. int cnt = irqloops;
  111. spin_lock(&sf->lock);
  112. val = inb(sf->cfg + TIGER_AUX_STATUS);
  113. if (val & SFAX_TIGER_IRQ_BIT) { /* for us or shared ? */
  114. spin_unlock(&sf->lock);
  115. return IRQ_NONE; /* shared */
  116. }
  117. sf->irqcnt++;
  118. val = ReadISAR_IND(sf, ISAR_IRQBIT);
  119. Start_ISAR:
  120. if (val & ISAR_IRQSTA)
  121. mISDNisar_irq(&sf->isar);
  122. val = ReadISAC_IND(sf, ISAC_ISTA);
  123. if (val)
  124. mISDNisac_irq(&sf->isac, val);
  125. val = ReadISAR_IND(sf, ISAR_IRQBIT);
  126. if ((val & ISAR_IRQSTA) && cnt--)
  127. goto Start_ISAR;
  128. if (cnt < irqloops)
  129. pr_debug("%s: %d irqloops cpu%d\n", sf->name,
  130. irqloops - cnt, smp_processor_id());
  131. if (irqloops && !cnt)
  132. pr_notice("%s: %d IRQ LOOP cpu%d\n", sf->name,
  133. irqloops, smp_processor_id());
  134. spin_unlock(&sf->lock);
  135. return IRQ_HANDLED;
  136. }
  137. static void
  138. enable_hwirq(struct sfax_hw *sf)
  139. {
  140. WriteISAC_IND(sf, ISAC_MASK, 0);
  141. WriteISAR_IND(sf, ISAR_IRQBIT, ISAR_IRQMSK);
  142. outb(SFAX_TIGER_IRQ_BIT, sf->cfg + TIGER_AUX_IRQMASK);
  143. }
  144. static void
  145. disable_hwirq(struct sfax_hw *sf)
  146. {
  147. WriteISAC_IND(sf, ISAC_MASK, 0xFF);
  148. WriteISAR_IND(sf, ISAR_IRQBIT, 0);
  149. outb(0, sf->cfg + TIGER_AUX_IRQMASK);
  150. }
  151. static void
  152. reset_speedfax(struct sfax_hw *sf)
  153. {
  154. pr_debug("%s: resetting card\n", sf->name);
  155. outb(TIGER_EXTERN_RESET_ON, sf->cfg + TIGER_RESET_ADDR);
  156. outb(SFAX_PCI_RESET_ON, sf->cfg + TIGER_AUX_DATA);
  157. mdelay(1);
  158. outb(TIGER_EXTERN_RESET_OFF, sf->cfg + TIGER_RESET_ADDR);
  159. sf->aux_data = SFAX_PCI_RESET_OFF;
  160. outb(sf->aux_data, sf->cfg + TIGER_AUX_DATA);
  161. mdelay(1);
  162. }
  163. static int
  164. sfax_ctrl(struct sfax_hw *sf, u32 cmd, u_long arg)
  165. {
  166. int ret = 0;
  167. switch (cmd) {
  168. case HW_RESET_REQ:
  169. reset_speedfax(sf);
  170. break;
  171. case HW_ACTIVATE_IND:
  172. if (arg & 1)
  173. sf->aux_data &= ~SFAX_LED1_BIT;
  174. if (arg & 2)
  175. sf->aux_data &= ~SFAX_LED2_BIT;
  176. outb(sf->aux_data, sf->cfg + TIGER_AUX_DATA);
  177. break;
  178. case HW_DEACT_IND:
  179. if (arg & 1)
  180. sf->aux_data |= SFAX_LED1_BIT;
  181. if (arg & 2)
  182. sf->aux_data |= SFAX_LED2_BIT;
  183. outb(sf->aux_data, sf->cfg + TIGER_AUX_DATA);
  184. break;
  185. default:
  186. pr_info("%s: %s unknown command %x %lx\n",
  187. sf->name, __func__, cmd, arg);
  188. ret = -EINVAL;
  189. break;
  190. }
  191. return ret;
  192. }
  193. static int
  194. channel_ctrl(struct sfax_hw *sf, struct mISDN_ctrl_req *cq)
  195. {
  196. int ret = 0;
  197. switch (cq->op) {
  198. case MISDN_CTRL_GETOP:
  199. cq->op = MISDN_CTRL_LOOP;
  200. break;
  201. case MISDN_CTRL_LOOP:
  202. /* cq->channel: 0 disable, 1 B1 loop 2 B2 loop, 3 both */
  203. if (cq->channel < 0 || cq->channel > 3) {
  204. ret = -EINVAL;
  205. break;
  206. }
  207. ret = sf->isac.ctrl(&sf->isac, HW_TESTLOOP, cq->channel);
  208. break;
  209. default:
  210. pr_info("%s: unknown Op %x\n", sf->name, cq->op);
  211. ret = -EINVAL;
  212. break;
  213. }
  214. return ret;
  215. }
  216. static int
  217. sfax_dctrl(struct mISDNchannel *ch, u32 cmd, void *arg)
  218. {
  219. struct mISDNdevice *dev = container_of(ch, struct mISDNdevice, D);
  220. struct dchannel *dch = container_of(dev, struct dchannel, dev);
  221. struct sfax_hw *sf = dch->hw;
  222. struct channel_req *rq;
  223. int err = 0;
  224. pr_debug("%s: cmd:%x %p\n", sf->name, cmd, arg);
  225. switch (cmd) {
  226. case OPEN_CHANNEL:
  227. rq = arg;
  228. if (rq->protocol == ISDN_P_TE_S0)
  229. err = sf->isac.open(&sf->isac, rq);
  230. else
  231. err = sf->isar.open(&sf->isar, rq);
  232. if (err)
  233. break;
  234. if (!try_module_get(THIS_MODULE))
  235. pr_info("%s: cannot get module\n", sf->name);
  236. break;
  237. case CLOSE_CHANNEL:
  238. pr_debug("%s: dev(%d) close from %p\n", sf->name,
  239. dch->dev.id, __builtin_return_address(0));
  240. module_put(THIS_MODULE);
  241. break;
  242. case CONTROL_CHANNEL:
  243. err = channel_ctrl(sf, arg);
  244. break;
  245. default:
  246. pr_debug("%s: unknown command %x\n", sf->name, cmd);
  247. return -EINVAL;
  248. }
  249. return err;
  250. }
  251. static int __devinit
  252. init_card(struct sfax_hw *sf)
  253. {
  254. int ret, cnt = 3;
  255. u_long flags;
  256. ret = request_irq(sf->irq, speedfax_irq, IRQF_SHARED, sf->name, sf);
  257. if (ret) {
  258. pr_info("%s: couldn't get interrupt %d\n", sf->name, sf->irq);
  259. return ret;
  260. }
  261. while (cnt--) {
  262. spin_lock_irqsave(&sf->lock, flags);
  263. ret = sf->isac.init(&sf->isac);
  264. if (ret) {
  265. spin_unlock_irqrestore(&sf->lock, flags);
  266. pr_info("%s: ISAC init failed with %d\n",
  267. sf->name, ret);
  268. break;
  269. }
  270. enable_hwirq(sf);
  271. /* RESET Receiver and Transmitter */
  272. WriteISAC_IND(sf, ISAC_CMDR, 0x41);
  273. spin_unlock_irqrestore(&sf->lock, flags);
  274. msleep_interruptible(10);
  275. if (debug & DEBUG_HW)
  276. pr_notice("%s: IRQ %d count %d\n", sf->name,
  277. sf->irq, sf->irqcnt);
  278. if (!sf->irqcnt) {
  279. pr_info("%s: IRQ(%d) got no requests during init %d\n",
  280. sf->name, sf->irq, 3 - cnt);
  281. } else
  282. return 0;
  283. }
  284. free_irq(sf->irq, sf);
  285. return -EIO;
  286. }
  287. static int __devinit
  288. setup_speedfax(struct sfax_hw *sf)
  289. {
  290. u_long flags;
  291. if (!request_region(sf->cfg, 256, sf->name)) {
  292. pr_info("mISDN: %s config port %x-%x already in use\n",
  293. sf->name, sf->cfg, sf->cfg + 255);
  294. return -EIO;
  295. }
  296. outb(0xff, sf->cfg);
  297. outb(0, sf->cfg);
  298. outb(0xdd, sf->cfg + TIGER_AUX_CTRL);
  299. outb(0, sf->cfg + TIGER_AUX_IRQMASK);
  300. sf->isac.type = IPAC_TYPE_ISAC;
  301. sf->p_isac.ale = sf->cfg + SFAX_PCI_ADDR;
  302. sf->p_isac.port = sf->cfg + SFAX_PCI_ISAC;
  303. sf->p_isar.ale = sf->cfg + SFAX_PCI_ADDR;
  304. sf->p_isar.port = sf->cfg + SFAX_PCI_ISAR;
  305. ASSIGN_FUNC(IND, ISAC, sf->isac);
  306. ASSIGN_FUNC(IND, ISAR, sf->isar);
  307. spin_lock_irqsave(&sf->lock, flags);
  308. reset_speedfax(sf);
  309. disable_hwirq(sf);
  310. spin_unlock_irqrestore(&sf->lock, flags);
  311. return 0;
  312. }
  313. static void
  314. release_card(struct sfax_hw *card) {
  315. u_long flags;
  316. spin_lock_irqsave(&card->lock, flags);
  317. disable_hwirq(card);
  318. spin_unlock_irqrestore(&card->lock, flags);
  319. card->isac.release(&card->isac);
  320. free_irq(card->irq, card);
  321. card->isar.release(&card->isar);
  322. mISDN_unregister_device(&card->isac.dch.dev);
  323. release_region(card->cfg, 256);
  324. pci_disable_device(card->pdev);
  325. pci_set_drvdata(card->pdev, NULL);
  326. write_lock_irqsave(&card_lock, flags);
  327. list_del(&card->list);
  328. write_unlock_irqrestore(&card_lock, flags);
  329. kfree(card);
  330. sfax_cnt--;
  331. }
  332. static int __devinit
  333. setup_instance(struct sfax_hw *card)
  334. {
  335. const struct firmware *firmware;
  336. int i, err;
  337. u_long flags;
  338. snprintf(card->name, MISDN_MAX_IDLEN - 1, "Speedfax.%d", sfax_cnt + 1);
  339. write_lock_irqsave(&card_lock, flags);
  340. list_add_tail(&card->list, &Cards);
  341. write_unlock_irqrestore(&card_lock, flags);
  342. _set_debug(card);
  343. spin_lock_init(&card->lock);
  344. card->isac.hwlock = &card->lock;
  345. card->isar.hwlock = &card->lock;
  346. card->isar.ctrl = (void *)&sfax_ctrl;
  347. card->isac.name = card->name;
  348. card->isar.name = card->name;
  349. card->isar.owner = THIS_MODULE;
  350. err = request_firmware(&firmware, "isdn/ISAR.BIN", &card->pdev->dev);
  351. if (err < 0) {
  352. pr_info("%s: firmware request failed %d\n",
  353. card->name, err);
  354. goto error_fw;
  355. }
  356. if (debug & DEBUG_HW)
  357. pr_notice("%s: got firmware %zu bytes\n",
  358. card->name, firmware->size);
  359. mISDNisac_init(&card->isac, card);
  360. card->isac.dch.dev.D.ctrl = sfax_dctrl;
  361. card->isac.dch.dev.Bprotocols =
  362. mISDNisar_init(&card->isar, card);
  363. for (i = 0; i < 2; i++) {
  364. set_channelmap(i + 1, card->isac.dch.dev.channelmap);
  365. list_add(&card->isar.ch[i].bch.ch.list,
  366. &card->isac.dch.dev.bchannels);
  367. }
  368. err = setup_speedfax(card);
  369. if (err)
  370. goto error_setup;
  371. err = card->isar.init(&card->isar);
  372. if (err)
  373. goto error;
  374. err = mISDN_register_device(&card->isac.dch.dev,
  375. &card->pdev->dev, card->name);
  376. if (err)
  377. goto error;
  378. err = init_card(card);
  379. if (err)
  380. goto error_init;
  381. err = card->isar.firmware(&card->isar, firmware->data, firmware->size);
  382. if (!err) {
  383. release_firmware(firmware);
  384. sfax_cnt++;
  385. pr_notice("SpeedFax %d cards installed\n", sfax_cnt);
  386. return 0;
  387. }
  388. disable_hwirq(card);
  389. free_irq(card->irq, card);
  390. error_init:
  391. mISDN_unregister_device(&card->isac.dch.dev);
  392. error:
  393. release_region(card->cfg, 256);
  394. error_setup:
  395. card->isac.release(&card->isac);
  396. card->isar.release(&card->isar);
  397. release_firmware(firmware);
  398. error_fw:
  399. pci_disable_device(card->pdev);
  400. write_lock_irqsave(&card_lock, flags);
  401. list_del(&card->list);
  402. write_unlock_irqrestore(&card_lock, flags);
  403. kfree(card);
  404. return err;
  405. }
  406. static int __devinit
  407. sfaxpci_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
  408. {
  409. int err = -ENOMEM;
  410. struct sfax_hw *card = kzalloc(sizeof(struct sfax_hw), GFP_KERNEL);
  411. if (!card) {
  412. pr_info("No memory for Speedfax+ PCI\n");
  413. return err;
  414. }
  415. card->pdev = pdev;
  416. err = pci_enable_device(pdev);
  417. if (err) {
  418. kfree(card);
  419. return err;
  420. }
  421. pr_notice("mISDN: Speedfax found adapter %s at %s\n",
  422. (char *)ent->driver_data, pci_name(pdev));
  423. card->cfg = pci_resource_start(pdev, 0);
  424. card->irq = pdev->irq;
  425. pci_set_drvdata(pdev, card);
  426. err = setup_instance(card);
  427. if (err)
  428. pci_set_drvdata(pdev, NULL);
  429. return err;
  430. }
  431. static void __devexit
  432. sfax_remove_pci(struct pci_dev *pdev)
  433. {
  434. struct sfax_hw *card = pci_get_drvdata(pdev);
  435. if (card)
  436. release_card(card);
  437. else
  438. pr_debug("%s: drvdata allready removed\n", __func__);
  439. }
  440. static struct pci_device_id sfaxpci_ids[] __devinitdata = {
  441. { PCI_VENDOR_ID_TIGERJET, PCI_DEVICE_ID_TIGERJET_100,
  442. PCI_SUBVENDOR_SPEEDFAX_PYRAMID, PCI_SUB_ID_SEDLBAUER,
  443. 0, 0, (unsigned long) "Pyramid Speedfax + PCI"
  444. },
  445. { PCI_VENDOR_ID_TIGERJET, PCI_DEVICE_ID_TIGERJET_100,
  446. PCI_SUBVENDOR_SPEEDFAX_PCI, PCI_SUB_ID_SEDLBAUER,
  447. 0, 0, (unsigned long) "Sedlbauer Speedfax + PCI"
  448. },
  449. { }
  450. };
  451. MODULE_DEVICE_TABLE(pci, sfaxpci_ids);
  452. static struct pci_driver sfaxpci_driver = {
  453. .name = "speedfax+ pci",
  454. .probe = sfaxpci_probe,
  455. .remove = __devexit_p(sfax_remove_pci),
  456. .id_table = sfaxpci_ids,
  457. };
  458. static int __init
  459. Speedfax_init(void)
  460. {
  461. int err;
  462. pr_notice("Sedlbauer Speedfax+ Driver Rev. %s\n",
  463. SPEEDFAX_REV);
  464. err = pci_register_driver(&sfaxpci_driver);
  465. return err;
  466. }
  467. static void __exit
  468. Speedfax_cleanup(void)
  469. {
  470. pci_unregister_driver(&sfaxpci_driver);
  471. }
  472. module_init(Speedfax_init);
  473. module_exit(Speedfax_cleanup);