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 	cs->commands_pending = 0;
724 	cs->cur_at_seq = 0;
725 	cs->gotfwver = -1;
726 	cs->open_count = 0;
727 	cs->dev = NULL;
728 	cs->tty = NULL;
729 	cs->tty_dev = NULL;
730 	cs->cidmode = cidmode != 0;
731 	cs->tabnocid = gigaset_tab_nocid;
732 	cs->tabcid = gigaset_tab_cid;
733 
734 	init_waitqueue_head(&cs->waitqueue);
735 	cs->waiting = 0;
736 
737 	cs->mode = M_UNKNOWN;
738 	cs->mstate = MS_UNINITIALIZED;
739 
740 	++cs->cs_init;
741 
742 	gig_dbg(DEBUG_INIT, "setting up at_state");
743 	spin_lock_init(&cs->lock);
744 	gigaset_at_init(&cs->at_state, NULL, cs, 0);
745 	cs->dle = 0;
746 	cs->cbytes = 0;
747 
748 	gig_dbg(DEBUG_INIT, "setting up inbuf");
749 	gigaset_inbuf_init(cs->inbuf, cs);
750 
751 	cs->connected = 0;
752 	cs->isdn_up = 0;
753 
754 	gig_dbg(DEBUG_INIT, "setting up cmdbuf");
755 	cs->cmdbuf = cs->lastcmdbuf = NULL;
756 	spin_lock_init(&cs->cmdlock);
757 	cs->curlen = 0;
758 	cs->cmdbytes = 0;
759 
760 	gig_dbg(DEBUG_INIT, "setting up iif");
761 	if (!gigaset_isdn_regdev(cs, modulename)) {
762 		pr_err("error registering ISDN device\n");
763 		goto error;
764 	}
765 
766 	make_valid(cs, VALID_ID);
767 	++cs->cs_init;
768 	gig_dbg(DEBUG_INIT, "setting up hw");
769 	if (!cs->ops->initcshw(cs))
770 		goto error;
771 
772 	++cs->cs_init;
773 
774 	/* set up character device */
775 	gigaset_if_init(cs);
776 
777 	/* set up device sysfs */
778 	gigaset_init_dev_sysfs(cs);
779 
780 	/* set up channel data structures */
781 	for (i = 0; i < channels; ++i) {
782 		gig_dbg(DEBUG_INIT, "setting up bcs[%d]", i);
783 		if (!gigaset_initbcs(cs->bcs + i, cs, i)) {
784 			pr_err("could not allocate channel %d data\n", i);
785 			goto error;
786 		}
787 	}
788 
789 	spin_lock_irqsave(&cs->lock, flags);
790 	cs->running = 1;
791 	spin_unlock_irqrestore(&cs->lock, flags);
792 	setup_timer(&cs->timer, timer_tick, (unsigned long) cs);
793 	cs->timer.expires = jiffies + msecs_to_jiffies(GIG_TICK);
794 	add_timer(&cs->timer);
795 
796 	gig_dbg(DEBUG_INIT, "cs initialized");
797 	return cs;
798 
799 error:
800 	gig_dbg(DEBUG_INIT, "failed");
801 	gigaset_freecs(cs);
802 	return NULL;
803 }
804 EXPORT_SYMBOL_GPL(gigaset_initcs);
805 
806 /* ReInitialize the b-channel structure on hangup */
gigaset_bcs_reinit(struct bc_state * bcs)807 void gigaset_bcs_reinit(struct bc_state *bcs)
808 {
809 	struct sk_buff *skb;
810 	struct cardstate *cs = bcs->cs;
811 	unsigned long flags;
812 
813 	while ((skb = skb_dequeue(&bcs->squeue)) != NULL)
814 		dev_kfree_skb(skb);
815 
816 	spin_lock_irqsave(&cs->lock, flags);
817 	clear_at_state(&bcs->at_state);
818 	bcs->at_state.ConState = 0;
819 	bcs->at_state.timer_active = 0;
820 	bcs->at_state.timer_expires = 0;
821 	bcs->at_state.cid = -1;			/* No CID defined */
822 	spin_unlock_irqrestore(&cs->lock, flags);
823 
824 	bcs->inputstate = 0;
825 
826 #ifdef CONFIG_GIGASET_DEBUG
827 	bcs->emptycount = 0;
828 #endif
829 
830 	bcs->rx_fcs = PPP_INITFCS;
831 	bcs->chstate = 0;
832 
833 	bcs->ignore = cs->ignoreframes;
834 	dev_kfree_skb(bcs->rx_skb);
835 	bcs->rx_skb = NULL;
836 
837 	cs->ops->reinitbcshw(bcs);
838 }
839 
cleanup_cs(struct cardstate * cs)840 static void cleanup_cs(struct cardstate *cs)
841 {
842 	struct cmdbuf_t *cb, *tcb;
843 	int i;
844 	unsigned long flags;
845 
846 	spin_lock_irqsave(&cs->lock, flags);
847 
848 	cs->mode = M_UNKNOWN;
849 	cs->mstate = MS_UNINITIALIZED;
850 
851 	clear_at_state(&cs->at_state);
852 	dealloc_at_states(cs);
853 	free_strings(&cs->at_state);
854 	gigaset_at_init(&cs->at_state, NULL, cs, 0);
855 
856 	cs->inbuf->inputstate = INS_command;
857 	cs->inbuf->head = 0;
858 	cs->inbuf->tail = 0;
859 
860 	cb = cs->cmdbuf;
861 	while (cb) {
862 		tcb = cb;
863 		cb = cb->next;
864 		kfree(tcb);
865 	}
866 	cs->cmdbuf = cs->lastcmdbuf = NULL;
867 	cs->curlen = 0;
868 	cs->cmdbytes = 0;
869 	cs->gotfwver = -1;
870 	cs->dle = 0;
871 	cs->cur_at_seq = 0;
872 	cs->commands_pending = 0;
873 	cs->cbytes = 0;
874 
875 	spin_unlock_irqrestore(&cs->lock, flags);
876 
877 	for (i = 0; i < cs->channels; ++i) {
878 		gigaset_freebcs(cs->bcs + i);
879 		if (!gigaset_initbcs(cs->bcs + i, cs, i))
880 			pr_err("could not allocate channel %d data\n", i);
881 	}
882 
883 	if (cs->waiting) {
884 		cs->cmd_result = -ENODEV;
885 		cs->waiting = 0;
886 		wake_up_interruptible(&cs->waitqueue);
887 	}
888 }
889 
890 
891 /**
892  * gigaset_start() - start device operations
893  * @cs:		device descriptor structure.
894  *
895  * Prepares the device for use by setting up communication parameters,
896  * scheduling an EV_START event to initiate device initialization, and
897  * waiting for completion of the initialization.
898  *
899  * Return value:
900  *	1 - success, 0 - error
901  */
gigaset_start(struct cardstate * cs)902 int gigaset_start(struct cardstate *cs)
903 {
904 	unsigned long flags;
905 
906 	if (mutex_lock_interruptible(&cs->mutex))
907 		return 0;
908 
909 	spin_lock_irqsave(&cs->lock, flags);
910 	cs->connected = 1;
911 	spin_unlock_irqrestore(&cs->lock, flags);
912 
913 	if (cs->mstate != MS_LOCKED) {
914 		cs->ops->set_modem_ctrl(cs, 0, TIOCM_DTR|TIOCM_RTS);
915 		cs->ops->baud_rate(cs, B115200);
916 		cs->ops->set_line_ctrl(cs, CS8);
917 		cs->control_state = TIOCM_DTR|TIOCM_RTS;
918 	}
919 
920 	cs->waiting = 1;
921 
922 	if (!gigaset_add_event(cs, &cs->at_state, EV_START, NULL, 0, NULL)) {
923 		cs->waiting = 0;
924 		goto error;
925 	}
926 	gigaset_schedule_event(cs);
927 
928 	wait_event(cs->waitqueue, !cs->waiting);
929 
930 	mutex_unlock(&cs->mutex);
931 	return 1;
932 
933 error:
934 	mutex_unlock(&cs->mutex);
935 	return 0;
936 }
937 EXPORT_SYMBOL_GPL(gigaset_start);
938 
939 /**
940  * gigaset_shutdown() - shut down device operations
941  * @cs:		device descriptor structure.
942  *
943  * Deactivates the device by scheduling an EV_SHUTDOWN event and
944  * waiting for completion of the shutdown.
945  *
946  * Return value:
947  *	0 - success, -1 - error (no device associated)
948  */
gigaset_shutdown(struct cardstate * cs)949 int gigaset_shutdown(struct cardstate *cs)
950 {
951 	mutex_lock(&cs->mutex);
952 
953 	if (!(cs->flags & VALID_MINOR)) {
954 		mutex_unlock(&cs->mutex);
955 		return -1;
956 	}
957 
958 	cs->waiting = 1;
959 
960 	if (!gigaset_add_event(cs, &cs->at_state, EV_SHUTDOWN, NULL, 0, NULL))
961 		goto exit;
962 	gigaset_schedule_event(cs);
963 
964 	wait_event(cs->waitqueue, !cs->waiting);
965 
966 	cleanup_cs(cs);
967 
968 exit:
969 	mutex_unlock(&cs->mutex);
970 	return 0;
971 }
972 EXPORT_SYMBOL_GPL(gigaset_shutdown);
973 
974 /**
975  * gigaset_stop() - stop device operations
976  * @cs:		device descriptor structure.
977  *
978  * Stops operations on the device by scheduling an EV_STOP event and
979  * waiting for completion of the shutdown.
980  */
gigaset_stop(struct cardstate * cs)981 void gigaset_stop(struct cardstate *cs)
982 {
983 	mutex_lock(&cs->mutex);
984 
985 	cs->waiting = 1;
986 
987 	if (!gigaset_add_event(cs, &cs->at_state, EV_STOP, NULL, 0, NULL))
988 		goto exit;
989 	gigaset_schedule_event(cs);
990 
991 	wait_event(cs->waitqueue, !cs->waiting);
992 
993 	cleanup_cs(cs);
994 
995 exit:
996 	mutex_unlock(&cs->mutex);
997 }
998 EXPORT_SYMBOL_GPL(gigaset_stop);
999 
1000 static LIST_HEAD(drivers);
1001 static DEFINE_SPINLOCK(driver_lock);
1002 
gigaset_get_cs_by_id(int id)1003 struct cardstate *gigaset_get_cs_by_id(int id)
1004 {
1005 	unsigned long flags;
1006 	struct cardstate *ret = NULL;
1007 	struct cardstate *cs;
1008 	struct gigaset_driver *drv;
1009 	unsigned i;
1010 
1011 	spin_lock_irqsave(&driver_lock, flags);
1012 	list_for_each_entry(drv, &drivers, list) {
1013 		spin_lock(&drv->lock);
1014 		for (i = 0; i < drv->minors; ++i) {
1015 			cs = drv->cs + i;
1016 			if ((cs->flags & VALID_ID) && cs->myid == id) {
1017 				ret = cs;
1018 				break;
1019 			}
1020 		}
1021 		spin_unlock(&drv->lock);
1022 		if (ret)
1023 			break;
1024 	}
1025 	spin_unlock_irqrestore(&driver_lock, flags);
1026 	return ret;
1027 }
1028 
gigaset_get_cs_by_minor(unsigned minor)1029 static struct cardstate *gigaset_get_cs_by_minor(unsigned minor)
1030 {
1031 	unsigned long flags;
1032 	struct cardstate *ret = NULL;
1033 	struct gigaset_driver *drv;
1034 	unsigned index;
1035 
1036 	spin_lock_irqsave(&driver_lock, flags);
1037 	list_for_each_entry(drv, &drivers, list) {
1038 		if (minor < drv->minor || minor >= drv->minor + drv->minors)
1039 			continue;
1040 		index = minor - drv->minor;
1041 		spin_lock(&drv->lock);
1042 		if (drv->cs[index].flags & VALID_MINOR)
1043 			ret = drv->cs + index;
1044 		spin_unlock(&drv->lock);
1045 		if (ret)
1046 			break;
1047 	}
1048 	spin_unlock_irqrestore(&driver_lock, flags);
1049 	return ret;
1050 }
1051 
gigaset_get_cs_by_tty(struct tty_struct * tty)1052 struct cardstate *gigaset_get_cs_by_tty(struct tty_struct *tty)
1053 {
1054 	if (tty->index < 0 || tty->index >= tty->driver->num)
1055 		return NULL;
1056 	return gigaset_get_cs_by_minor(tty->index + tty->driver->minor_start);
1057 }
1058 
1059 /**
1060  * gigaset_freedriver() - free all associated ressources of a driver
1061  * @drv:	driver descriptor structure.
1062  *
1063  * Unregisters the driver from the system and deallocates the driver
1064  * structure @drv and all structures referenced from it.
1065  * All devices should be shut down before calling this.
1066  */
gigaset_freedriver(struct gigaset_driver * drv)1067 void gigaset_freedriver(struct gigaset_driver *drv)
1068 {
1069 	unsigned long flags;
1070 
1071 	spin_lock_irqsave(&driver_lock, flags);
1072 	list_del(&drv->list);
1073 	spin_unlock_irqrestore(&driver_lock, flags);
1074 
1075 	gigaset_if_freedriver(drv);
1076 
1077 	kfree(drv->cs);
1078 	kfree(drv);
1079 }
1080 EXPORT_SYMBOL_GPL(gigaset_freedriver);
1081 
1082 /**
1083  * gigaset_initdriver() - initialize driver structure
1084  * @minor:	First minor number
1085  * @minors:	Number of minors this driver can handle
1086  * @procname:	Name of the driver
1087  * @devname:	Name of the device files (prefix without minor number)
1088  *
1089  * Allocate and initialize gigaset_driver structure. Initialize interface.
1090  *
1091  * Return value:
1092  *	Pointer to the gigaset_driver structure on success, NULL on failure.
1093  */
gigaset_initdriver(unsigned minor,unsigned minors,const char * procname,const char * devname,const struct gigaset_ops * ops,struct module * owner)1094 struct gigaset_driver *gigaset_initdriver(unsigned minor, unsigned minors,
1095 					  const char *procname,
1096 					  const char *devname,
1097 					  const struct gigaset_ops *ops,
1098 					  struct module *owner)
1099 {
1100 	struct gigaset_driver *drv;
1101 	unsigned long flags;
1102 	unsigned i;
1103 
1104 	drv = kmalloc(sizeof *drv, GFP_KERNEL);
1105 	if (!drv)
1106 		return NULL;
1107 
1108 	drv->have_tty = 0;
1109 	drv->minor = minor;
1110 	drv->minors = minors;
1111 	spin_lock_init(&drv->lock);
1112 	drv->blocked = 0;
1113 	drv->ops = ops;
1114 	drv->owner = owner;
1115 	INIT_LIST_HEAD(&drv->list);
1116 
1117 	drv->cs = kmalloc(minors * sizeof *drv->cs, GFP_KERNEL);
1118 	if (!drv->cs)
1119 		goto error;
1120 
1121 	for (i = 0; i < minors; ++i) {
1122 		drv->cs[i].flags = 0;
1123 		drv->cs[i].driver = drv;
1124 		drv->cs[i].ops = drv->ops;
1125 		drv->cs[i].minor_index = i;
1126 		mutex_init(&drv->cs[i].mutex);
1127 	}
1128 
1129 	gigaset_if_initdriver(drv, procname, devname);
1130 
1131 	spin_lock_irqsave(&driver_lock, flags);
1132 	list_add(&drv->list, &drivers);
1133 	spin_unlock_irqrestore(&driver_lock, flags);
1134 
1135 	return drv;
1136 
1137 error:
1138 	kfree(drv->cs);
1139 	kfree(drv);
1140 	return NULL;
1141 }
1142 EXPORT_SYMBOL_GPL(gigaset_initdriver);
1143 
1144 /**
1145  * gigaset_blockdriver() - block driver
1146  * @drv:	driver descriptor structure.
1147  *
1148  * Prevents the driver from attaching new devices, in preparation for
1149  * deregistration.
1150  */
gigaset_blockdriver(struct gigaset_driver * drv)1151 void gigaset_blockdriver(struct gigaset_driver *drv)
1152 {
1153 	drv->blocked = 1;
1154 }
1155 EXPORT_SYMBOL_GPL(gigaset_blockdriver);
1156 
gigaset_init_module(void)1157 static int __init gigaset_init_module(void)
1158 {
1159 	/* in accordance with the principle of least astonishment,
1160 	 * setting the 'debug' parameter to 1 activates a sensible
1161 	 * set of default debug levels
1162 	 */
1163 	if (gigaset_debuglevel == 1)
1164 		gigaset_debuglevel = DEBUG_DEFAULT;
1165 
1166 	pr_info(DRIVER_DESC DRIVER_DESC_DEBUG "\n");
1167 	gigaset_isdn_regdrv();
1168 	return 0;
1169 }
1170 
gigaset_exit_module(void)1171 static void __exit gigaset_exit_module(void)
1172 {
1173 	gigaset_isdn_unregdrv();
1174 }
1175 
1176 module_init(gigaset_init_module);
1177 module_exit(gigaset_exit_module);
1178 
1179 MODULE_AUTHOR(DRIVER_AUTHOR);
1180 MODULE_DESCRIPTION(DRIVER_DESC);
1181 
1182 MODULE_LICENSE("GPL");
1183