speedfax.c 12 KB

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