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