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