usb_gigaset: code cleanup
[pandora-kernel.git] / drivers / isdn / gigaset / common.c
1 /*
2  * Stuff used by all variants of the driver
3  *
4  * Copyright (c) 2001 by Stefan Eilers,
5  *                       Hansjoerg Lipp <hjlipp@web.de>,
6  *                       Tilman Schmidt <tilman@imap.cc>.
7  *
8  * =====================================================================
9  *      This program is free software; you can redistribute it and/or
10  *      modify it under the terms of the GNU General Public License as
11  *      published by the Free Software Foundation; either version 2 of
12  *      the License, or (at your option) any later version.
13  * =====================================================================
14  */
15
16 #include "gigaset.h"
17 #include <linux/ctype.h>
18 #include <linux/module.h>
19 #include <linux/moduleparam.h>
20
21 /* Version Information */
22 #define DRIVER_AUTHOR "Hansjoerg Lipp <hjlipp@web.de>, Tilman Schmidt <tilman@imap.cc>, Stefan Eilers"
23 #define DRIVER_DESC "Driver for Gigaset 307x"
24
25 #ifdef CONFIG_GIGASET_DEBUG
26 #define DRIVER_DESC_DEBUG " (debug build)"
27 #else
28 #define DRIVER_DESC_DEBUG ""
29 #endif
30
31 /* Module parameters */
32 int gigaset_debuglevel = DEBUG_DEFAULT;
33 EXPORT_SYMBOL_GPL(gigaset_debuglevel);
34 module_param_named(debug, gigaset_debuglevel, int, S_IRUGO|S_IWUSR);
35 MODULE_PARM_DESC(debug, "debug level");
36
37 /* driver state flags */
38 #define VALID_MINOR     0x01
39 #define VALID_ID        0x02
40
41 /**
42  * gigaset_dbg_buffer() - dump data in ASCII and hex for debugging
43  * @level:      debugging level.
44  * @msg:        message prefix.
45  * @len:        number of bytes to dump.
46  * @buf:        data to dump.
47  *
48  * If the current debugging level includes one of the bits set in @level,
49  * @len bytes starting at @buf are logged to dmesg at KERN_DEBUG prio,
50  * prefixed by the text @msg.
51  */
52 void gigaset_dbg_buffer(enum debuglevel level, const unsigned char *msg,
53                         size_t len, const unsigned char *buf)
54 {
55         unsigned char outbuf[80];
56         unsigned char c;
57         size_t space = sizeof outbuf - 1;
58         unsigned char *out = outbuf;
59         size_t numin = len;
60
61         while (numin--) {
62                 c = *buf++;
63                 if (c == '~' || c == '^' || c == '\\') {
64                         if (!space--)
65                                 break;
66                         *out++ = '\\';
67                 }
68                 if (c & 0x80) {
69                         if (!space--)
70                                 break;
71                         *out++ = '~';
72                         c ^= 0x80;
73                 }
74                 if (c < 0x20 || c == 0x7f) {
75                         if (!space--)
76                                 break;
77                         *out++ = '^';
78                         c ^= 0x40;
79                 }
80                 if (!space--)
81                         break;
82                 *out++ = c;
83         }
84         *out = 0;
85
86         gig_dbg(level, "%s (%u bytes): %s", msg, (unsigned) len, outbuf);
87 }
88 EXPORT_SYMBOL_GPL(gigaset_dbg_buffer);
89
90 static int setflags(struct cardstate *cs, unsigned flags, unsigned delay)
91 {
92         int r;
93
94         r = cs->ops->set_modem_ctrl(cs, cs->control_state, flags);
95         cs->control_state = flags;
96         if (r < 0)
97                 return r;
98
99         if (delay) {
100                 set_current_state(TASK_INTERRUPTIBLE);
101                 schedule_timeout(delay * HZ / 1000);
102         }
103
104         return 0;
105 }
106
107 int gigaset_enterconfigmode(struct cardstate *cs)
108 {
109         int i, r;
110
111         cs->control_state = TIOCM_RTS; //FIXME
112
113         r = setflags(cs, TIOCM_DTR, 200);
114         if (r < 0)
115                 goto error;
116         r = setflags(cs, 0, 200);
117         if (r < 0)
118                 goto error;
119         for (i = 0; i < 5; ++i) {
120                 r = setflags(cs, TIOCM_RTS, 100);
121                 if (r < 0)
122                         goto error;
123                 r = setflags(cs, 0, 100);
124                 if (r < 0)
125                         goto error;
126         }
127         r = setflags(cs, TIOCM_RTS|TIOCM_DTR, 800);
128         if (r < 0)
129                 goto error;
130
131         return 0;
132
133 error:
134         dev_err(cs->dev, "error %d on setuartbits\n", -r);
135         cs->control_state = TIOCM_RTS|TIOCM_DTR; // FIXME is this a good value?
136         cs->ops->set_modem_ctrl(cs, 0, TIOCM_RTS|TIOCM_DTR);
137
138         return -1; //r
139 }
140
141 static int test_timeout(struct at_state_t *at_state)
142 {
143         if (!at_state->timer_expires)
144                 return 0;
145
146         if (--at_state->timer_expires) {
147                 gig_dbg(DEBUG_MCMD, "decreased timer of %p to %lu",
148                         at_state, at_state->timer_expires);
149                 return 0;
150         }
151
152         if (!gigaset_add_event(at_state->cs, at_state, EV_TIMEOUT, NULL,
153                                at_state->timer_index, NULL)) {
154                 //FIXME what should we do?
155         }
156
157         return 1;
158 }
159
160 static void timer_tick(unsigned long data)
161 {
162         struct cardstate *cs = (struct cardstate *) data;
163         unsigned long flags;
164         unsigned channel;
165         struct at_state_t *at_state;
166         int timeout = 0;
167
168         spin_lock_irqsave(&cs->lock, flags);
169
170         for (channel = 0; channel < cs->channels; ++channel)
171                 if (test_timeout(&cs->bcs[channel].at_state))
172                         timeout = 1;
173
174         if (test_timeout(&cs->at_state))
175                 timeout = 1;
176
177         list_for_each_entry(at_state, &cs->temp_at_states, list)
178                 if (test_timeout(at_state))
179                         timeout = 1;
180
181         if (cs->running) {
182                 mod_timer(&cs->timer, jiffies + msecs_to_jiffies(GIG_TICK));
183                 if (timeout) {
184                         gig_dbg(DEBUG_CMD, "scheduling timeout");
185                         tasklet_schedule(&cs->event_tasklet);
186                 }
187         }
188
189         spin_unlock_irqrestore(&cs->lock, flags);
190 }
191
192 int gigaset_get_channel(struct bc_state *bcs)
193 {
194         unsigned long flags;
195
196         spin_lock_irqsave(&bcs->cs->lock, flags);
197         if (bcs->use_count || !try_module_get(bcs->cs->driver->owner)) {
198                 gig_dbg(DEBUG_ANY, "could not allocate channel %d",
199                         bcs->channel);
200                 spin_unlock_irqrestore(&bcs->cs->lock, flags);
201                 return 0;
202         }
203         ++bcs->use_count;
204         bcs->busy = 1;
205         gig_dbg(DEBUG_ANY, "allocated channel %d", bcs->channel);
206         spin_unlock_irqrestore(&bcs->cs->lock, flags);
207         return 1;
208 }
209
210 struct bc_state *gigaset_get_free_channel(struct cardstate *cs)
211 {
212         unsigned long flags;
213         int i;
214
215         spin_lock_irqsave(&cs->lock, flags);
216         if (!try_module_get(cs->driver->owner)) {
217                 gig_dbg(DEBUG_ANY,
218                         "could not get module for allocating channel");
219                 spin_unlock_irqrestore(&cs->lock, flags);
220                 return NULL;
221         }
222         for (i = 0; i < cs->channels; ++i)
223                 if (!cs->bcs[i].use_count) {
224                         ++cs->bcs[i].use_count;
225                         cs->bcs[i].busy = 1;
226                         spin_unlock_irqrestore(&cs->lock, flags);
227                         gig_dbg(DEBUG_ANY, "allocated channel %d", i);
228                         return cs->bcs + i;
229                 }
230         module_put(cs->driver->owner);
231         spin_unlock_irqrestore(&cs->lock, flags);
232         gig_dbg(DEBUG_ANY, "no free channel");
233         return NULL;
234 }
235
236 void gigaset_free_channel(struct bc_state *bcs)
237 {
238         unsigned long flags;
239
240         spin_lock_irqsave(&bcs->cs->lock, flags);
241         if (!bcs->busy) {
242                 gig_dbg(DEBUG_ANY, "could not free channel %d", bcs->channel);
243                 spin_unlock_irqrestore(&bcs->cs->lock, flags);
244                 return;
245         }
246         --bcs->use_count;
247         bcs->busy = 0;
248         module_put(bcs->cs->driver->owner);
249         gig_dbg(DEBUG_ANY, "freed channel %d", bcs->channel);
250         spin_unlock_irqrestore(&bcs->cs->lock, flags);
251 }
252
253 int gigaset_get_channels(struct cardstate *cs)
254 {
255         unsigned long flags;
256         int i;
257
258         spin_lock_irqsave(&cs->lock, flags);
259         for (i = 0; i < cs->channels; ++i)
260                 if (cs->bcs[i].use_count) {
261                         spin_unlock_irqrestore(&cs->lock, flags);
262                         gig_dbg(DEBUG_ANY, "could not allocate all channels");
263                         return 0;
264                 }
265         for (i = 0; i < cs->channels; ++i)
266                 ++cs->bcs[i].use_count;
267         spin_unlock_irqrestore(&cs->lock, flags);
268
269         gig_dbg(DEBUG_ANY, "allocated all channels");
270
271         return 1;
272 }
273
274 void gigaset_free_channels(struct cardstate *cs)
275 {
276         unsigned long flags;
277         int i;
278
279         gig_dbg(DEBUG_ANY, "unblocking all channels");
280         spin_lock_irqsave(&cs->lock, flags);
281         for (i = 0; i < cs->channels; ++i)
282                 --cs->bcs[i].use_count;
283         spin_unlock_irqrestore(&cs->lock, flags);
284 }
285
286 void gigaset_block_channels(struct cardstate *cs)
287 {
288         unsigned long flags;
289         int i;
290
291         gig_dbg(DEBUG_ANY, "blocking all channels");
292         spin_lock_irqsave(&cs->lock, flags);
293         for (i = 0; i < cs->channels; ++i)
294                 ++cs->bcs[i].use_count;
295         spin_unlock_irqrestore(&cs->lock, flags);
296 }
297
298 static void clear_events(struct cardstate *cs)
299 {
300         struct event_t *ev;
301         unsigned head, tail;
302         unsigned long flags;
303
304         spin_lock_irqsave(&cs->ev_lock, flags);
305
306         head = cs->ev_head;
307         tail = cs->ev_tail;
308
309         while (tail != head) {
310                 ev = cs->events + head;
311                 kfree(ev->ptr);
312                 head = (head + 1) % MAX_EVENTS;
313         }
314
315         cs->ev_head = tail;
316
317         spin_unlock_irqrestore(&cs->ev_lock, flags);
318 }
319
320 /**
321  * gigaset_add_event() - add event to device event queue
322  * @cs:         device descriptor structure.
323  * @at_state:   connection state structure.
324  * @type:       event type.
325  * @ptr:        pointer parameter for event.
326  * @parameter:  integer parameter for event.
327  * @arg:        pointer parameter for event.
328  *
329  * Allocate an event queue entry from the device's event queue, and set it up
330  * with the parameters given.
331  *
332  * Return value: added event
333  */
334 struct event_t *gigaset_add_event(struct cardstate *cs,
335                                   struct at_state_t *at_state, int type,
336                                   void *ptr, int parameter, void *arg)
337 {
338         unsigned long flags;
339         unsigned next, tail;
340         struct event_t *event = NULL;
341
342         spin_lock_irqsave(&cs->ev_lock, flags);
343
344         tail = cs->ev_tail;
345         next = (tail + 1) % MAX_EVENTS;
346         if (unlikely(next == cs->ev_head))
347                 dev_err(cs->dev, "event queue full\n");
348         else {
349                 event = cs->events + tail;
350                 event->type = type;
351                 event->at_state = at_state;
352                 event->cid = -1;
353                 event->ptr = ptr;
354                 event->arg = arg;
355                 event->parameter = parameter;
356                 cs->ev_tail = next;
357         }
358
359         spin_unlock_irqrestore(&cs->ev_lock, flags);
360
361         return event;
362 }
363 EXPORT_SYMBOL_GPL(gigaset_add_event);
364
365 static void free_strings(struct at_state_t *at_state)
366 {
367         int i;
368
369         for (i = 0; i < STR_NUM; ++i) {
370                 kfree(at_state->str_var[i]);
371                 at_state->str_var[i] = NULL;
372         }
373 }
374
375 static void clear_at_state(struct at_state_t *at_state)
376 {
377         free_strings(at_state);
378 }
379
380 static void dealloc_at_states(struct cardstate *cs)
381 {
382         struct at_state_t *cur, *next;
383
384         list_for_each_entry_safe(cur, next, &cs->temp_at_states, list) {
385                 list_del(&cur->list);
386                 free_strings(cur);
387                 kfree(cur);
388         }
389 }
390
391 static void gigaset_freebcs(struct bc_state *bcs)
392 {
393         int i;
394
395         gig_dbg(DEBUG_INIT, "freeing bcs[%d]->hw", bcs->channel);
396         if (!bcs->cs->ops->freebcshw(bcs)) {
397                 gig_dbg(DEBUG_INIT, "failed");
398         }
399
400         gig_dbg(DEBUG_INIT, "clearing bcs[%d]->at_state", bcs->channel);
401         clear_at_state(&bcs->at_state);
402         gig_dbg(DEBUG_INIT, "freeing bcs[%d]->skb", bcs->channel);
403         dev_kfree_skb(bcs->skb);
404         bcs->skb = NULL;
405
406         for (i = 0; i < AT_NUM; ++i) {
407                 kfree(bcs->commands[i]);
408                 bcs->commands[i] = NULL;
409         }
410 }
411
412 static struct cardstate *alloc_cs(struct gigaset_driver *drv)
413 {
414         unsigned long flags;
415         unsigned i;
416         struct cardstate *cs;
417         struct cardstate *ret = NULL;
418
419         spin_lock_irqsave(&drv->lock, flags);
420         if (drv->blocked)
421                 goto exit;
422         for (i = 0; i < drv->minors; ++i) {
423                 cs = drv->cs + i;
424                 if (!(cs->flags & VALID_MINOR)) {
425                         cs->flags = VALID_MINOR;
426                         ret = cs;
427                         break;
428                 }
429         }
430 exit:
431         spin_unlock_irqrestore(&drv->lock, flags);
432         return ret;
433 }
434
435 static void free_cs(struct cardstate *cs)
436 {
437         cs->flags = 0;
438 }
439
440 static void make_valid(struct cardstate *cs, unsigned mask)
441 {
442         unsigned long flags;
443         struct gigaset_driver *drv = cs->driver;
444         spin_lock_irqsave(&drv->lock, flags);
445         cs->flags |= mask;
446         spin_unlock_irqrestore(&drv->lock, flags);
447 }
448
449 static void make_invalid(struct cardstate *cs, unsigned mask)
450 {
451         unsigned long flags;
452         struct gigaset_driver *drv = cs->driver;
453         spin_lock_irqsave(&drv->lock, flags);
454         cs->flags &= ~mask;
455         spin_unlock_irqrestore(&drv->lock, flags);
456 }
457
458 /**
459  * gigaset_freecs() - free all associated ressources of a device
460  * @cs:         device descriptor structure.
461  *
462  * Stops all tasklets and timers, unregisters the device from all
463  * subsystems it was registered to, deallocates the device structure
464  * @cs and all structures referenced from it.
465  * Operations on the device should be stopped before calling this.
466  */
467 void gigaset_freecs(struct cardstate *cs)
468 {
469         int i;
470         unsigned long flags;
471
472         if (!cs)
473                 return;
474
475         mutex_lock(&cs->mutex);
476
477         if (!cs->bcs)
478                 goto f_cs;
479         if (!cs->inbuf)
480                 goto f_bcs;
481
482         spin_lock_irqsave(&cs->lock, flags);
483         cs->running = 0;
484         spin_unlock_irqrestore(&cs->lock, flags); /* event handler and timer are
485                                                      not rescheduled below */
486
487         tasklet_kill(&cs->event_tasklet);
488         del_timer_sync(&cs->timer);
489
490         switch (cs->cs_init) {
491         default:
492                 /* clear B channel structures */
493                 for (i = 0; i < cs->channels; ++i) {
494                         gig_dbg(DEBUG_INIT, "clearing bcs[%d]", i);
495                         gigaset_freebcs(cs->bcs + i);
496                 }
497
498                 /* clear device sysfs */
499                 gigaset_free_dev_sysfs(cs);
500
501                 gigaset_if_free(cs);
502
503                 gig_dbg(DEBUG_INIT, "clearing hw");
504                 cs->ops->freecshw(cs);
505
506                 //FIXME cmdbuf
507
508                 /* fall through */
509         case 2: /* error in initcshw */
510                 /* Deregister from LL */
511                 make_invalid(cs, VALID_ID);
512                 gigaset_isdn_unregister(cs);
513
514                 /* fall through */
515         case 1: /* error when registering to LL */
516                 gig_dbg(DEBUG_INIT, "clearing at_state");
517                 clear_at_state(&cs->at_state);
518                 dealloc_at_states(cs);
519
520                 /* fall through */
521         case 0: /* error in basic setup */
522                 clear_events(cs);
523                 gig_dbg(DEBUG_INIT, "freeing inbuf");
524                 kfree(cs->inbuf);
525         }
526 f_bcs:  gig_dbg(DEBUG_INIT, "freeing bcs[]");
527         kfree(cs->bcs);
528 f_cs:   gig_dbg(DEBUG_INIT, "freeing cs");
529         mutex_unlock(&cs->mutex);
530         free_cs(cs);
531 }
532 EXPORT_SYMBOL_GPL(gigaset_freecs);
533
534 void gigaset_at_init(struct at_state_t *at_state, struct bc_state *bcs,
535                      struct cardstate *cs, int cid)
536 {
537         int i;
538
539         INIT_LIST_HEAD(&at_state->list);
540         at_state->waiting = 0;
541         at_state->getstring = 0;
542         at_state->pending_commands = 0;
543         at_state->timer_expires = 0;
544         at_state->timer_active = 0;
545         at_state->timer_index = 0;
546         at_state->seq_index = 0;
547         at_state->ConState = 0;
548         for (i = 0; i < STR_NUM; ++i)
549                 at_state->str_var[i] = NULL;
550         at_state->int_var[VAR_ZDLE] = 0;
551         at_state->int_var[VAR_ZCTP] = -1;
552         at_state->int_var[VAR_ZSAU] = ZSAU_NULL;
553         at_state->cs = cs;
554         at_state->bcs = bcs;
555         at_state->cid = cid;
556         if (!cid)
557                 at_state->replystruct = cs->tabnocid;
558         else
559                 at_state->replystruct = cs->tabcid;
560 }
561
562
563 static void gigaset_inbuf_init(struct inbuf_t *inbuf, struct cardstate *cs)
564 /* inbuf->read must be allocated before! */
565 {
566         inbuf->head = 0;
567         inbuf->tail = 0;
568         inbuf->cs = cs;
569         inbuf->inputstate = INS_command;
570 }
571
572 /**
573  * gigaset_fill_inbuf() - append received data to input buffer
574  * @inbuf:      buffer structure.
575  * @src:        received data.
576  * @numbytes:   number of bytes received.
577  */
578 int gigaset_fill_inbuf(struct inbuf_t *inbuf, const unsigned char *src,
579                        unsigned numbytes)
580 {
581         unsigned n, head, tail, bytesleft;
582
583         gig_dbg(DEBUG_INTR, "received %u bytes", numbytes);
584
585         if (!numbytes)
586                 return 0;
587
588         bytesleft = numbytes;
589         tail = inbuf->tail;
590         head = inbuf->head;
591         gig_dbg(DEBUG_INTR, "buffer state: %u -> %u", head, tail);
592
593         while (bytesleft) {
594                 if (head > tail)
595                         n = head - 1 - tail;
596                 else if (head == 0)
597                         n = (RBUFSIZE-1) - tail;
598                 else
599                         n = RBUFSIZE - tail;
600                 if (!n) {
601                         dev_err(inbuf->cs->dev,
602                                 "buffer overflow (%u bytes lost)\n",
603                                 bytesleft);
604                         break;
605                 }
606                 if (n > bytesleft)
607                         n = bytesleft;
608                 memcpy(inbuf->data + tail, src, n);
609                 bytesleft -= n;
610                 tail = (tail + n) % RBUFSIZE;
611                 src += n;
612         }
613         gig_dbg(DEBUG_INTR, "setting tail to %u", tail);
614         inbuf->tail = tail;
615         return numbytes != bytesleft;
616 }
617 EXPORT_SYMBOL_GPL(gigaset_fill_inbuf);
618
619 /* Initialize the b-channel structure */
620 static struct bc_state *gigaset_initbcs(struct bc_state *bcs,
621                                         struct cardstate *cs, int channel)
622 {
623         int i;
624
625         bcs->tx_skb = NULL; //FIXME -> hw part
626
627         skb_queue_head_init(&bcs->squeue);
628
629         bcs->corrupted = 0;
630         bcs->trans_down = 0;
631         bcs->trans_up = 0;
632
633         gig_dbg(DEBUG_INIT, "setting up bcs[%d]->at_state", channel);
634         gigaset_at_init(&bcs->at_state, bcs, cs, -1);
635
636 #ifdef CONFIG_GIGASET_DEBUG
637         bcs->emptycount = 0;
638 #endif
639
640         gig_dbg(DEBUG_INIT, "allocating bcs[%d]->skb", channel);
641         bcs->fcs = PPP_INITFCS;
642         bcs->inputstate = 0;
643         if (cs->ignoreframes) {
644                 bcs->skb = NULL;
645         } else {
646                 bcs->skb = dev_alloc_skb(SBUFSIZE + cs->hw_hdr_len);
647                 if (bcs->skb != NULL)
648                         skb_reserve(bcs->skb, cs->hw_hdr_len);
649                 else
650                         pr_err("out of memory\n");
651         }
652
653         bcs->channel = channel;
654         bcs->cs = cs;
655
656         bcs->chstate = 0;
657         bcs->use_count = 1;
658         bcs->busy = 0;
659         bcs->ignore = cs->ignoreframes;
660
661         for (i = 0; i < AT_NUM; ++i)
662                 bcs->commands[i] = NULL;
663
664         gig_dbg(DEBUG_INIT, "  setting up bcs[%d]->hw", channel);
665         if (cs->ops->initbcshw(bcs))
666                 return bcs;
667
668         gig_dbg(DEBUG_INIT, "  failed");
669
670         gig_dbg(DEBUG_INIT, "  freeing bcs[%d]->skb", channel);
671         dev_kfree_skb(bcs->skb);
672         bcs->skb = NULL;
673
674         return NULL;
675 }
676
677 /**
678  * gigaset_initcs() - initialize device structure
679  * @drv:        hardware driver the device belongs to
680  * @channels:   number of B channels supported by device
681  * @onechannel: !=0 if B channel data and AT commands share one
682  *                  communication channel (M10x),
683  *              ==0 if B channels have separate communication channels (base)
684  * @ignoreframes:       number of frames to ignore after setting up B channel
685  * @cidmode:    !=0: start in CallID mode
686  * @modulename: name of driver module for LL registration
687  *
688  * Allocate and initialize cardstate structure for Gigaset driver
689  * Calls hardware dependent gigaset_initcshw() function
690  * Calls B channel initialization function gigaset_initbcs() for each B channel
691  *
692  * Return value:
693  *      pointer to cardstate structure
694  */
695 struct cardstate *gigaset_initcs(struct gigaset_driver *drv, int channels,
696                                  int onechannel, int ignoreframes,
697                                  int cidmode, const char *modulename)
698 {
699         struct cardstate *cs = NULL;
700         unsigned long flags;
701         int i;
702
703         gig_dbg(DEBUG_INIT, "allocating cs");
704         if (!(cs = alloc_cs(drv))) {
705                 pr_err("maximum number of devices exceeded\n");
706                 return NULL;
707         }
708
709         gig_dbg(DEBUG_INIT, "allocating bcs[0..%d]", channels - 1);
710         cs->bcs = kmalloc(channels * sizeof(struct bc_state), GFP_KERNEL);
711         if (!cs->bcs) {
712                 pr_err("out of memory\n");
713                 goto error;
714         }
715         gig_dbg(DEBUG_INIT, "allocating inbuf");
716         cs->inbuf = kmalloc(sizeof(struct inbuf_t), GFP_KERNEL);
717         if (!cs->inbuf) {
718                 pr_err("out of memory\n");
719                 goto error;
720         }
721
722         cs->cs_init = 0;
723         cs->channels = channels;
724         cs->onechannel = onechannel;
725         cs->ignoreframes = ignoreframes;
726         INIT_LIST_HEAD(&cs->temp_at_states);
727         cs->running = 0;
728         init_timer(&cs->timer); /* clear next & prev */
729         spin_lock_init(&cs->ev_lock);
730         cs->ev_tail = 0;
731         cs->ev_head = 0;
732
733         tasklet_init(&cs->event_tasklet, &gigaset_handle_event,
734                      (unsigned long) cs);
735         cs->commands_pending = 0;
736         cs->cur_at_seq = 0;
737         cs->gotfwver = -1;
738         cs->open_count = 0;
739         cs->dev = NULL;
740         cs->tty = NULL;
741         cs->tty_dev = NULL;
742         cs->cidmode = cidmode != 0;
743         cs->tabnocid = gigaset_tab_nocid;
744         cs->tabcid = gigaset_tab_cid;
745
746         init_waitqueue_head(&cs->waitqueue);
747         cs->waiting = 0;
748
749         cs->mode = M_UNKNOWN;
750         cs->mstate = MS_UNINITIALIZED;
751
752         ++cs->cs_init;
753
754         gig_dbg(DEBUG_INIT, "setting up at_state");
755         spin_lock_init(&cs->lock);
756         gigaset_at_init(&cs->at_state, NULL, cs, 0);
757         cs->dle = 0;
758         cs->cbytes = 0;
759
760         gig_dbg(DEBUG_INIT, "setting up inbuf");
761         gigaset_inbuf_init(cs->inbuf, cs);
762
763         cs->connected = 0;
764         cs->isdn_up = 0;
765
766         gig_dbg(DEBUG_INIT, "setting up cmdbuf");
767         cs->cmdbuf = cs->lastcmdbuf = NULL;
768         spin_lock_init(&cs->cmdlock);
769         cs->curlen = 0;
770         cs->cmdbytes = 0;
771
772         gig_dbg(DEBUG_INIT, "setting up iif");
773         if (!gigaset_isdn_register(cs, modulename)) {
774                 pr_err("error registering ISDN device\n");
775                 goto error;
776         }
777
778         make_valid(cs, VALID_ID);
779         ++cs->cs_init;
780         gig_dbg(DEBUG_INIT, "setting up hw");
781         if (!cs->ops->initcshw(cs))
782                 goto error;
783
784         ++cs->cs_init;
785
786         /* set up character device */
787         gigaset_if_init(cs);
788
789         /* set up device sysfs */
790         gigaset_init_dev_sysfs(cs);
791
792         /* set up channel data structures */
793         for (i = 0; i < channels; ++i) {
794                 gig_dbg(DEBUG_INIT, "setting up bcs[%d]", i);
795                 if (!gigaset_initbcs(cs->bcs + i, cs, i)) {
796                         pr_err("could not allocate channel %d data\n", i);
797                         goto error;
798                 }
799         }
800
801         spin_lock_irqsave(&cs->lock, flags);
802         cs->running = 1;
803         spin_unlock_irqrestore(&cs->lock, flags);
804         setup_timer(&cs->timer, timer_tick, (unsigned long) cs);
805         cs->timer.expires = jiffies + msecs_to_jiffies(GIG_TICK);
806         /* FIXME: can jiffies increase too much until the timer is added?
807          * Same problem(?) with mod_timer() in timer_tick(). */
808         add_timer(&cs->timer);
809
810         gig_dbg(DEBUG_INIT, "cs initialized");
811         return cs;
812
813 error:
814         gig_dbg(DEBUG_INIT, "failed");
815         gigaset_freecs(cs);
816         return NULL;
817 }
818 EXPORT_SYMBOL_GPL(gigaset_initcs);
819
820 /* ReInitialize the b-channel structure on hangup */
821 void gigaset_bcs_reinit(struct bc_state *bcs)
822 {
823         struct sk_buff *skb;
824         struct cardstate *cs = bcs->cs;
825         unsigned long flags;
826
827         while ((skb = skb_dequeue(&bcs->squeue)) != NULL)
828                 dev_kfree_skb(skb);
829
830         spin_lock_irqsave(&cs->lock, flags);
831         clear_at_state(&bcs->at_state);
832         bcs->at_state.ConState = 0;
833         bcs->at_state.timer_active = 0;
834         bcs->at_state.timer_expires = 0;
835         bcs->at_state.cid = -1;                 /* No CID defined */
836         spin_unlock_irqrestore(&cs->lock, flags);
837
838         bcs->inputstate = 0;
839
840 #ifdef CONFIG_GIGASET_DEBUG
841         bcs->emptycount = 0;
842 #endif
843
844         bcs->fcs = PPP_INITFCS;
845         bcs->chstate = 0;
846
847         bcs->ignore = cs->ignoreframes;
848         if (bcs->ignore) {
849                 dev_kfree_skb(bcs->skb);
850                 bcs->skb = NULL;
851         }
852
853         cs->ops->reinitbcshw(bcs);
854 }
855
856 static void cleanup_cs(struct cardstate *cs)
857 {
858         struct cmdbuf_t *cb, *tcb;
859         int i;
860         unsigned long flags;
861
862         spin_lock_irqsave(&cs->lock, flags);
863
864         cs->mode = M_UNKNOWN;
865         cs->mstate = MS_UNINITIALIZED;
866
867         clear_at_state(&cs->at_state);
868         dealloc_at_states(cs);
869         free_strings(&cs->at_state);
870         gigaset_at_init(&cs->at_state, NULL, cs, 0);
871
872         cs->inbuf->inputstate = INS_command;
873         cs->inbuf->head = 0;
874         cs->inbuf->tail = 0;
875
876         cb = cs->cmdbuf;
877         while (cb) {
878                 tcb = cb;
879                 cb = cb->next;
880                 kfree(tcb);
881         }
882         cs->cmdbuf = cs->lastcmdbuf = NULL;
883         cs->curlen = 0;
884         cs->cmdbytes = 0;
885         cs->gotfwver = -1;
886         cs->dle = 0;
887         cs->cur_at_seq = 0;
888         cs->commands_pending = 0;
889         cs->cbytes = 0;
890
891         spin_unlock_irqrestore(&cs->lock, flags);
892
893         for (i = 0; i < cs->channels; ++i) {
894                 gigaset_freebcs(cs->bcs + i);
895                 if (!gigaset_initbcs(cs->bcs + i, cs, i))
896                         pr_err("could not allocate channel %d data\n", i);
897         }
898
899         if (cs->waiting) {
900                 cs->cmd_result = -ENODEV;
901                 cs->waiting = 0;
902                 wake_up_interruptible(&cs->waitqueue);
903         }
904 }
905
906
907 /**
908  * gigaset_start() - start device operations
909  * @cs:         device descriptor structure.
910  *
911  * Prepares the device for use by setting up communication parameters,
912  * scheduling an EV_START event to initiate device initialization, and
913  * waiting for completion of the initialization.
914  *
915  * Return value:
916  *      1 - success, 0 - error
917  */
918 int gigaset_start(struct cardstate *cs)
919 {
920         unsigned long flags;
921
922         if (mutex_lock_interruptible(&cs->mutex))
923                 return 0;
924
925         spin_lock_irqsave(&cs->lock, flags);
926         cs->connected = 1;
927         spin_unlock_irqrestore(&cs->lock, flags);
928
929         if (cs->mstate != MS_LOCKED) {
930                 cs->ops->set_modem_ctrl(cs, 0, TIOCM_DTR|TIOCM_RTS);
931                 cs->ops->baud_rate(cs, B115200);
932                 cs->ops->set_line_ctrl(cs, CS8);
933                 cs->control_state = TIOCM_DTR|TIOCM_RTS;
934         } else {
935                 //FIXME use some saved values?
936         }
937
938         cs->waiting = 1;
939
940         if (!gigaset_add_event(cs, &cs->at_state, EV_START, NULL, 0, NULL)) {
941                 cs->waiting = 0;
942                 //FIXME what should we do?
943                 goto error;
944         }
945
946         gig_dbg(DEBUG_CMD, "scheduling START");
947         gigaset_schedule_event(cs);
948
949         wait_event(cs->waitqueue, !cs->waiting);
950
951         mutex_unlock(&cs->mutex);
952         return 1;
953
954 error:
955         mutex_unlock(&cs->mutex);
956         return 0;
957 }
958 EXPORT_SYMBOL_GPL(gigaset_start);
959
960 /**
961  * gigaset_shutdown() - shut down device operations
962  * @cs:         device descriptor structure.
963  *
964  * Deactivates the device by scheduling an EV_SHUTDOWN event and
965  * waiting for completion of the shutdown.
966  *
967  * Return value:
968  *      0 - success, -1 - error (no device associated)
969  */
970 int gigaset_shutdown(struct cardstate *cs)
971 {
972         mutex_lock(&cs->mutex);
973
974         if (!(cs->flags & VALID_MINOR)) {
975                 mutex_unlock(&cs->mutex);
976                 return -1;
977         }
978
979         cs->waiting = 1;
980
981         if (!gigaset_add_event(cs, &cs->at_state, EV_SHUTDOWN, NULL, 0, NULL)) {
982                 //FIXME what should we do?
983                 goto exit;
984         }
985
986         gig_dbg(DEBUG_CMD, "scheduling SHUTDOWN");
987         gigaset_schedule_event(cs);
988
989         wait_event(cs->waitqueue, !cs->waiting);
990
991         cleanup_cs(cs);
992
993 exit:
994         mutex_unlock(&cs->mutex);
995         return 0;
996 }
997 EXPORT_SYMBOL_GPL(gigaset_shutdown);
998
999 /**
1000  * gigaset_stop() - stop device operations
1001  * @cs:         device descriptor structure.
1002  *
1003  * Stops operations on the device by scheduling an EV_STOP event and
1004  * waiting for completion of the shutdown.
1005  */
1006 void gigaset_stop(struct cardstate *cs)
1007 {
1008         mutex_lock(&cs->mutex);
1009
1010         cs->waiting = 1;
1011
1012         if (!gigaset_add_event(cs, &cs->at_state, EV_STOP, NULL, 0, NULL)) {
1013                 //FIXME what should we do?
1014                 goto exit;
1015         }
1016
1017         gig_dbg(DEBUG_CMD, "scheduling STOP");
1018         gigaset_schedule_event(cs);
1019
1020         wait_event(cs->waitqueue, !cs->waiting);
1021
1022         cleanup_cs(cs);
1023
1024 exit:
1025         mutex_unlock(&cs->mutex);
1026 }
1027 EXPORT_SYMBOL_GPL(gigaset_stop);
1028
1029 static LIST_HEAD(drivers);
1030 static DEFINE_SPINLOCK(driver_lock);
1031
1032 struct cardstate *gigaset_get_cs_by_id(int id)
1033 {
1034         unsigned long flags;
1035         struct cardstate *ret = NULL;
1036         struct cardstate *cs;
1037         struct gigaset_driver *drv;
1038         unsigned i;
1039
1040         spin_lock_irqsave(&driver_lock, flags);
1041         list_for_each_entry(drv, &drivers, list) {
1042                 spin_lock(&drv->lock);
1043                 for (i = 0; i < drv->minors; ++i) {
1044                         cs = drv->cs + i;
1045                         if ((cs->flags & VALID_ID) && cs->myid == id) {
1046                                 ret = cs;
1047                                 break;
1048                         }
1049                 }
1050                 spin_unlock(&drv->lock);
1051                 if (ret)
1052                         break;
1053         }
1054         spin_unlock_irqrestore(&driver_lock, flags);
1055         return ret;
1056 }
1057
1058 void gigaset_debugdrivers(void)
1059 {
1060         unsigned long flags;
1061         static struct cardstate *cs;
1062         struct gigaset_driver *drv;
1063         unsigned i;
1064
1065         spin_lock_irqsave(&driver_lock, flags);
1066         list_for_each_entry(drv, &drivers, list) {
1067                 gig_dbg(DEBUG_DRIVER, "driver %p", drv);
1068                 spin_lock(&drv->lock);
1069                 for (i = 0; i < drv->minors; ++i) {
1070                         gig_dbg(DEBUG_DRIVER, "  index %u", i);
1071                         cs = drv->cs + i;
1072                         gig_dbg(DEBUG_DRIVER, "    cardstate %p", cs);
1073                         gig_dbg(DEBUG_DRIVER, "    flags 0x%02x", cs->flags);
1074                         gig_dbg(DEBUG_DRIVER, "    minor_index %u",
1075                                 cs->minor_index);
1076                         gig_dbg(DEBUG_DRIVER, "    driver %p", cs->driver);
1077                         gig_dbg(DEBUG_DRIVER, "    i4l id %d", cs->myid);
1078                 }
1079                 spin_unlock(&drv->lock);
1080         }
1081         spin_unlock_irqrestore(&driver_lock, flags);
1082 }
1083
1084 static struct cardstate *gigaset_get_cs_by_minor(unsigned minor)
1085 {
1086         unsigned long flags;
1087         struct cardstate *ret = NULL;
1088         struct gigaset_driver *drv;
1089         unsigned index;
1090
1091         spin_lock_irqsave(&driver_lock, flags);
1092         list_for_each_entry(drv, &drivers, list) {
1093                 if (minor < drv->minor || minor >= drv->minor + drv->minors)
1094                         continue;
1095                 index = minor - drv->minor;
1096                 spin_lock(&drv->lock);
1097                 if (drv->cs[index].flags & VALID_MINOR)
1098                         ret = drv->cs + index;
1099                 spin_unlock(&drv->lock);
1100                 if (ret)
1101                         break;
1102         }
1103         spin_unlock_irqrestore(&driver_lock, flags);
1104         return ret;
1105 }
1106
1107 struct cardstate *gigaset_get_cs_by_tty(struct tty_struct *tty)
1108 {
1109         if (tty->index < 0 || tty->index >= tty->driver->num)
1110                 return NULL;
1111         return gigaset_get_cs_by_minor(tty->index + tty->driver->minor_start);
1112 }
1113
1114 /**
1115  * gigaset_freedriver() - free all associated ressources of a driver
1116  * @drv:        driver descriptor structure.
1117  *
1118  * Unregisters the driver from the system and deallocates the driver
1119  * structure @drv and all structures referenced from it.
1120  * All devices should be shut down before calling this.
1121  */
1122 void gigaset_freedriver(struct gigaset_driver *drv)
1123 {
1124         unsigned long flags;
1125
1126         spin_lock_irqsave(&driver_lock, flags);
1127         list_del(&drv->list);
1128         spin_unlock_irqrestore(&driver_lock, flags);
1129
1130         gigaset_if_freedriver(drv);
1131
1132         kfree(drv->cs);
1133         kfree(drv);
1134 }
1135 EXPORT_SYMBOL_GPL(gigaset_freedriver);
1136
1137 /**
1138  * gigaset_initdriver() - initialize driver structure
1139  * @minor:      First minor number
1140  * @minors:     Number of minors this driver can handle
1141  * @procname:   Name of the driver
1142  * @devname:    Name of the device files (prefix without minor number)
1143  *
1144  * Allocate and initialize gigaset_driver structure. Initialize interface.
1145  *
1146  * Return value:
1147  *      Pointer to the gigaset_driver structure on success, NULL on failure.
1148  */
1149 struct gigaset_driver *gigaset_initdriver(unsigned minor, unsigned minors,
1150                                           const char *procname,
1151                                           const char *devname,
1152                                           const struct gigaset_ops *ops,
1153                                           struct module *owner)
1154 {
1155         struct gigaset_driver *drv;
1156         unsigned long flags;
1157         unsigned i;
1158
1159         drv = kmalloc(sizeof *drv, GFP_KERNEL);
1160         if (!drv)
1161                 return NULL;
1162
1163         drv->have_tty = 0;
1164         drv->minor = minor;
1165         drv->minors = minors;
1166         spin_lock_init(&drv->lock);
1167         drv->blocked = 0;
1168         drv->ops = ops;
1169         drv->owner = owner;
1170         INIT_LIST_HEAD(&drv->list);
1171
1172         drv->cs = kmalloc(minors * sizeof *drv->cs, GFP_KERNEL);
1173         if (!drv->cs)
1174                 goto error;
1175
1176         for (i = 0; i < minors; ++i) {
1177                 drv->cs[i].flags = 0;
1178                 drv->cs[i].driver = drv;
1179                 drv->cs[i].ops = drv->ops;
1180                 drv->cs[i].minor_index = i;
1181                 mutex_init(&drv->cs[i].mutex);
1182         }
1183
1184         gigaset_if_initdriver(drv, procname, devname);
1185
1186         spin_lock_irqsave(&driver_lock, flags);
1187         list_add(&drv->list, &drivers);
1188         spin_unlock_irqrestore(&driver_lock, flags);
1189
1190         return drv;
1191
1192 error:
1193         kfree(drv->cs);
1194         kfree(drv);
1195         return NULL;
1196 }
1197 EXPORT_SYMBOL_GPL(gigaset_initdriver);
1198
1199 /**
1200  * gigaset_blockdriver() - block driver
1201  * @drv:        driver descriptor structure.
1202  *
1203  * Prevents the driver from attaching new devices, in preparation for
1204  * deregistration.
1205  */
1206 void gigaset_blockdriver(struct gigaset_driver *drv)
1207 {
1208         drv->blocked = 1;
1209 }
1210 EXPORT_SYMBOL_GPL(gigaset_blockdriver);
1211
1212 static int __init gigaset_init_module(void)
1213 {
1214         /* in accordance with the principle of least astonishment,
1215          * setting the 'debug' parameter to 1 activates a sensible
1216          * set of default debug levels
1217          */
1218         if (gigaset_debuglevel == 1)
1219                 gigaset_debuglevel = DEBUG_DEFAULT;
1220
1221         pr_info(DRIVER_DESC DRIVER_DESC_DEBUG "\n");
1222         return 0;
1223 }
1224
1225 static void __exit gigaset_exit_module(void)
1226 {
1227 }
1228
1229 module_init(gigaset_init_module);
1230 module_exit(gigaset_exit_module);
1231
1232 MODULE_AUTHOR(DRIVER_AUTHOR);
1233 MODULE_DESCRIPTION(DRIVER_DESC);
1234
1235 MODULE_LICENSE("GPL");