speedfax.c 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526
  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_param_call(debug, set_debug, param_get_uint, &debug, S_IRUGO | S_IWUSR);
  99. MODULE_PARM_DESC(debug, "Speedfax debug mask");
  100. module_param(irqloops, uint, S_IRUGO | S_IWUSR);
  101. MODULE_PARM_DESC(irqloops, "Speedfax maximal irqloops (default 4)");
  102. IOFUNC_IND(ISAC, sfax_hw, p_isac)
  103. IOFUNC_IND(ISAR, sfax_hw, p_isar)
  104. static irqreturn_t
  105. speedfax_irq(int intno, void *dev_id)
  106. {
  107. struct sfax_hw *sf = dev_id;
  108. u8 val;
  109. int cnt = irqloops;
  110. spin_lock(&sf->lock);
  111. val = inb(sf->cfg + TIGER_AUX_STATUS);
  112. if (val & SFAX_TIGER_IRQ_BIT) { /* for us or shared ? */
  113. spin_unlock(&sf->lock);
  114. return IRQ_NONE; /* shared */
  115. }
  116. sf->irqcnt++;
  117. val = ReadISAR_IND(sf, ISAR_IRQBIT);
  118. Start_ISAR:
  119. if (val & ISAR_IRQSTA)
  120. mISDNisar_irq(&sf->isar);
  121. val = ReadISAC_IND(sf, ISAC_ISTA);
  122. if (val)
  123. mISDNisac_irq(&sf->isac, val);
  124. val = ReadISAR_IND(sf, ISAR_IRQBIT);
  125. if ((val & ISAR_IRQSTA) && cnt--)
  126. goto Start_ISAR;
  127. if (cnt < irqloops)
  128. pr_debug("%s: %d irqloops cpu%d\n", sf->name,
  129. irqloops - cnt, smp_processor_id());
  130. if (irqloops && !cnt)
  131. pr_notice("%s: %d IRQ LOOP cpu%d\n", sf->name,
  132. irqloops, smp_processor_id());
  133. spin_unlock(&sf->lock);
  134. return IRQ_HANDLED;
  135. }
  136. static void
  137. enable_hwirq(struct sfax_hw *sf)
  138. {
  139. WriteISAC_IND(sf, ISAC_MASK, 0);
  140. WriteISAR_IND(sf, ISAR_IRQBIT, ISAR_IRQMSK);
  141. outb(SFAX_TIGER_IRQ_BIT, sf->cfg + TIGER_AUX_IRQMASK);
  142. }
  143. static void
  144. disable_hwirq(struct sfax_hw *sf)
  145. {
  146. WriteISAC_IND(sf, ISAC_MASK, 0xFF);
  147. WriteISAR_IND(sf, ISAR_IRQBIT, 0);
  148. outb(0, sf->cfg + TIGER_AUX_IRQMASK);
  149. }
  150. static void
  151. reset_speedfax(struct sfax_hw *sf)
  152. {
  153. pr_debug("%s: resetting card\n", sf->name);
  154. outb(TIGER_EXTERN_RESET_ON, sf->cfg + TIGER_RESET_ADDR);
  155. outb(SFAX_PCI_RESET_ON, sf->cfg + TIGER_AUX_DATA);
  156. mdelay(1);
  157. outb(TIGER_EXTERN_RESET_OFF, sf->cfg + TIGER_RESET_ADDR);
  158. sf->aux_data = SFAX_PCI_RESET_OFF;
  159. outb(sf->aux_data, sf->cfg + TIGER_AUX_DATA);
  160. mdelay(1);
  161. }
  162. static int
  163. sfax_ctrl(struct sfax_hw *sf, u32 cmd, u_long arg)
  164. {
  165. int ret = 0;
  166. switch (cmd) {
  167. case HW_RESET_REQ:
  168. reset_speedfax(sf);
  169. break;
  170. case HW_ACTIVATE_IND:
  171. if (arg & 1)
  172. sf->aux_data &= ~SFAX_LED1_BIT;
  173. if (arg & 2)
  174. sf->aux_data &= ~SFAX_LED2_BIT;
  175. outb(sf->aux_data, sf->cfg + TIGER_AUX_DATA);
  176. break;
  177. case HW_DEACT_IND:
  178. if (arg & 1)
  179. sf->aux_data |= SFAX_LED1_BIT;
  180. if (arg & 2)
  181. sf->aux_data |= SFAX_LED2_BIT;
  182. outb(sf->aux_data, sf->cfg + TIGER_AUX_DATA);
  183. break;
  184. default:
  185. pr_info("%s: %s unknown command %x %lx\n",
  186. sf->name, __func__, cmd, arg);
  187. ret = -EINVAL;
  188. break;
  189. }
  190. return ret;
  191. }
  192. static int
  193. channel_ctrl(struct sfax_hw *sf, struct mISDN_ctrl_req *cq)
  194. {
  195. int ret = 0;
  196. switch (cq->op) {
  197. case MISDN_CTRL_GETOP:
  198. cq->op = MISDN_CTRL_LOOP;
  199. break;
  200. case MISDN_CTRL_LOOP:
  201. /* cq->channel: 0 disable, 1 B1 loop 2 B2 loop, 3 both */
  202. if (cq->channel < 0 || cq->channel > 3) {
  203. ret = -EINVAL;
  204. break;
  205. }
  206. ret = sf->isac.ctrl(&sf->isac, HW_TESTLOOP, cq->channel);
  207. break;
  208. default:
  209. pr_info("%s: unknown Op %x\n", sf->name, cq->op);
  210. ret = -EINVAL;
  211. break;
  212. }
  213. return ret;
  214. }
  215. static int
  216. sfax_dctrl(struct mISDNchannel *ch, u32 cmd, void *arg)
  217. {
  218. struct mISDNdevice *dev = container_of(ch, struct mISDNdevice, D);
  219. struct dchannel *dch = container_of(dev, struct dchannel, dev);
  220. struct sfax_hw *sf = dch->hw;
  221. struct channel_req *rq;
  222. int err = 0;
  223. pr_debug("%s: cmd:%x %p\n", sf->name, cmd, arg);
  224. switch (cmd) {
  225. case OPEN_CHANNEL:
  226. rq = arg;
  227. if (rq->protocol == ISDN_P_TE_S0)
  228. err = sf->isac.open(&sf->isac, rq);
  229. else
  230. err = sf->isar.open(&sf->isar, rq);
  231. if (err)
  232. break;
  233. if (!try_module_get(THIS_MODULE))
  234. pr_info("%s: cannot get module\n", sf->name);
  235. break;
  236. case CLOSE_CHANNEL:
  237. pr_debug("%s: dev(%d) close from %p\n", sf->name,
  238. dch->dev.id, __builtin_return_address(0));
  239. module_put(THIS_MODULE);
  240. break;
  241. case CONTROL_CHANNEL:
  242. err = channel_ctrl(sf, arg);
  243. break;
  244. default:
  245. pr_debug("%s: unknown command %x\n", sf->name, cmd);
  246. return -EINVAL;
  247. }
  248. return err;
  249. }
  250. static int __devinit
  251. init_card(struct sfax_hw *sf)
  252. {
  253. int ret, cnt = 3;
  254. u_long flags;
  255. ret = request_irq(sf->irq, speedfax_irq, IRQF_SHARED, sf->name, sf);
  256. if (ret) {
  257. pr_info("%s: couldn't get interrupt %d\n", sf->name, sf->irq);
  258. return ret;
  259. }
  260. while (cnt--) {
  261. spin_lock_irqsave(&sf->lock, flags);
  262. ret = sf->isac.init(&sf->isac);
  263. if (ret) {
  264. spin_unlock_irqrestore(&sf->lock, flags);
  265. pr_info("%s: ISAC init failed with %d\n",
  266. sf->name, ret);
  267. break;
  268. }
  269. enable_hwirq(sf);
  270. /* RESET Receiver and Transmitter */
  271. WriteISAC_IND(sf, ISAC_CMDR, 0x41);
  272. spin_unlock_irqrestore(&sf->lock, flags);
  273. msleep_interruptible(10);
  274. if (debug & DEBUG_HW)
  275. pr_notice("%s: IRQ %d count %d\n", sf->name,
  276. sf->irq, sf->irqcnt);
  277. if (!sf->irqcnt) {
  278. pr_info("%s: IRQ(%d) got no requests during init %d\n",
  279. sf->name, sf->irq, 3 - cnt);
  280. } else
  281. return 0;
  282. }
  283. free_irq(sf->irq, sf);
  284. return -EIO;
  285. }
  286. static int __devinit
  287. setup_speedfax(struct sfax_hw *sf)
  288. {
  289. u_long flags;
  290. if (!request_region(sf->cfg, 256, sf->name)) {
  291. pr_info("mISDN: %s config port %x-%x already in use\n",
  292. sf->name, sf->cfg, sf->cfg + 255);
  293. return -EIO;
  294. }
  295. outb(0xff, sf->cfg);
  296. outb(0, sf->cfg);
  297. outb(0xdd, sf->cfg + TIGER_AUX_CTRL);
  298. outb(0, sf->cfg + TIGER_AUX_IRQMASK);
  299. sf->isac.type = IPAC_TYPE_ISAC;
  300. sf->p_isac.ale = sf->cfg + SFAX_PCI_ADDR;
  301. sf->p_isac.port = sf->cfg + SFAX_PCI_ISAC;
  302. sf->p_isar.ale = sf->cfg + SFAX_PCI_ADDR;
  303. sf->p_isar.port = sf->cfg + SFAX_PCI_ISAR;
  304. ASSIGN_FUNC(IND, ISAC, sf->isac);
  305. ASSIGN_FUNC(IND, ISAR, sf->isar);
  306. spin_lock_irqsave(&sf->lock, flags);
  307. reset_speedfax(sf);
  308. disable_hwirq(sf);
  309. spin_unlock_irqrestore(&sf->lock, flags);
  310. return 0;
  311. }
  312. static void
  313. release_card(struct sfax_hw *card) {
  314. u_long flags;
  315. spin_lock_irqsave(&card->lock, flags);
  316. disable_hwirq(card);
  317. spin_unlock_irqrestore(&card->lock, flags);
  318. card->isac.release(&card->isac);
  319. free_irq(card->irq, card);
  320. card->isar.release(&card->isar);
  321. mISDN_unregister_device(&card->isac.dch.dev);
  322. release_region(card->cfg, 256);
  323. pci_disable_device(card->pdev);
  324. pci_set_drvdata(card->pdev, NULL);
  325. write_lock_irqsave(&card_lock, flags);
  326. list_del(&card->list);
  327. write_unlock_irqrestore(&card_lock, flags);
  328. kfree(card);
  329. sfax_cnt--;
  330. }
  331. static int __devinit
  332. setup_instance(struct sfax_hw *card)
  333. {
  334. const struct firmware *firmware;
  335. int i, err;
  336. u_long flags;
  337. snprintf(card->name, MISDN_MAX_IDLEN - 1, "Speedfax.%d", sfax_cnt + 1);
  338. write_lock_irqsave(&card_lock, flags);
  339. list_add_tail(&card->list, &Cards);
  340. write_unlock_irqrestore(&card_lock, flags);
  341. _set_debug(card);
  342. spin_lock_init(&card->lock);
  343. card->isac.hwlock = &card->lock;
  344. card->isar.hwlock = &card->lock;
  345. card->isar.ctrl = (void *)&sfax_ctrl;
  346. card->isac.name = card->name;
  347. card->isar.name = card->name;
  348. card->isar.owner = THIS_MODULE;
  349. err = request_firmware(&firmware, "isdn/ISAR.BIN", &card->pdev->dev);
  350. if (err < 0) {
  351. pr_info("%s: firmware request failed %d\n",
  352. card->name, err);
  353. goto error_fw;
  354. }
  355. if (debug & DEBUG_HW)
  356. pr_notice("%s: got firmware %zu bytes\n",
  357. card->name, firmware->size);
  358. mISDNisac_init(&card->isac, card);
  359. card->isac.dch.dev.D.ctrl = sfax_dctrl;
  360. card->isac.dch.dev.Bprotocols =
  361. mISDNisar_init(&card->isar, card);
  362. for (i = 0; i < 2; i++) {
  363. set_channelmap(i + 1, card->isac.dch.dev.channelmap);
  364. list_add(&card->isar.ch[i].bch.ch.list,
  365. &card->isac.dch.dev.bchannels);
  366. }
  367. err = setup_speedfax(card);
  368. if (err)
  369. goto error_setup;
  370. err = card->isar.init(&card->isar);
  371. if (err)
  372. goto error;
  373. err = mISDN_register_device(&card->isac.dch.dev,
  374. &card->pdev->dev, card->name);
  375. if (err)
  376. goto error;
  377. err = init_card(card);
  378. if (err)
  379. goto error_init;
  380. err = card->isar.firmware(&card->isar, firmware->data, firmware->size);
  381. if (!err) {
  382. release_firmware(firmware);
  383. sfax_cnt++;
  384. pr_notice("SpeedFax %d cards installed\n", sfax_cnt);
  385. return 0;
  386. }
  387. disable_hwirq(card);
  388. free_irq(card->irq, card);
  389. error_init:
  390. mISDN_unregister_device(&card->isac.dch.dev);
  391. error:
  392. release_region(card->cfg, 256);
  393. error_setup:
  394. card->isac.release(&card->isac);
  395. card->isar.release(&card->isar);
  396. release_firmware(firmware);
  397. error_fw:
  398. pci_disable_device(card->pdev);
  399. write_lock_irqsave(&card_lock, flags);
  400. list_del(&card->list);
  401. write_unlock_irqrestore(&card_lock, flags);
  402. kfree(card);
  403. return err;
  404. }
  405. static int __devinit
  406. sfaxpci_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
  407. {
  408. int err = -ENOMEM;
  409. struct sfax_hw *card = kzalloc(sizeof(struct sfax_hw), GFP_KERNEL);
  410. if (!card) {
  411. pr_info("No memory for Speedfax+ PCI\n");
  412. return err;
  413. }
  414. card->pdev = pdev;
  415. err = pci_enable_device(pdev);
  416. if (err) {
  417. kfree(card);
  418. return err;
  419. }
  420. pr_notice("mISDN: Speedfax found adapter %s at %s\n",
  421. (char *)ent->driver_data, pci_name(pdev));
  422. card->cfg = pci_resource_start(pdev, 0);
  423. card->irq = pdev->irq;
  424. pci_set_drvdata(pdev, card);
  425. err = setup_instance(card);
  426. if (err)
  427. pci_set_drvdata(pdev, NULL);
  428. return err;
  429. }
  430. static void __devexit
  431. sfax_remove_pci(struct pci_dev *pdev)
  432. {
  433. struct sfax_hw *card = pci_get_drvdata(pdev);
  434. if (card)
  435. release_card(card);
  436. else
  437. pr_debug("%s: drvdata allready removed\n", __func__);
  438. }
  439. static struct pci_device_id sfaxpci_ids[] __devinitdata = {
  440. { PCI_VENDOR_ID_TIGERJET, PCI_DEVICE_ID_TIGERJET_100,
  441. PCI_SUBVENDOR_SPEEDFAX_PYRAMID, PCI_SUB_ID_SEDLBAUER,
  442. 0, 0, (unsigned long) "Pyramid Speedfax + PCI"
  443. },
  444. { PCI_VENDOR_ID_TIGERJET, PCI_DEVICE_ID_TIGERJET_100,
  445. PCI_SUBVENDOR_SPEEDFAX_PCI, PCI_SUB_ID_SEDLBAUER,
  446. 0, 0, (unsigned long) "Sedlbauer Speedfax + PCI"
  447. },
  448. { }
  449. };
  450. MODULE_DEVICE_TABLE(pci, sfaxpci_ids);
  451. static struct pci_driver sfaxpci_driver = {
  452. .name = "speedfax+ pci",
  453. .probe = sfaxpci_probe,
  454. .remove = __devexit_p(sfax_remove_pci),
  455. .id_table = sfaxpci_ids,
  456. };
  457. static int __init
  458. Speedfax_init(void)
  459. {
  460. int err;
  461. pr_notice("Sedlbauer Speedfax+ Driver Rev. %s\n",
  462. SPEEDFAX_REV);
  463. err = pci_register_driver(&sfaxpci_driver);
  464. return err;
  465. }
  466. static void __exit
  467. Speedfax_cleanup(void)
  468. {
  469. pci_unregister_driver(&sfaxpci_driver);
  470. }
  471. module_init(Speedfax_init);
  472. module_exit(Speedfax_cleanup);