icn.c 42 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692
  1. /* $Id: icn.c,v 1.65.6.8 2001/09/23 22:24:55 kai Exp $
  2. *
  3. * ISDN low-level module for the ICN active ISDN-Card.
  4. *
  5. * Copyright 1994,95,96 by Fritz Elfert (fritz@isdn4linux.de)
  6. *
  7. * This software may be used and distributed according to the terms
  8. * of the GNU General Public License, incorporated herein by reference.
  9. *
  10. */
  11. #include "icn.h"
  12. #include <linux/module.h>
  13. #include <linux/init.h>
  14. #include <linux/sched.h>
  15. static int portbase = ICN_BASEADDR;
  16. static unsigned long membase = ICN_MEMADDR;
  17. static char *icn_id = "\0";
  18. static char *icn_id2 = "\0";
  19. MODULE_DESCRIPTION("ISDN4Linux: Driver for ICN active ISDN card");
  20. MODULE_AUTHOR("Fritz Elfert");
  21. MODULE_LICENSE("GPL");
  22. module_param(portbase, int, 0);
  23. MODULE_PARM_DESC(portbase, "Port address of first card");
  24. module_param(membase, ulong, 0);
  25. MODULE_PARM_DESC(membase, "Shared memory address of all cards");
  26. module_param(icn_id, charp, 0);
  27. MODULE_PARM_DESC(icn_id, "ID-String of first card");
  28. module_param(icn_id2, charp, 0);
  29. MODULE_PARM_DESC(icn_id2, "ID-String of first card, second S0 (4B only)");
  30. /*
  31. * Verbose bootcode- and protocol-downloading.
  32. */
  33. #undef BOOT_DEBUG
  34. /*
  35. * Verbose Shmem-Mapping.
  36. */
  37. #undef MAP_DEBUG
  38. static char
  39. *revision = "$Revision: 1.65.6.8 $";
  40. static int icn_addcard(int, char *, char *);
  41. /*
  42. * Free send-queue completely.
  43. * Parameter:
  44. * card = pointer to card struct
  45. * channel = channel number
  46. */
  47. static void
  48. icn_free_queue(icn_card * card, int channel)
  49. {
  50. struct sk_buff_head *queue = &card->spqueue[channel];
  51. struct sk_buff *skb;
  52. skb_queue_purge(queue);
  53. card->xlen[channel] = 0;
  54. card->sndcount[channel] = 0;
  55. if ((skb = card->xskb[channel])) {
  56. card->xskb[channel] = NULL;
  57. dev_kfree_skb(skb);
  58. }
  59. }
  60. /* Put a value into a shift-register, highest bit first.
  61. * Parameters:
  62. * port = port for output (bit 0 is significant)
  63. * val = value to be output
  64. * firstbit = Bit-Number of highest bit
  65. * bitcount = Number of bits to output
  66. */
  67. static inline void
  68. icn_shiftout(unsigned short port,
  69. unsigned long val,
  70. int firstbit,
  71. int bitcount)
  72. {
  73. register u_char s;
  74. register u_char c;
  75. for (s = firstbit, c = bitcount; c > 0; s--, c--)
  76. OUTB_P((u_char) ((val >> s) & 1) ? 0xff : 0, port);
  77. }
  78. /*
  79. * disable a cards shared memory
  80. */
  81. static inline void
  82. icn_disable_ram(icn_card * card)
  83. {
  84. OUTB_P(0, ICN_MAPRAM);
  85. }
  86. /*
  87. * enable a cards shared memory
  88. */
  89. static inline void
  90. icn_enable_ram(icn_card * card)
  91. {
  92. OUTB_P(0xff, ICN_MAPRAM);
  93. }
  94. /*
  95. * Map a cards channel0 (Bank0/Bank8) or channel1 (Bank4/Bank12)
  96. *
  97. * must called with holding the devlock
  98. */
  99. static inline void
  100. icn_map_channel(icn_card * card, int channel)
  101. {
  102. #ifdef MAP_DEBUG
  103. printk(KERN_DEBUG "icn_map_channel %d %d\n", dev.channel, channel);
  104. #endif
  105. if ((channel == dev.channel) && (card == dev.mcard))
  106. return;
  107. if (dev.mcard)
  108. icn_disable_ram(dev.mcard);
  109. icn_shiftout(ICN_BANK, chan2bank[channel], 3, 4); /* Select Bank */
  110. icn_enable_ram(card);
  111. dev.mcard = card;
  112. dev.channel = channel;
  113. #ifdef MAP_DEBUG
  114. printk(KERN_DEBUG "icn_map_channel done\n");
  115. #endif
  116. }
  117. /*
  118. * Lock a cards channel.
  119. * Return 0 if requested card/channel is unmapped (failure).
  120. * Return 1 on success.
  121. *
  122. * must called with holding the devlock
  123. */
  124. static inline int
  125. icn_lock_channel(icn_card * card, int channel)
  126. {
  127. register int retval;
  128. #ifdef MAP_DEBUG
  129. printk(KERN_DEBUG "icn_lock_channel %d\n", channel);
  130. #endif
  131. if ((dev.channel == channel) && (card == dev.mcard)) {
  132. dev.chanlock++;
  133. retval = 1;
  134. #ifdef MAP_DEBUG
  135. printk(KERN_DEBUG "icn_lock_channel %d OK\n", channel);
  136. #endif
  137. } else {
  138. retval = 0;
  139. #ifdef MAP_DEBUG
  140. printk(KERN_DEBUG "icn_lock_channel %d FAILED, dc=%d\n", channel, dev.channel);
  141. #endif
  142. }
  143. return retval;
  144. }
  145. /*
  146. * Release current card/channel lock
  147. *
  148. * must called with holding the devlock
  149. */
  150. static inline void
  151. __icn_release_channel(void)
  152. {
  153. #ifdef MAP_DEBUG
  154. printk(KERN_DEBUG "icn_release_channel l=%d\n", dev.chanlock);
  155. #endif
  156. if (dev.chanlock > 0)
  157. dev.chanlock--;
  158. }
  159. /*
  160. * Release current card/channel lock
  161. */
  162. static inline void
  163. icn_release_channel(void)
  164. {
  165. ulong flags;
  166. spin_lock_irqsave(&dev.devlock, flags);
  167. __icn_release_channel();
  168. spin_unlock_irqrestore(&dev.devlock, flags);
  169. }
  170. /*
  171. * Try to map and lock a cards channel.
  172. * Return 1 on success, 0 on failure.
  173. */
  174. static inline int
  175. icn_trymaplock_channel(icn_card * card, int channel)
  176. {
  177. ulong flags;
  178. #ifdef MAP_DEBUG
  179. printk(KERN_DEBUG "trymaplock c=%d dc=%d l=%d\n", channel, dev.channel,
  180. dev.chanlock);
  181. #endif
  182. spin_lock_irqsave(&dev.devlock, flags);
  183. if ((!dev.chanlock) ||
  184. ((dev.channel == channel) && (dev.mcard == card))) {
  185. dev.chanlock++;
  186. icn_map_channel(card, channel);
  187. spin_unlock_irqrestore(&dev.devlock, flags);
  188. #ifdef MAP_DEBUG
  189. printk(KERN_DEBUG "trymaplock %d OK\n", channel);
  190. #endif
  191. return 1;
  192. }
  193. spin_unlock_irqrestore(&dev.devlock, flags);
  194. #ifdef MAP_DEBUG
  195. printk(KERN_DEBUG "trymaplock %d FAILED\n", channel);
  196. #endif
  197. return 0;
  198. }
  199. /*
  200. * Release current card/channel lock,
  201. * then map same or other channel without locking.
  202. */
  203. static inline void
  204. icn_maprelease_channel(icn_card * card, int channel)
  205. {
  206. ulong flags;
  207. #ifdef MAP_DEBUG
  208. printk(KERN_DEBUG "map_release c=%d l=%d\n", channel, dev.chanlock);
  209. #endif
  210. spin_lock_irqsave(&dev.devlock, flags);
  211. if (dev.chanlock > 0)
  212. dev.chanlock--;
  213. if (!dev.chanlock)
  214. icn_map_channel(card, channel);
  215. spin_unlock_irqrestore(&dev.devlock, flags);
  216. }
  217. /* Get Data from the B-Channel, assemble fragmented packets and put them
  218. * into receive-queue. Wake up any B-Channel-reading processes.
  219. * This routine is called via timer-callback from icn_pollbchan().
  220. */
  221. static void
  222. icn_pollbchan_receive(int channel, icn_card * card)
  223. {
  224. int mch = channel + ((card->secondhalf) ? 2 : 0);
  225. int eflag;
  226. int cnt;
  227. struct sk_buff *skb;
  228. if (icn_trymaplock_channel(card, mch)) {
  229. while (rbavl) {
  230. cnt = readb(&rbuf_l);
  231. if ((card->rcvidx[channel] + cnt) > 4000) {
  232. printk(KERN_WARNING
  233. "icn: (%s) bogus packet on ch%d, dropping.\n",
  234. CID,
  235. channel + 1);
  236. card->rcvidx[channel] = 0;
  237. eflag = 0;
  238. } else {
  239. memcpy_fromio(&card->rcvbuf[channel][card->rcvidx[channel]],
  240. &rbuf_d, cnt);
  241. card->rcvidx[channel] += cnt;
  242. eflag = readb(&rbuf_f);
  243. }
  244. rbnext;
  245. icn_maprelease_channel(card, mch & 2);
  246. if (!eflag) {
  247. if ((cnt = card->rcvidx[channel])) {
  248. if (!(skb = dev_alloc_skb(cnt))) {
  249. printk(KERN_WARNING "icn: receive out of memory\n");
  250. break;
  251. }
  252. memcpy(skb_put(skb, cnt), card->rcvbuf[channel], cnt);
  253. card->rcvidx[channel] = 0;
  254. card->interface.rcvcallb_skb(card->myid, channel, skb);
  255. }
  256. }
  257. if (!icn_trymaplock_channel(card, mch))
  258. break;
  259. }
  260. icn_maprelease_channel(card, mch & 2);
  261. }
  262. }
  263. /* Send data-packet to B-Channel, split it up into fragments of
  264. * ICN_FRAGSIZE length. If last fragment is sent out, signal
  265. * success to upper layers via statcallb with ISDN_STAT_BSENT argument.
  266. * This routine is called via timer-callback from icn_pollbchan() or
  267. * directly from icn_sendbuf().
  268. */
  269. static void
  270. icn_pollbchan_send(int channel, icn_card * card)
  271. {
  272. int mch = channel + ((card->secondhalf) ? 2 : 0);
  273. int cnt;
  274. unsigned long flags;
  275. struct sk_buff *skb;
  276. isdn_ctrl cmd;
  277. if (!(card->sndcount[channel] || card->xskb[channel] ||
  278. !skb_queue_empty(&card->spqueue[channel])))
  279. return;
  280. if (icn_trymaplock_channel(card, mch)) {
  281. while (sbfree &&
  282. (card->sndcount[channel] ||
  283. !skb_queue_empty(&card->spqueue[channel]) ||
  284. card->xskb[channel])) {
  285. spin_lock_irqsave(&card->lock, flags);
  286. if (card->xmit_lock[channel]) {
  287. spin_unlock_irqrestore(&card->lock, flags);
  288. break;
  289. }
  290. card->xmit_lock[channel]++;
  291. spin_unlock_irqrestore(&card->lock, flags);
  292. skb = card->xskb[channel];
  293. if (!skb) {
  294. skb = skb_dequeue(&card->spqueue[channel]);
  295. if (skb) {
  296. /* Pop ACK-flag off skb.
  297. * Store length to xlen.
  298. */
  299. if (*(skb_pull(skb,1)))
  300. card->xlen[channel] = skb->len;
  301. else
  302. card->xlen[channel] = 0;
  303. }
  304. }
  305. if (!skb)
  306. break;
  307. if (skb->len > ICN_FRAGSIZE) {
  308. writeb(0xff, &sbuf_f);
  309. cnt = ICN_FRAGSIZE;
  310. } else {
  311. writeb(0x0, &sbuf_f);
  312. cnt = skb->len;
  313. }
  314. writeb(cnt, &sbuf_l);
  315. memcpy_toio(&sbuf_d, skb->data, cnt);
  316. skb_pull(skb, cnt);
  317. sbnext; /* switch to next buffer */
  318. icn_maprelease_channel(card, mch & 2);
  319. spin_lock_irqsave(&card->lock, flags);
  320. card->sndcount[channel] -= cnt;
  321. if (!skb->len) {
  322. if (card->xskb[channel])
  323. card->xskb[channel] = NULL;
  324. card->xmit_lock[channel] = 0;
  325. spin_unlock_irqrestore(&card->lock, flags);
  326. dev_kfree_skb(skb);
  327. if (card->xlen[channel]) {
  328. cmd.command = ISDN_STAT_BSENT;
  329. cmd.driver = card->myid;
  330. cmd.arg = channel;
  331. cmd.parm.length = card->xlen[channel];
  332. card->interface.statcallb(&cmd);
  333. }
  334. } else {
  335. card->xskb[channel] = skb;
  336. card->xmit_lock[channel] = 0;
  337. spin_unlock_irqrestore(&card->lock, flags);
  338. }
  339. if (!icn_trymaplock_channel(card, mch))
  340. break;
  341. }
  342. icn_maprelease_channel(card, mch & 2);
  343. }
  344. }
  345. /* Send/Receive Data to/from the B-Channel.
  346. * This routine is called via timer-callback.
  347. * It schedules itself while any B-Channel is open.
  348. */
  349. static void
  350. icn_pollbchan(unsigned long data)
  351. {
  352. icn_card *card = (icn_card *) data;
  353. unsigned long flags;
  354. if (card->flags & ICN_FLAGS_B1ACTIVE) {
  355. icn_pollbchan_receive(0, card);
  356. icn_pollbchan_send(0, card);
  357. }
  358. if (card->flags & ICN_FLAGS_B2ACTIVE) {
  359. icn_pollbchan_receive(1, card);
  360. icn_pollbchan_send(1, card);
  361. }
  362. if (card->flags & (ICN_FLAGS_B1ACTIVE | ICN_FLAGS_B2ACTIVE)) {
  363. /* schedule b-channel polling again */
  364. spin_lock_irqsave(&card->lock, flags);
  365. mod_timer(&card->rb_timer, jiffies+ICN_TIMER_BCREAD);
  366. card->flags |= ICN_FLAGS_RBTIMER;
  367. spin_unlock_irqrestore(&card->lock, flags);
  368. } else
  369. card->flags &= ~ICN_FLAGS_RBTIMER;
  370. }
  371. typedef struct icn_stat {
  372. char *statstr;
  373. int command;
  374. int action;
  375. } icn_stat;
  376. /* *INDENT-OFF* */
  377. static icn_stat icn_stat_table[] =
  378. {
  379. {"BCON_", ISDN_STAT_BCONN, 1}, /* B-Channel connected */
  380. {"BDIS_", ISDN_STAT_BHUP, 2}, /* B-Channel disconnected */
  381. /*
  382. ** add d-channel connect and disconnect support to link-level
  383. */
  384. {"DCON_", ISDN_STAT_DCONN, 10}, /* D-Channel connected */
  385. {"DDIS_", ISDN_STAT_DHUP, 11}, /* D-Channel disconnected */
  386. {"DCAL_I", ISDN_STAT_ICALL, 3}, /* Incoming call dialup-line */
  387. {"DSCA_I", ISDN_STAT_ICALL, 3}, /* Incoming call 1TR6-SPV */
  388. {"FCALL", ISDN_STAT_ICALL, 4}, /* Leased line connection up */
  389. {"CIF", ISDN_STAT_CINF, 5}, /* Charge-info, 1TR6-type */
  390. {"AOC", ISDN_STAT_CINF, 6}, /* Charge-info, DSS1-type */
  391. {"CAU", ISDN_STAT_CAUSE, 7}, /* Cause code */
  392. {"TEI OK", ISDN_STAT_RUN, 0}, /* Card connected to wallplug */
  393. {"E_L1: ACT FAIL", ISDN_STAT_BHUP, 8}, /* Layer-1 activation failed */
  394. {"E_L2: DATA LIN", ISDN_STAT_BHUP, 8}, /* Layer-2 data link lost */
  395. {"E_L1: ACTIVATION FAILED",
  396. ISDN_STAT_BHUP, 8}, /* Layer-1 activation failed */
  397. {NULL, 0, -1}
  398. };
  399. /* *INDENT-ON* */
  400. /*
  401. * Check Statusqueue-Pointer from isdn-cards.
  402. * If there are new status-replies from the interface, check
  403. * them against B-Channel-connects/disconnects and set flags accordingly.
  404. * Wake-Up any processes, who are reading the status-device.
  405. * If there are B-Channels open, initiate a timer-callback to
  406. * icn_pollbchan().
  407. * This routine is called periodically via timer.
  408. */
  409. static void
  410. icn_parse_status(u_char * status, int channel, icn_card * card)
  411. {
  412. icn_stat *s = icn_stat_table;
  413. int action = -1;
  414. unsigned long flags;
  415. isdn_ctrl cmd;
  416. while (s->statstr) {
  417. if (!strncmp(status, s->statstr, strlen(s->statstr))) {
  418. cmd.command = s->command;
  419. action = s->action;
  420. break;
  421. }
  422. s++;
  423. }
  424. if (action == -1)
  425. return;
  426. cmd.driver = card->myid;
  427. cmd.arg = channel;
  428. switch (action) {
  429. case 11:
  430. spin_lock_irqsave(&card->lock, flags);
  431. icn_free_queue(card,channel);
  432. card->rcvidx[channel] = 0;
  433. if (card->flags &
  434. ((channel)?ICN_FLAGS_B2ACTIVE:ICN_FLAGS_B1ACTIVE)) {
  435. isdn_ctrl ncmd;
  436. card->flags &= ~((channel)?
  437. ICN_FLAGS_B2ACTIVE:ICN_FLAGS_B1ACTIVE);
  438. memset(&ncmd, 0, sizeof(ncmd));
  439. ncmd.driver = card->myid;
  440. ncmd.arg = channel;
  441. ncmd.command = ISDN_STAT_BHUP;
  442. spin_unlock_irqrestore(&card->lock, flags);
  443. card->interface.statcallb(&cmd);
  444. } else
  445. spin_unlock_irqrestore(&card->lock, flags);
  446. break;
  447. case 1:
  448. spin_lock_irqsave(&card->lock, flags);
  449. icn_free_queue(card,channel);
  450. card->flags |= (channel) ?
  451. ICN_FLAGS_B2ACTIVE : ICN_FLAGS_B1ACTIVE;
  452. spin_unlock_irqrestore(&card->lock, flags);
  453. break;
  454. case 2:
  455. spin_lock_irqsave(&card->lock, flags);
  456. card->flags &= ~((channel) ?
  457. ICN_FLAGS_B2ACTIVE : ICN_FLAGS_B1ACTIVE);
  458. icn_free_queue(card, channel);
  459. card->rcvidx[channel] = 0;
  460. spin_unlock_irqrestore(&card->lock, flags);
  461. break;
  462. case 3:
  463. {
  464. char *t = status + 6;
  465. char *s = strchr(t, ',');
  466. *s++ = '\0';
  467. strlcpy(cmd.parm.setup.phone, t,
  468. sizeof(cmd.parm.setup.phone));
  469. s = strchr(t = s, ',');
  470. *s++ = '\0';
  471. if (!strlen(t))
  472. cmd.parm.setup.si1 = 0;
  473. else
  474. cmd.parm.setup.si1 =
  475. simple_strtoul(t, NULL, 10);
  476. s = strchr(t = s, ',');
  477. *s++ = '\0';
  478. if (!strlen(t))
  479. cmd.parm.setup.si2 = 0;
  480. else
  481. cmd.parm.setup.si2 =
  482. simple_strtoul(t, NULL, 10);
  483. strlcpy(cmd.parm.setup.eazmsn, s,
  484. sizeof(cmd.parm.setup.eazmsn));
  485. }
  486. cmd.parm.setup.plan = 0;
  487. cmd.parm.setup.screen = 0;
  488. break;
  489. case 4:
  490. sprintf(cmd.parm.setup.phone, "LEASED%d", card->myid);
  491. sprintf(cmd.parm.setup.eazmsn, "%d", channel + 1);
  492. cmd.parm.setup.si1 = 7;
  493. cmd.parm.setup.si2 = 0;
  494. cmd.parm.setup.plan = 0;
  495. cmd.parm.setup.screen = 0;
  496. break;
  497. case 5:
  498. strlcpy(cmd.parm.num, status + 3, sizeof(cmd.parm.num));
  499. break;
  500. case 6:
  501. snprintf(cmd.parm.num, sizeof(cmd.parm.num), "%d",
  502. (int) simple_strtoul(status + 7, NULL, 16));
  503. break;
  504. case 7:
  505. status += 3;
  506. if (strlen(status) == 4)
  507. snprintf(cmd.parm.num, sizeof(cmd.parm.num), "%s%c%c",
  508. status + 2, *status, *(status + 1));
  509. else
  510. strlcpy(cmd.parm.num, status + 1, sizeof(cmd.parm.num));
  511. break;
  512. case 8:
  513. spin_lock_irqsave(&card->lock, flags);
  514. card->flags &= ~ICN_FLAGS_B1ACTIVE;
  515. icn_free_queue(card, 0);
  516. card->rcvidx[0] = 0;
  517. spin_unlock_irqrestore(&card->lock, flags);
  518. cmd.arg = 0;
  519. cmd.driver = card->myid;
  520. card->interface.statcallb(&cmd);
  521. cmd.command = ISDN_STAT_DHUP;
  522. cmd.arg = 0;
  523. cmd.driver = card->myid;
  524. card->interface.statcallb(&cmd);
  525. cmd.command = ISDN_STAT_BHUP;
  526. spin_lock_irqsave(&card->lock, flags);
  527. card->flags &= ~ICN_FLAGS_B2ACTIVE;
  528. icn_free_queue(card, 1);
  529. card->rcvidx[1] = 0;
  530. spin_unlock_irqrestore(&card->lock, flags);
  531. cmd.arg = 1;
  532. cmd.driver = card->myid;
  533. card->interface.statcallb(&cmd);
  534. cmd.command = ISDN_STAT_DHUP;
  535. cmd.arg = 1;
  536. cmd.driver = card->myid;
  537. break;
  538. }
  539. card->interface.statcallb(&cmd);
  540. return;
  541. }
  542. static void
  543. icn_putmsg(icn_card * card, unsigned char c)
  544. {
  545. ulong flags;
  546. spin_lock_irqsave(&card->lock, flags);
  547. *card->msg_buf_write++ = (c == 0xff) ? '\n' : c;
  548. if (card->msg_buf_write == card->msg_buf_read) {
  549. if (++card->msg_buf_read > card->msg_buf_end)
  550. card->msg_buf_read = card->msg_buf;
  551. }
  552. if (card->msg_buf_write > card->msg_buf_end)
  553. card->msg_buf_write = card->msg_buf;
  554. spin_unlock_irqrestore(&card->lock, flags);
  555. }
  556. static void
  557. icn_polldchan(unsigned long data)
  558. {
  559. icn_card *card = (icn_card *) data;
  560. int mch = card->secondhalf ? 2 : 0;
  561. int avail = 0;
  562. int left;
  563. u_char c;
  564. int ch;
  565. unsigned long flags;
  566. int i;
  567. u_char *p;
  568. isdn_ctrl cmd;
  569. if (icn_trymaplock_channel(card, mch)) {
  570. avail = msg_avail;
  571. for (left = avail, i = readb(&msg_o); left > 0; i++, left--) {
  572. c = readb(&dev.shmem->comm_buffers.iopc_buf[i & 0xff]);
  573. icn_putmsg(card, c);
  574. if (c == 0xff) {
  575. card->imsg[card->iptr] = 0;
  576. card->iptr = 0;
  577. if (card->imsg[0] == '0' && card->imsg[1] >= '0' &&
  578. card->imsg[1] <= '2' && card->imsg[2] == ';') {
  579. ch = (card->imsg[1] - '0') - 1;
  580. p = &card->imsg[3];
  581. icn_parse_status(p, ch, card);
  582. } else {
  583. p = card->imsg;
  584. if (!strncmp(p, "DRV1.", 5)) {
  585. u_char vstr[10];
  586. u_char *q = vstr;
  587. printk(KERN_INFO "icn: (%s) %s\n", CID, p);
  588. if (!strncmp(p + 7, "TC", 2)) {
  589. card->ptype = ISDN_PTYPE_1TR6;
  590. card->interface.features |= ISDN_FEATURE_P_1TR6;
  591. printk(KERN_INFO
  592. "icn: (%s) 1TR6-Protocol loaded and running\n", CID);
  593. }
  594. if (!strncmp(p + 7, "EC", 2)) {
  595. card->ptype = ISDN_PTYPE_EURO;
  596. card->interface.features |= ISDN_FEATURE_P_EURO;
  597. printk(KERN_INFO
  598. "icn: (%s) Euro-Protocol loaded and running\n", CID);
  599. }
  600. p = strstr(card->imsg, "BRV") + 3;
  601. while (*p) {
  602. if (*p >= '0' && *p <= '9')
  603. *q++ = *p;
  604. p++;
  605. }
  606. *q = '\0';
  607. strcat(vstr, "000");
  608. vstr[3] = '\0';
  609. card->fw_rev = (int) simple_strtoul(vstr, NULL, 10);
  610. continue;
  611. }
  612. }
  613. } else {
  614. card->imsg[card->iptr] = c;
  615. if (card->iptr < 59)
  616. card->iptr++;
  617. }
  618. }
  619. writeb((readb(&msg_o) + avail) & 0xff, &msg_o);
  620. icn_release_channel();
  621. }
  622. if (avail) {
  623. cmd.command = ISDN_STAT_STAVAIL;
  624. cmd.driver = card->myid;
  625. cmd.arg = avail;
  626. card->interface.statcallb(&cmd);
  627. }
  628. spin_lock_irqsave(&card->lock, flags);
  629. if (card->flags & (ICN_FLAGS_B1ACTIVE | ICN_FLAGS_B2ACTIVE))
  630. if (!(card->flags & ICN_FLAGS_RBTIMER)) {
  631. /* schedule b-channel polling */
  632. card->flags |= ICN_FLAGS_RBTIMER;
  633. del_timer(&card->rb_timer);
  634. card->rb_timer.function = icn_pollbchan;
  635. card->rb_timer.data = (unsigned long) card;
  636. card->rb_timer.expires = jiffies + ICN_TIMER_BCREAD;
  637. add_timer(&card->rb_timer);
  638. }
  639. /* schedule again */
  640. mod_timer(&card->st_timer, jiffies+ICN_TIMER_DCREAD);
  641. spin_unlock_irqrestore(&card->lock, flags);
  642. }
  643. /* Append a packet to the transmit buffer-queue.
  644. * Parameters:
  645. * channel = Number of B-channel
  646. * skb = pointer to sk_buff
  647. * card = pointer to card-struct
  648. * Return:
  649. * Number of bytes transferred, -E??? on error
  650. */
  651. static int
  652. icn_sendbuf(int channel, int ack, struct sk_buff *skb, icn_card * card)
  653. {
  654. int len = skb->len;
  655. unsigned long flags;
  656. struct sk_buff *nskb;
  657. if (len > 4000) {
  658. printk(KERN_WARNING
  659. "icn: Send packet too large\n");
  660. return -EINVAL;
  661. }
  662. if (len) {
  663. if (!(card->flags & (channel) ? ICN_FLAGS_B2ACTIVE : ICN_FLAGS_B1ACTIVE))
  664. return 0;
  665. if (card->sndcount[channel] > ICN_MAX_SQUEUE)
  666. return 0;
  667. #warning TODO test headroom or use skb->nb to flag ACK
  668. nskb = skb_clone(skb, GFP_ATOMIC);
  669. if (nskb) {
  670. /* Push ACK flag as one
  671. * byte in front of data.
  672. */
  673. *(skb_push(nskb, 1)) = ack?1:0;
  674. skb_queue_tail(&card->spqueue[channel], nskb);
  675. dev_kfree_skb(skb);
  676. } else
  677. len = 0;
  678. spin_lock_irqsave(&card->lock, flags);
  679. card->sndcount[channel] += len;
  680. spin_unlock_irqrestore(&card->lock, flags);
  681. }
  682. return len;
  683. }
  684. /*
  685. * Check card's status after starting the bootstrap loader.
  686. * On entry, the card's shared memory has already to be mapped.
  687. * Return:
  688. * 0 on success (Boot loader ready)
  689. * -EIO on failure (timeout)
  690. */
  691. static int
  692. icn_check_loader(int cardnumber)
  693. {
  694. int timer = 0;
  695. while (1) {
  696. #ifdef BOOT_DEBUG
  697. printk(KERN_DEBUG "Loader %d ?\n", cardnumber);
  698. #endif
  699. if (readb(&dev.shmem->data_control.scns) ||
  700. readb(&dev.shmem->data_control.scnr)) {
  701. if (timer++ > 5) {
  702. printk(KERN_WARNING
  703. "icn: Boot-Loader %d timed out.\n",
  704. cardnumber);
  705. icn_release_channel();
  706. return -EIO;
  707. }
  708. #ifdef BOOT_DEBUG
  709. printk(KERN_DEBUG "Loader %d TO?\n", cardnumber);
  710. #endif
  711. msleep_interruptible(ICN_BOOT_TIMEOUT1);
  712. } else {
  713. #ifdef BOOT_DEBUG
  714. printk(KERN_DEBUG "Loader %d OK\n", cardnumber);
  715. #endif
  716. icn_release_channel();
  717. return 0;
  718. }
  719. }
  720. }
  721. /* Load the boot-code into the interface-card's memory and start it.
  722. * Always called from user-process.
  723. *
  724. * Parameters:
  725. * buffer = pointer to packet
  726. * Return:
  727. * 0 if successfully loaded
  728. */
  729. #ifdef BOOT_DEBUG
  730. #define SLEEP(sec) { \
  731. int slsec = sec; \
  732. printk(KERN_DEBUG "SLEEP(%d)\n",slsec); \
  733. while (slsec) { \
  734. msleep_interruptible(1000); \
  735. slsec--; \
  736. } \
  737. }
  738. #else
  739. #define SLEEP(sec)
  740. #endif
  741. static int
  742. icn_loadboot(u_char __user * buffer, icn_card * card)
  743. {
  744. int ret;
  745. u_char *codebuf;
  746. unsigned long flags;
  747. #ifdef BOOT_DEBUG
  748. printk(KERN_DEBUG "icn_loadboot called, buffaddr=%08lx\n", (ulong) buffer);
  749. #endif
  750. if (!(codebuf = kmalloc(ICN_CODE_STAGE1, GFP_KERNEL))) {
  751. printk(KERN_WARNING "icn: Could not allocate code buffer\n");
  752. ret = -ENOMEM;
  753. goto out;
  754. }
  755. if (copy_from_user(codebuf, buffer, ICN_CODE_STAGE1)) {
  756. ret = -EFAULT;
  757. goto out_kfree;
  758. }
  759. if (!card->rvalid) {
  760. if (!request_region(card->port, ICN_PORTLEN, card->regname)) {
  761. printk(KERN_WARNING
  762. "icn: (%s) ports 0x%03x-0x%03x in use.\n",
  763. CID,
  764. card->port,
  765. card->port + ICN_PORTLEN);
  766. ret = -EBUSY;
  767. goto out_kfree;
  768. }
  769. card->rvalid = 1;
  770. if (card->doubleS0)
  771. card->other->rvalid = 1;
  772. }
  773. if (!dev.mvalid) {
  774. if (!request_mem_region(dev.memaddr, 0x4000, "icn-isdn (all cards)")) {
  775. printk(KERN_WARNING
  776. "icn: memory at 0x%08lx in use.\n", dev.memaddr);
  777. ret = -EBUSY;
  778. goto out_kfree;
  779. }
  780. dev.shmem = ioremap(dev.memaddr, 0x4000);
  781. dev.mvalid = 1;
  782. }
  783. OUTB_P(0, ICN_RUN); /* Reset Controller */
  784. OUTB_P(0, ICN_MAPRAM); /* Disable RAM */
  785. icn_shiftout(ICN_CFG, 0x0f, 3, 4); /* Windowsize= 16k */
  786. icn_shiftout(ICN_CFG, dev.memaddr, 23, 10); /* Set RAM-Addr. */
  787. #ifdef BOOT_DEBUG
  788. printk(KERN_DEBUG "shmem=%08lx\n", dev.memaddr);
  789. #endif
  790. SLEEP(1);
  791. #ifdef BOOT_DEBUG
  792. printk(KERN_DEBUG "Map Bank 0\n");
  793. #endif
  794. spin_lock_irqsave(&dev.devlock, flags);
  795. icn_map_channel(card, 0); /* Select Bank 0 */
  796. icn_lock_channel(card, 0); /* Lock Bank 0 */
  797. spin_unlock_irqrestore(&dev.devlock, flags);
  798. SLEEP(1);
  799. memcpy_toio(dev.shmem, codebuf, ICN_CODE_STAGE1); /* Copy code */
  800. #ifdef BOOT_DEBUG
  801. printk(KERN_DEBUG "Bootloader transferred\n");
  802. #endif
  803. if (card->doubleS0) {
  804. SLEEP(1);
  805. #ifdef BOOT_DEBUG
  806. printk(KERN_DEBUG "Map Bank 8\n");
  807. #endif
  808. spin_lock_irqsave(&dev.devlock, flags);
  809. __icn_release_channel();
  810. icn_map_channel(card, 2); /* Select Bank 8 */
  811. icn_lock_channel(card, 2); /* Lock Bank 8 */
  812. spin_unlock_irqrestore(&dev.devlock, flags);
  813. SLEEP(1);
  814. memcpy_toio(dev.shmem, codebuf, ICN_CODE_STAGE1); /* Copy code */
  815. #ifdef BOOT_DEBUG
  816. printk(KERN_DEBUG "Bootloader transferred\n");
  817. #endif
  818. }
  819. SLEEP(1);
  820. OUTB_P(0xff, ICN_RUN); /* Start Boot-Code */
  821. if ((ret = icn_check_loader(card->doubleS0 ? 2 : 1))) {
  822. goto out_kfree;
  823. }
  824. if (!card->doubleS0) {
  825. ret = 0;
  826. goto out_kfree;
  827. }
  828. /* reached only, if we have a Double-S0-Card */
  829. #ifdef BOOT_DEBUG
  830. printk(KERN_DEBUG "Map Bank 0\n");
  831. #endif
  832. spin_lock_irqsave(&dev.devlock, flags);
  833. icn_map_channel(card, 0); /* Select Bank 0 */
  834. icn_lock_channel(card, 0); /* Lock Bank 0 */
  835. spin_unlock_irqrestore(&dev.devlock, flags);
  836. SLEEP(1);
  837. ret = (icn_check_loader(1));
  838. out_kfree:
  839. kfree(codebuf);
  840. out:
  841. return ret;
  842. }
  843. static int
  844. icn_loadproto(u_char __user * buffer, icn_card * card)
  845. {
  846. register u_char __user *p = buffer;
  847. u_char codebuf[256];
  848. uint left = ICN_CODE_STAGE2;
  849. uint cnt;
  850. int timer;
  851. unsigned long flags;
  852. #ifdef BOOT_DEBUG
  853. printk(KERN_DEBUG "icn_loadproto called\n");
  854. #endif
  855. if (!access_ok(VERIFY_READ, buffer, ICN_CODE_STAGE2))
  856. return -EFAULT;
  857. timer = 0;
  858. spin_lock_irqsave(&dev.devlock, flags);
  859. if (card->secondhalf) {
  860. icn_map_channel(card, 2);
  861. icn_lock_channel(card, 2);
  862. } else {
  863. icn_map_channel(card, 0);
  864. icn_lock_channel(card, 0);
  865. }
  866. spin_unlock_irqrestore(&dev.devlock, flags);
  867. while (left) {
  868. if (sbfree) { /* If there is a free buffer... */
  869. cnt = left;
  870. if (cnt > 256)
  871. cnt = 256;
  872. if (copy_from_user(codebuf, p, cnt)) {
  873. icn_maprelease_channel(card, 0);
  874. return -EFAULT;
  875. }
  876. memcpy_toio(&sbuf_l, codebuf, cnt); /* copy data */
  877. sbnext; /* switch to next buffer */
  878. p += cnt;
  879. left -= cnt;
  880. timer = 0;
  881. } else {
  882. #ifdef BOOT_DEBUG
  883. printk(KERN_DEBUG "boot 2 !sbfree\n");
  884. #endif
  885. if (timer++ > 5) {
  886. icn_maprelease_channel(card, 0);
  887. return -EIO;
  888. }
  889. schedule_timeout_interruptible(10);
  890. }
  891. }
  892. writeb(0x20, &sbuf_n);
  893. timer = 0;
  894. while (1) {
  895. if (readb(&cmd_o) || readb(&cmd_i)) {
  896. #ifdef BOOT_DEBUG
  897. printk(KERN_DEBUG "Proto?\n");
  898. #endif
  899. if (timer++ > 5) {
  900. printk(KERN_WARNING
  901. "icn: (%s) Protocol timed out.\n",
  902. CID);
  903. #ifdef BOOT_DEBUG
  904. printk(KERN_DEBUG "Proto TO!\n");
  905. #endif
  906. icn_maprelease_channel(card, 0);
  907. return -EIO;
  908. }
  909. #ifdef BOOT_DEBUG
  910. printk(KERN_DEBUG "Proto TO?\n");
  911. #endif
  912. msleep_interruptible(ICN_BOOT_TIMEOUT1);
  913. } else {
  914. if ((card->secondhalf) || (!card->doubleS0)) {
  915. #ifdef BOOT_DEBUG
  916. printk(KERN_DEBUG "Proto loaded, install poll-timer %d\n",
  917. card->secondhalf);
  918. #endif
  919. spin_lock_irqsave(&card->lock, flags);
  920. init_timer(&card->st_timer);
  921. card->st_timer.expires = jiffies + ICN_TIMER_DCREAD;
  922. card->st_timer.function = icn_polldchan;
  923. card->st_timer.data = (unsigned long) card;
  924. add_timer(&card->st_timer);
  925. card->flags |= ICN_FLAGS_RUNNING;
  926. if (card->doubleS0) {
  927. init_timer(&card->other->st_timer);
  928. card->other->st_timer.expires = jiffies + ICN_TIMER_DCREAD;
  929. card->other->st_timer.function = icn_polldchan;
  930. card->other->st_timer.data = (unsigned long) card->other;
  931. add_timer(&card->other->st_timer);
  932. card->other->flags |= ICN_FLAGS_RUNNING;
  933. }
  934. spin_unlock_irqrestore(&card->lock, flags);
  935. }
  936. icn_maprelease_channel(card, 0);
  937. return 0;
  938. }
  939. }
  940. }
  941. /* Read the Status-replies from the Interface */
  942. static int
  943. icn_readstatus(u_char __user *buf, int len, icn_card * card)
  944. {
  945. int count;
  946. u_char __user *p;
  947. for (p = buf, count = 0; count < len; p++, count++) {
  948. if (card->msg_buf_read == card->msg_buf_write)
  949. return count;
  950. if (put_user(*card->msg_buf_read++, p))
  951. return -EFAULT;
  952. if (card->msg_buf_read > card->msg_buf_end)
  953. card->msg_buf_read = card->msg_buf;
  954. }
  955. return count;
  956. }
  957. /* Put command-strings into the command-queue of the Interface */
  958. static int
  959. icn_writecmd(const u_char * buf, int len, int user, icn_card * card)
  960. {
  961. int mch = card->secondhalf ? 2 : 0;
  962. int pp;
  963. int i;
  964. int count;
  965. int xcount;
  966. int ocount;
  967. int loop;
  968. unsigned long flags;
  969. int lastmap_channel;
  970. struct icn_card *lastmap_card;
  971. u_char *p;
  972. isdn_ctrl cmd;
  973. u_char msg[0x100];
  974. ocount = 1;
  975. xcount = loop = 0;
  976. while (len) {
  977. count = cmd_free;
  978. if (count > len)
  979. count = len;
  980. if (user) {
  981. if (copy_from_user(msg, buf, count))
  982. return -EFAULT;
  983. } else
  984. memcpy(msg, buf, count);
  985. spin_lock_irqsave(&dev.devlock, flags);
  986. lastmap_card = dev.mcard;
  987. lastmap_channel = dev.channel;
  988. icn_map_channel(card, mch);
  989. icn_putmsg(card, '>');
  990. for (p = msg, pp = readb(&cmd_i), i = count; i > 0; i--, p++, pp
  991. ++) {
  992. writeb((*p == '\n') ? 0xff : *p,
  993. &dev.shmem->comm_buffers.pcio_buf[pp & 0xff]);
  994. len--;
  995. xcount++;
  996. icn_putmsg(card, *p);
  997. if ((*p == '\n') && (i > 1)) {
  998. icn_putmsg(card, '>');
  999. ocount++;
  1000. }
  1001. ocount++;
  1002. }
  1003. writeb((readb(&cmd_i) + count) & 0xff, &cmd_i);
  1004. if (lastmap_card)
  1005. icn_map_channel(lastmap_card, lastmap_channel);
  1006. spin_unlock_irqrestore(&dev.devlock, flags);
  1007. if (len) {
  1008. mdelay(1);
  1009. if (loop++ > 20)
  1010. break;
  1011. } else
  1012. break;
  1013. }
  1014. if (len && (!user))
  1015. printk(KERN_WARNING "icn: writemsg incomplete!\n");
  1016. cmd.command = ISDN_STAT_STAVAIL;
  1017. cmd.driver = card->myid;
  1018. cmd.arg = ocount;
  1019. card->interface.statcallb(&cmd);
  1020. return xcount;
  1021. }
  1022. /*
  1023. * Delete card's pending timers, send STOP to linklevel
  1024. */
  1025. static void
  1026. icn_stopcard(icn_card * card)
  1027. {
  1028. unsigned long flags;
  1029. isdn_ctrl cmd;
  1030. spin_lock_irqsave(&card->lock, flags);
  1031. if (card->flags & ICN_FLAGS_RUNNING) {
  1032. card->flags &= ~ICN_FLAGS_RUNNING;
  1033. del_timer(&card->st_timer);
  1034. del_timer(&card->rb_timer);
  1035. spin_unlock_irqrestore(&card->lock, flags);
  1036. cmd.command = ISDN_STAT_STOP;
  1037. cmd.driver = card->myid;
  1038. card->interface.statcallb(&cmd);
  1039. if (card->doubleS0)
  1040. icn_stopcard(card->other);
  1041. } else
  1042. spin_unlock_irqrestore(&card->lock, flags);
  1043. }
  1044. static void
  1045. icn_stopallcards(void)
  1046. {
  1047. icn_card *p = cards;
  1048. while (p) {
  1049. icn_stopcard(p);
  1050. p = p->next;
  1051. }
  1052. }
  1053. /*
  1054. * Unmap all cards, because some of them may be mapped accidetly during
  1055. * autoprobing of some network drivers (SMC-driver?)
  1056. */
  1057. static void
  1058. icn_disable_cards(void)
  1059. {
  1060. icn_card *card = cards;
  1061. while (card) {
  1062. if (!request_region(card->port, ICN_PORTLEN, "icn-isdn")) {
  1063. printk(KERN_WARNING
  1064. "icn: (%s) ports 0x%03x-0x%03x in use.\n",
  1065. CID,
  1066. card->port,
  1067. card->port + ICN_PORTLEN);
  1068. } else {
  1069. OUTB_P(0, ICN_RUN); /* Reset Controller */
  1070. OUTB_P(0, ICN_MAPRAM); /* Disable RAM */
  1071. release_region(card->port, ICN_PORTLEN);
  1072. }
  1073. card = card->next;
  1074. }
  1075. }
  1076. static int
  1077. icn_command(isdn_ctrl * c, icn_card * card)
  1078. {
  1079. ulong a;
  1080. ulong flags;
  1081. int i;
  1082. char cbuf[60];
  1083. isdn_ctrl cmd;
  1084. icn_cdef cdef;
  1085. char __user *arg;
  1086. switch (c->command) {
  1087. case ISDN_CMD_IOCTL:
  1088. memcpy(&a, c->parm.num, sizeof(ulong));
  1089. arg = (char __user *)a;
  1090. switch (c->arg) {
  1091. case ICN_IOCTL_SETMMIO:
  1092. if (dev.memaddr != (a & 0x0ffc000)) {
  1093. if (!request_mem_region(a & 0x0ffc000, 0x4000, "icn-isdn (all cards)")) {
  1094. printk(KERN_WARNING
  1095. "icn: memory at 0x%08lx in use.\n",
  1096. a & 0x0ffc000);
  1097. return -EINVAL;
  1098. }
  1099. release_mem_region(a & 0x0ffc000, 0x4000);
  1100. icn_stopallcards();
  1101. spin_lock_irqsave(&card->lock, flags);
  1102. if (dev.mvalid) {
  1103. iounmap(dev.shmem);
  1104. release_mem_region(dev.memaddr, 0x4000);
  1105. }
  1106. dev.mvalid = 0;
  1107. dev.memaddr = a & 0x0ffc000;
  1108. spin_unlock_irqrestore(&card->lock, flags);
  1109. printk(KERN_INFO
  1110. "icn: (%s) mmio set to 0x%08lx\n",
  1111. CID,
  1112. dev.memaddr);
  1113. }
  1114. break;
  1115. case ICN_IOCTL_GETMMIO:
  1116. return (long) dev.memaddr;
  1117. case ICN_IOCTL_SETPORT:
  1118. if (a == 0x300 || a == 0x310 || a == 0x320 || a == 0x330
  1119. || a == 0x340 || a == 0x350 || a == 0x360 ||
  1120. a == 0x308 || a == 0x318 || a == 0x328 || a == 0x338
  1121. || a == 0x348 || a == 0x358 || a == 0x368) {
  1122. if (card->port != (unsigned short) a) {
  1123. if (!request_region((unsigned short) a, ICN_PORTLEN, "icn-isdn")) {
  1124. printk(KERN_WARNING
  1125. "icn: (%s) ports 0x%03x-0x%03x in use.\n",
  1126. CID, (int) a, (int) a + ICN_PORTLEN);
  1127. return -EINVAL;
  1128. }
  1129. release_region((unsigned short) a, ICN_PORTLEN);
  1130. icn_stopcard(card);
  1131. spin_lock_irqsave(&card->lock, flags);
  1132. if (card->rvalid)
  1133. release_region(card->port, ICN_PORTLEN);
  1134. card->port = (unsigned short) a;
  1135. card->rvalid = 0;
  1136. if (card->doubleS0) {
  1137. card->other->port = (unsigned short) a;
  1138. card->other->rvalid = 0;
  1139. }
  1140. spin_unlock_irqrestore(&card->lock, flags);
  1141. printk(KERN_INFO
  1142. "icn: (%s) port set to 0x%03x\n",
  1143. CID, card->port);
  1144. }
  1145. } else
  1146. return -EINVAL;
  1147. break;
  1148. case ICN_IOCTL_GETPORT:
  1149. return (int) card->port;
  1150. case ICN_IOCTL_GETDOUBLE:
  1151. return (int) card->doubleS0;
  1152. case ICN_IOCTL_DEBUGVAR:
  1153. if (copy_to_user(arg,
  1154. &card,
  1155. sizeof(ulong)))
  1156. return -EFAULT;
  1157. a += sizeof(ulong);
  1158. {
  1159. ulong l = (ulong) & dev;
  1160. if (copy_to_user(arg,
  1161. &l,
  1162. sizeof(ulong)))
  1163. return -EFAULT;
  1164. }
  1165. return 0;
  1166. case ICN_IOCTL_LOADBOOT:
  1167. if (dev.firstload) {
  1168. icn_disable_cards();
  1169. dev.firstload = 0;
  1170. }
  1171. icn_stopcard(card);
  1172. return (icn_loadboot(arg, card));
  1173. case ICN_IOCTL_LOADPROTO:
  1174. icn_stopcard(card);
  1175. if ((i = (icn_loadproto(arg, card))))
  1176. return i;
  1177. if (card->doubleS0)
  1178. i = icn_loadproto(arg + ICN_CODE_STAGE2, card->other);
  1179. return i;
  1180. break;
  1181. case ICN_IOCTL_ADDCARD:
  1182. if (!dev.firstload)
  1183. return -EBUSY;
  1184. if (copy_from_user(&cdef,
  1185. arg,
  1186. sizeof(cdef)))
  1187. return -EFAULT;
  1188. return (icn_addcard(cdef.port, cdef.id1, cdef.id2));
  1189. break;
  1190. case ICN_IOCTL_LEASEDCFG:
  1191. if (a) {
  1192. if (!card->leased) {
  1193. card->leased = 1;
  1194. while (card->ptype == ISDN_PTYPE_UNKNOWN) {
  1195. msleep_interruptible(ICN_BOOT_TIMEOUT1);
  1196. }
  1197. msleep_interruptible(ICN_BOOT_TIMEOUT1);
  1198. sprintf(cbuf, "00;FV2ON\n01;EAZ%c\n02;EAZ%c\n",
  1199. (a & 1)?'1':'C', (a & 2)?'2':'C');
  1200. i = icn_writecmd(cbuf, strlen(cbuf), 0, card);
  1201. printk(KERN_INFO
  1202. "icn: (%s) Leased-line mode enabled\n",
  1203. CID);
  1204. cmd.command = ISDN_STAT_RUN;
  1205. cmd.driver = card->myid;
  1206. cmd.arg = 0;
  1207. card->interface.statcallb(&cmd);
  1208. }
  1209. } else {
  1210. if (card->leased) {
  1211. card->leased = 0;
  1212. sprintf(cbuf, "00;FV2OFF\n");
  1213. i = icn_writecmd(cbuf, strlen(cbuf), 0, card);
  1214. printk(KERN_INFO
  1215. "icn: (%s) Leased-line mode disabled\n",
  1216. CID);
  1217. cmd.command = ISDN_STAT_RUN;
  1218. cmd.driver = card->myid;
  1219. cmd.arg = 0;
  1220. card->interface.statcallb(&cmd);
  1221. }
  1222. }
  1223. return 0;
  1224. default:
  1225. return -EINVAL;
  1226. }
  1227. break;
  1228. case ISDN_CMD_DIAL:
  1229. if (!(card->flags & ICN_FLAGS_RUNNING))
  1230. return -ENODEV;
  1231. if (card->leased)
  1232. break;
  1233. if ((c->arg & 255) < ICN_BCH) {
  1234. char *p;
  1235. char dial[50];
  1236. char dcode[4];
  1237. a = c->arg;
  1238. p = c->parm.setup.phone;
  1239. if (*p == 's' || *p == 'S') {
  1240. /* Dial for SPV */
  1241. p++;
  1242. strcpy(dcode, "SCA");
  1243. } else
  1244. /* Normal Dial */
  1245. strcpy(dcode, "CAL");
  1246. strcpy(dial, p);
  1247. sprintf(cbuf, "%02d;D%s_R%s,%02d,%02d,%s\n", (int) (a + 1),
  1248. dcode, dial, c->parm.setup.si1,
  1249. c->parm.setup.si2, c->parm.setup.eazmsn);
  1250. i = icn_writecmd(cbuf, strlen(cbuf), 0, card);
  1251. }
  1252. break;
  1253. case ISDN_CMD_ACCEPTD:
  1254. if (!(card->flags & ICN_FLAGS_RUNNING))
  1255. return -ENODEV;
  1256. if (c->arg < ICN_BCH) {
  1257. a = c->arg + 1;
  1258. if (card->fw_rev >= 300) {
  1259. switch (card->l2_proto[a - 1]) {
  1260. case ISDN_PROTO_L2_X75I:
  1261. sprintf(cbuf, "%02d;BX75\n", (int) a);
  1262. break;
  1263. case ISDN_PROTO_L2_HDLC:
  1264. sprintf(cbuf, "%02d;BTRA\n", (int) a);
  1265. break;
  1266. }
  1267. i = icn_writecmd(cbuf, strlen(cbuf), 0, card);
  1268. }
  1269. sprintf(cbuf, "%02d;DCON_R\n", (int) a);
  1270. i = icn_writecmd(cbuf, strlen(cbuf), 0, card);
  1271. }
  1272. break;
  1273. case ISDN_CMD_ACCEPTB:
  1274. if (!(card->flags & ICN_FLAGS_RUNNING))
  1275. return -ENODEV;
  1276. if (c->arg < ICN_BCH) {
  1277. a = c->arg + 1;
  1278. if (card->fw_rev >= 300)
  1279. switch (card->l2_proto[a - 1]) {
  1280. case ISDN_PROTO_L2_X75I:
  1281. sprintf(cbuf, "%02d;BCON_R,BX75\n", (int) a);
  1282. break;
  1283. case ISDN_PROTO_L2_HDLC:
  1284. sprintf(cbuf, "%02d;BCON_R,BTRA\n", (int) a);
  1285. break;
  1286. } else
  1287. sprintf(cbuf, "%02d;BCON_R\n", (int) a);
  1288. i = icn_writecmd(cbuf, strlen(cbuf), 0, card);
  1289. }
  1290. break;
  1291. case ISDN_CMD_HANGUP:
  1292. if (!(card->flags & ICN_FLAGS_RUNNING))
  1293. return -ENODEV;
  1294. if (c->arg < ICN_BCH) {
  1295. a = c->arg + 1;
  1296. sprintf(cbuf, "%02d;BDIS_R\n%02d;DDIS_R\n", (int) a, (int) a);
  1297. i = icn_writecmd(cbuf, strlen(cbuf), 0, card);
  1298. }
  1299. break;
  1300. case ISDN_CMD_SETEAZ:
  1301. if (!(card->flags & ICN_FLAGS_RUNNING))
  1302. return -ENODEV;
  1303. if (card->leased)
  1304. break;
  1305. if (c->arg < ICN_BCH) {
  1306. a = c->arg + 1;
  1307. if (card->ptype == ISDN_PTYPE_EURO) {
  1308. sprintf(cbuf, "%02d;MS%s%s\n", (int) a,
  1309. c->parm.num[0] ? "N" : "ALL", c->parm.num);
  1310. } else
  1311. sprintf(cbuf, "%02d;EAZ%s\n", (int) a,
  1312. c->parm.num[0] ? (char *)(c->parm.num) : "0123456789");
  1313. i = icn_writecmd(cbuf, strlen(cbuf), 0, card);
  1314. }
  1315. break;
  1316. case ISDN_CMD_CLREAZ:
  1317. if (!(card->flags & ICN_FLAGS_RUNNING))
  1318. return -ENODEV;
  1319. if (card->leased)
  1320. break;
  1321. if (c->arg < ICN_BCH) {
  1322. a = c->arg + 1;
  1323. if (card->ptype == ISDN_PTYPE_EURO)
  1324. sprintf(cbuf, "%02d;MSNC\n", (int) a);
  1325. else
  1326. sprintf(cbuf, "%02d;EAZC\n", (int) a);
  1327. i = icn_writecmd(cbuf, strlen(cbuf), 0, card);
  1328. }
  1329. break;
  1330. case ISDN_CMD_SETL2:
  1331. if (!(card->flags & ICN_FLAGS_RUNNING))
  1332. return -ENODEV;
  1333. if ((c->arg & 255) < ICN_BCH) {
  1334. a = c->arg;
  1335. switch (a >> 8) {
  1336. case ISDN_PROTO_L2_X75I:
  1337. sprintf(cbuf, "%02d;BX75\n", (int) (a & 255) + 1);
  1338. break;
  1339. case ISDN_PROTO_L2_HDLC:
  1340. sprintf(cbuf, "%02d;BTRA\n", (int) (a & 255) + 1);
  1341. break;
  1342. default:
  1343. return -EINVAL;
  1344. }
  1345. i = icn_writecmd(cbuf, strlen(cbuf), 0, card);
  1346. card->l2_proto[a & 255] = (a >> 8);
  1347. }
  1348. break;
  1349. case ISDN_CMD_SETL3:
  1350. if (!(card->flags & ICN_FLAGS_RUNNING))
  1351. return -ENODEV;
  1352. return 0;
  1353. default:
  1354. return -EINVAL;
  1355. }
  1356. return 0;
  1357. }
  1358. /*
  1359. * Find card with given driverId
  1360. */
  1361. static inline icn_card *
  1362. icn_findcard(int driverid)
  1363. {
  1364. icn_card *p = cards;
  1365. while (p) {
  1366. if (p->myid == driverid)
  1367. return p;
  1368. p = p->next;
  1369. }
  1370. return (icn_card *) 0;
  1371. }
  1372. /*
  1373. * Wrapper functions for interface to linklevel
  1374. */
  1375. static int
  1376. if_command(isdn_ctrl * c)
  1377. {
  1378. icn_card *card = icn_findcard(c->driver);
  1379. if (card)
  1380. return (icn_command(c, card));
  1381. printk(KERN_ERR
  1382. "icn: if_command %d called with invalid driverId %d!\n",
  1383. c->command, c->driver);
  1384. return -ENODEV;
  1385. }
  1386. static int
  1387. if_writecmd(const u_char __user *buf, int len, int id, int channel)
  1388. {
  1389. icn_card *card = icn_findcard(id);
  1390. if (card) {
  1391. if (!(card->flags & ICN_FLAGS_RUNNING))
  1392. return -ENODEV;
  1393. return (icn_writecmd(buf, len, 1, card));
  1394. }
  1395. printk(KERN_ERR
  1396. "icn: if_writecmd called with invalid driverId!\n");
  1397. return -ENODEV;
  1398. }
  1399. static int
  1400. if_readstatus(u_char __user *buf, int len, int id, int channel)
  1401. {
  1402. icn_card *card = icn_findcard(id);
  1403. if (card) {
  1404. if (!(card->flags & ICN_FLAGS_RUNNING))
  1405. return -ENODEV;
  1406. return (icn_readstatus(buf, len, card));
  1407. }
  1408. printk(KERN_ERR
  1409. "icn: if_readstatus called with invalid driverId!\n");
  1410. return -ENODEV;
  1411. }
  1412. static int
  1413. if_sendbuf(int id, int channel, int ack, struct sk_buff *skb)
  1414. {
  1415. icn_card *card = icn_findcard(id);
  1416. if (card) {
  1417. if (!(card->flags & ICN_FLAGS_RUNNING))
  1418. return -ENODEV;
  1419. return (icn_sendbuf(channel, ack, skb, card));
  1420. }
  1421. printk(KERN_ERR
  1422. "icn: if_sendbuf called with invalid driverId!\n");
  1423. return -ENODEV;
  1424. }
  1425. /*
  1426. * Allocate a new card-struct, initialize it
  1427. * link it into cards-list and register it at linklevel.
  1428. */
  1429. static icn_card *
  1430. icn_initcard(int port, char *id)
  1431. {
  1432. icn_card *card;
  1433. int i;
  1434. if (!(card = kzalloc(sizeof(icn_card), GFP_KERNEL))) {
  1435. printk(KERN_WARNING
  1436. "icn: (%s) Could not allocate card-struct.\n", id);
  1437. return (icn_card *) 0;
  1438. }
  1439. spin_lock_init(&card->lock);
  1440. card->port = port;
  1441. card->interface.owner = THIS_MODULE;
  1442. card->interface.hl_hdrlen = 1;
  1443. card->interface.channels = ICN_BCH;
  1444. card->interface.maxbufsize = 4000;
  1445. card->interface.command = if_command;
  1446. card->interface.writebuf_skb = if_sendbuf;
  1447. card->interface.writecmd = if_writecmd;
  1448. card->interface.readstat = if_readstatus;
  1449. card->interface.features = ISDN_FEATURE_L2_X75I |
  1450. ISDN_FEATURE_L2_HDLC |
  1451. ISDN_FEATURE_L3_TRANS |
  1452. ISDN_FEATURE_P_UNKNOWN;
  1453. card->ptype = ISDN_PTYPE_UNKNOWN;
  1454. strlcpy(card->interface.id, id, sizeof(card->interface.id));
  1455. card->msg_buf_write = card->msg_buf;
  1456. card->msg_buf_read = card->msg_buf;
  1457. card->msg_buf_end = &card->msg_buf[sizeof(card->msg_buf) - 1];
  1458. for (i = 0; i < ICN_BCH; i++) {
  1459. card->l2_proto[i] = ISDN_PROTO_L2_X75I;
  1460. skb_queue_head_init(&card->spqueue[i]);
  1461. }
  1462. card->next = cards;
  1463. cards = card;
  1464. if (!register_isdn(&card->interface)) {
  1465. cards = cards->next;
  1466. printk(KERN_WARNING
  1467. "icn: Unable to register %s\n", id);
  1468. kfree(card);
  1469. return (icn_card *) 0;
  1470. }
  1471. card->myid = card->interface.channels;
  1472. sprintf(card->regname, "icn-isdn (%s)", card->interface.id);
  1473. return card;
  1474. }
  1475. static int
  1476. icn_addcard(int port, char *id1, char *id2)
  1477. {
  1478. icn_card *card;
  1479. icn_card *card2;
  1480. if (!(card = icn_initcard(port, id1))) {
  1481. return -EIO;
  1482. }
  1483. if (!strlen(id2)) {
  1484. printk(KERN_INFO
  1485. "icn: (%s) ICN-2B, port 0x%x added\n",
  1486. card->interface.id, port);
  1487. return 0;
  1488. }
  1489. if (!(card2 = icn_initcard(port, id2))) {
  1490. printk(KERN_INFO
  1491. "icn: (%s) half ICN-4B, port 0x%x added\n",
  1492. card2->interface.id, port);
  1493. return 0;
  1494. }
  1495. card->doubleS0 = 1;
  1496. card->secondhalf = 0;
  1497. card->other = card2;
  1498. card2->doubleS0 = 1;
  1499. card2->secondhalf = 1;
  1500. card2->other = card;
  1501. printk(KERN_INFO
  1502. "icn: (%s and %s) ICN-4B, port 0x%x added\n",
  1503. card->interface.id, card2->interface.id, port);
  1504. return 0;
  1505. }
  1506. #ifndef MODULE
  1507. static int __init
  1508. icn_setup(char *line)
  1509. {
  1510. char *p, *str;
  1511. int ints[3];
  1512. static char sid[20];
  1513. static char sid2[20];
  1514. str = get_options(line, 2, ints);
  1515. if (ints[0])
  1516. portbase = ints[1];
  1517. if (ints[0] > 1)
  1518. membase = (unsigned long)ints[2];
  1519. if (str && *str) {
  1520. strcpy(sid, str);
  1521. icn_id = sid;
  1522. if ((p = strchr(sid, ','))) {
  1523. *p++ = 0;
  1524. strcpy(sid2, p);
  1525. icn_id2 = sid2;
  1526. }
  1527. }
  1528. return(1);
  1529. }
  1530. __setup("icn=", icn_setup);
  1531. #endif /* MODULE */
  1532. static int __init icn_init(void)
  1533. {
  1534. char *p;
  1535. char rev[10];
  1536. memset(&dev, 0, sizeof(icn_dev));
  1537. dev.memaddr = (membase & 0x0ffc000);
  1538. dev.channel = -1;
  1539. dev.mcard = NULL;
  1540. dev.firstload = 1;
  1541. spin_lock_init(&dev.devlock);
  1542. if ((p = strchr(revision, ':'))) {
  1543. strcpy(rev, p + 1);
  1544. p = strchr(rev, '$');
  1545. *p = 0;
  1546. } else
  1547. strcpy(rev, " ??? ");
  1548. printk(KERN_NOTICE "ICN-ISDN-driver Rev%smem=0x%08lx\n", rev,
  1549. dev.memaddr);
  1550. return (icn_addcard(portbase, icn_id, icn_id2));
  1551. }
  1552. static void __exit icn_exit(void)
  1553. {
  1554. isdn_ctrl cmd;
  1555. icn_card *card = cards;
  1556. icn_card *last, *tmpcard;
  1557. int i;
  1558. unsigned long flags;
  1559. icn_stopallcards();
  1560. while (card) {
  1561. cmd.command = ISDN_STAT_UNLOAD;
  1562. cmd.driver = card->myid;
  1563. card->interface.statcallb(&cmd);
  1564. spin_lock_irqsave(&card->lock, flags);
  1565. if (card->rvalid) {
  1566. OUTB_P(0, ICN_RUN); /* Reset Controller */
  1567. OUTB_P(0, ICN_MAPRAM); /* Disable RAM */
  1568. if (card->secondhalf || (!card->doubleS0)) {
  1569. release_region(card->port, ICN_PORTLEN);
  1570. card->rvalid = 0;
  1571. }
  1572. for (i = 0; i < ICN_BCH; i++)
  1573. icn_free_queue(card, i);
  1574. }
  1575. tmpcard = card->next;
  1576. spin_unlock_irqrestore(&card->lock, flags);
  1577. card = tmpcard;
  1578. }
  1579. card = cards;
  1580. cards = NULL;
  1581. while (card) {
  1582. last = card;
  1583. card = card->next;
  1584. kfree(last);
  1585. }
  1586. if (dev.mvalid) {
  1587. iounmap(dev.shmem);
  1588. release_mem_region(dev.memaddr, 0x4000);
  1589. }
  1590. printk(KERN_NOTICE "ICN-ISDN-driver unloaded\n");
  1591. }
  1592. module_init(icn_init);
  1593. module_exit(icn_exit);